From e0e6ed971cbd344bb592973ee166334cda03ae57 Mon Sep 17 00:00:00 2001
From: Sebastien Masson <sebastien.masson@locean.ipsl.fr>
Date: Tue, 26 Jul 2022 08:12:51 +0000
Subject: [PATCH] Resolve "summer 2022 work- LBC halo cleanup"

---
 src/ICE/icectl.F90                        |   4 +-
 src/NST/agrif_oce_interp.F90              | 116 ++---
 src/NST/agrif_oce_sponge.F90              |  56 +--
 src/NST/agrif_oce_update.F90              |   4 +-
 src/NST/agrif_user.F90                    |  12 +-
 src/OCE/BDY/bdyini.F90                    |  34 +-
 src/OCE/DIA/diadct.F90                    |   6 +-
 src/OCE/DOM/dom_oce.F90                   | 116 +++--
 src/OCE/DOM/domvvl.F90                    |   4 +-
 src/OCE/DOM/domzgr.F90                    |   8 +-
 src/OCE/DOM/dtatsd.F90                    |  14 +-
 src/OCE/DYN/sshwzv.F90                    |  16 +-
 src/OCE/FLO/floblk.F90                    |   8 +-
 src/OCE/FLO/flodom.F90                    |   4 +-
 src/OCE/FLO/florst.F90                    |   8 +-
 src/OCE/FLO/flowri.F90                    |   4 +-
 src/OCE/ICB/icbclv.F90                    |   4 +-
 src/OCE/ICB/icbdyn.F90                    |   8 +-
 src/OCE/ICB/icbini.F90                    |  10 +-
 src/OCE/ICB/icblbc.F90                    |  34 +-
 src/OCE/ICB/icbrst.F90                    |  24 +-
 src/OCE/ICB/icbthm.F90                    |   4 +-
 src/OCE/ICB/icbutl.F90                    |  28 +-
 src/OCE/IOM/iom.F90                       |  20 +-
 src/OCE/IOM/iom_nf90.F90                  |  20 +-
 src/OCE/IOM/prtctl.F90                    |  10 +-
 src/OCE/ISF/isfcpl.F90                    |   7 +-
 src/OCE/LBC/lbc_lnk_call_generic.h90      |  11 +-
 src/OCE/LBC/lbc_lnk_neicoll_generic.h90   | 412 ++++++++++--------
 src/OCE/LBC/lbc_lnk_pt2pt_generic.h90     | 378 +++++++++--------
 src/OCE/LBC/lbc_nfd_generic.h90           | 375 ++++++++---------
 src/OCE/LBC/lbclnk.F90                    |  14 +-
 src/OCE/LBC/lbcnfd.F90                    |  17 +-
 src/OCE/LBC/lib_mpp.F90                   |  15 +-
 src/OCE/LBC/mpp_lbc_north_icb_generic.h90 |   2 +-
 src/OCE/LBC/mpp_lnk_icb_generic.h90       |   2 +-
 src/OCE/LBC/mpp_loc_generic.h90           |  24 +-
 src/OCE/LBC/mpp_nfd_generic.h90           | 491 ++++++++++------------
 src/OCE/LBC/mppini.F90                    | 197 ++++++---
 src/OCE/OBS/mpp_map.F90                   |   6 +-
 src/OCE/OBS/obs_grd_bruteforce.h90        |   6 +-
 src/OCE/OBS/obs_grid.F90                  |   6 +-
 src/OCE/OBS/obs_inter_sup.F90             |   4 +-
 src/OCE/OBS/obs_write.F90                 |   8 +-
 src/OCE/SBC/cpl_oasis3.F90                |  10 +-
 src/OCE/SBC/sbccpl.F90                    |   2 +-
 src/OCE/USR/usrdef_fmask.F90              |  28 +-
 src/OCE/USR/usrdef_hgr.F90                |   4 +-
 src/OCE/lib_fortran.F90                   |  64 +--
 src/OCE/stpctl.F90                        |   2 +-
 src/SAS/stpctl.F90                        |   2 +-
 src/SWE/stpctl.F90                        |   2 +-
 src/TOP/TRP/trcdmp.F90                    |   8 +-
 tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90    |   8 +-
 tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90    |   7 +-
 tests/BENCH/MY_SRC/usrdef_hgr.F90         |   6 +-
 tests/BENCH/MY_SRC/usrdef_istate.F90      |   4 +-
 tests/BENCH/MY_SRC/usrdef_sbc.F90         |   2 +-
 tests/BENCH/MY_SRC/usrdef_zgr.F90         |  10 +-
 tests/C1D_ASICS/MY_SRC/usrdef_nam.F90     |   1 -
 tests/CANAL/MY_SRC/usrdef_hgr.F90         |   4 +-
 tests/DIA_GPU/MY_SRC/stpctl.F90           |   2 +-
 tests/DOME/MY_SRC/usrdef_hgr.F90          |   4 +-
 tests/DOME/MY_SRC/usrdef_istate.F90       |   4 +-
 tests/DOME/MY_SRC/usrdef_zgr.F90          |   3 +-
 tests/ICB/MY_SRC/usrdef_nam.F90           |   1 -
 tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90     |   4 +-
 tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90     |  16 +-
 tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90     |  16 +-
 tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90  |  10 +-
 tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90  |  10 +-
 tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90      |  12 +-
 tests/ICE_RHEO/MY_SRC/usrdef_nam.F90      |   1 -
 tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90      |  10 +-
 tests/ISOMIP/MY_SRC/usrdef_hgr.F90        |   8 +-
 tests/ISOMIP/MY_SRC/usrdef_zgr.F90        |   5 +-
 tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90 |   8 +-
 tests/OVERFLOW/MY_SRC/usrdef_hgr.F90      |   8 +-
 tests/OVERFLOW/MY_SRC/usrdef_zgr.F90      |   7 +-
 tests/STATION_ASF/MY_SRC/icesbc.F90       |   4 +-
 tests/STATION_ASF/MY_SRC/stpctl.F90       |   2 +-
 tests/STATION_ASF/MY_SRC/usrdef_hgr.F90   |   1 -
 tests/STATION_ASF/MY_SRC/usrdef_nam.F90   |   1 -
 tests/SWG/MY_SRC/usrdef_fmask.F90         |  28 +-
 tests/SWG/MY_SRC/usrdef_nam.F90           |   1 -
 tests/TSUNAMI/MY_SRC/usrdef_hgr.F90       |   4 +-
 tests/VORTEX/MY_SRC/usrdef_hgr.F90        |   4 +-
 tests/WAD/MY_SRC/usrdef_hgr.F90           |   8 +-
 tests/WAD/MY_SRC/usrdef_istate.F90        |   9 +-
 tests/WAD/MY_SRC/usrdef_zgr.F90           |  64 +--
 90 files changed, 1534 insertions(+), 1436 deletions(-)

diff --git a/src/ICE/icectl.F90 b/src/ICE/icectl.F90
index 9593be4f8..78fb1563e 100644
--- a/src/ICE/icectl.F90
+++ b/src/ICE/icectl.F90
@@ -528,8 +528,8 @@ CONTAINS
       INTEGER :: jl, ji, jj
       !!-------------------------------------------------------------------
 
-      DO ji = mi0(ki), mi1(ki)
-         DO jj = mj0(kj), mj1(kj)
+      DO ji = mi0(ki,nn_hls), mi1(ki,nn_hls)
+         DO jj = mj0(kj,nn_hls), mj1(kj,nn_hls)
 
             WRITE(numout,*) ' time step ',kt,' ',cd1             ! print title
 
diff --git a/src/NST/agrif_oce_interp.F90 b/src/NST/agrif_oce_interp.F90
index 326ecbbd0..6649f60b4 100644
--- a/src/NST/agrif_oce_interp.F90
+++ b/src/NST/agrif_oce_interp.F90
@@ -270,7 +270,7 @@ CONTAINS
          ibdy2 = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()   ! halo + land + nbghostcells
          !
          IF( .NOT.ln_dynspg_ts ) THEN  ! Store transport
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
@@ -278,7 +278,7 @@ CONTAINS
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zub(ji,:)  = 0._wp  
             zhub(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -300,7 +300,7 @@ CONTAINS
             END DO
          END DO
          !   
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zvb(ji,:)  = 0._wp
             zhvb(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -330,14 +330,14 @@ CONTAINS
          ibdy2 = jpiglo - ( nn_hls + 2 )                 
          !
          IF( .NOT.ln_dynspg_ts ) THEN 
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zub(ji,:)  = 0._wp 
             zhub(ji,:) = 0._wp   
             DO jk = 1, jpkm1
@@ -363,14 +363,14 @@ CONTAINS
          ibdy2 = jpiglo - ( nn_hls + 1 )     
          !
          IF( .NOT.ln_dynspg_ts ) THEN 
-            DO ji = mi0(ibdy1), mi1(ibdy2)
+            DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
                DO jj = 1, jpj
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO ji = mi0(ibdy1), mi1(ibdy2)
+         DO ji = mi0(ibdy1,nn_hls), mi1(ibdy2,nn_hls)
             zvb(ji,:)  = 0._wp
             zhvb(ji,:) = 0._wp
             DO jk = 1, jpkm1
@@ -400,7 +400,7 @@ CONTAINS
          jbdy2 = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()   
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
@@ -408,7 +408,7 @@ CONTAINS
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zvb(:,jj) = 0._wp
             zhvb(:,jj) = 0._wp
             DO jk=1,jpkm1
@@ -430,7 +430,7 @@ CONTAINS
             END DO
          END DO
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zub(:,jj) = 0._wp
             zhub(:,jj) = 0._wp
             DO jk = 1, jpkm1
@@ -460,14 +460,14 @@ CONTAINS
          jbdy2 = jpjglo - ( nn_hls + 2 )
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   vv_b(ji,jj,Krhs_a) = vbdy(ji,jj) * r1_hv(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zvb(:,jj) = 0._wp 
             zhvb(:,jj) = 0._wp 
             DO jk=1,jpkm1
@@ -493,14 +493,14 @@ CONTAINS
          jbdy2 = jpjglo - ( nn_hls + 1 )
          !
          IF( .NOT.ln_dynspg_ts ) THEN
-            DO jj = mj0(jbdy1), mj1(jbdy2)
+            DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
                DO ji = 1, jpi
                   uu_b(ji,jj,Krhs_a) = ubdy(ji,jj) * r1_hu(ji,jj,Krhs_a)
                END DO
             END DO
          ENDIF
          !
-         DO jj = mj0(jbdy1), mj1(jbdy2)
+         DO jj = mj0(jbdy1,nn_hls), mj1(jbdy2,nn_hls)
             zub(:,jj) = 0._wp
             zhub(:,jj) = 0._wp
             DO jk = 1, jpkm1
@@ -553,7 +553,7 @@ CONTAINS
          IF( lk_west ) THEN
             istart = nn_hls + 2                              ! halo + land + 1
             iend   = nn_hls + nbghostcells  + nn_shift_bar*Agrif_Rhox()              ! halo + land + nbghostcells
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
@@ -565,7 +565,7 @@ CONTAINS
          IF( lk_east ) THEN
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 1 )                
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
    
                DO jj=1,jpj
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
@@ -573,7 +573,7 @@ CONTAINS
             END DO
             istart = jpiglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 2 )                
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
                END DO
@@ -584,7 +584,7 @@ CONTAINS
          IF( lk_south ) THEN
             jstart = nn_hls + 2                              
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()           
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
    
                DO ji=1,jpi
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
@@ -597,14 +597,14 @@ CONTAINS
          IF( lk_north ) THEN
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()     
             jend   = jpjglo - ( nn_hls + 1 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   ua_e(ji,jj) = ubdy(ji,jj) * hur_e(ji,jj)
                END DO
             END DO
             jstart = jpjglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 2 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   va_e(ji,jj) = vbdy(ji,jj) * hvr_e(ji,jj)
                END DO
@@ -642,7 +642,7 @@ CONTAINS
          IF( lk_west ) THEN
             istart = nn_hls + 2                              
             iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox() 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
@@ -654,14 +654,14 @@ CONTAINS
          IF( lk_east ) THEN
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()
             iend   = jpiglo - ( nn_hls + 1 )                 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                END DO
             END DO
             istart = jpiglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhox() 
             iend   = jpiglo - ( nn_hls + 2 )                 
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj=1,jpj
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                END DO
@@ -672,7 +672,7 @@ CONTAINS
          IF( lk_south ) THEN
             jstart = nn_hls + 2                              
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy() 
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
@@ -684,14 +684,14 @@ CONTAINS
          IF( lk_north ) THEN
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 1 )                
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zu(ji,jj) = ubdy(ji,jj) * e2u(ji,jj)
                END DO
             END DO
             jstart = jpjglo - ( nn_hls + nbghostcells ) - nn_shift_bar*Agrif_Rhoy() 
             jend   = jpjglo - ( nn_hls + 2 )               
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji=1,jpi
                   zv(ji,jj) = vbdy(ji,jj) * e1v(ji,jj)
                END DO
@@ -801,7 +801,7 @@ CONTAINS
          istart = nn_hls + 2                                                          ! halo + land + 1
          iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()               ! halo + land + nbghostcells
          IF (lk_div_cons) iend = istart
-         DO ji = mi0(istart), mi1(iend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
             DO jj = 1, jpj
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -813,7 +813,7 @@ CONTAINS
          istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()       ! halo + land + nbghostcells - 1
          iend   = jpiglo - ( nn_hls + 1 )                                              ! halo + land + 1            - 1
          IF (lk_div_cons) istart = iend
-         DO ji = mi0(istart), mi1(iend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
             DO jj = 1, jpj
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -825,7 +825,7 @@ CONTAINS
          jstart = nn_hls + 2                                                          ! halo + land + 1
          jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()               ! halo + land + nbghostcells
          IF (lk_div_cons) jend = jstart
-         DO jj = mj0(jstart), mj1(jend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
             DO ji = 1, jpi
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -837,7 +837,7 @@ CONTAINS
          jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()     ! halo + land + nbghostcells - 1
          jend   = jpjglo - ( nn_hls + 1 )                                            ! halo + land + 1            - 1
          IF (lk_div_cons) jstart = jend
-         DO jj = mj0(jstart), mj1(jend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
             DO ji = 1, jpi
                ssh(ji,jj,Krhs_a) = hbdy(ji,jj)
             END DO
@@ -870,7 +870,7 @@ CONTAINS
             istart = nn_hls + 2                                                        ! halo + land + 1
             iend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhox()             ! halo + land + nbghostcells
             IF (lk_div_cons) iend = istart
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj = 1, jpj
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -882,7 +882,7 @@ CONTAINS
             istart = jpiglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhox()    ! halo + land + nbghostcells - 1
             iend   = jpiglo - ( nn_hls + 1 )                                           ! halo + land + 1            - 1
             IF (lk_div_cons) istart = iend
-            DO ji = mi0(istart), mi1(iend)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                DO jj = 1, jpj
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -894,7 +894,7 @@ CONTAINS
             jstart = nn_hls + 2                                                        ! halo + land + 1
             jend   = nn_hls + nbghostcells + nn_shift_bar*Agrif_Rhoy()             ! halo + land + nbghostcells
             IF (lk_div_cons) jend   = jstart
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji = 1, jpi
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -906,7 +906,7 @@ CONTAINS
             jstart = jpjglo - ( nn_hls + nbghostcells -1 ) - nn_shift_bar*Agrif_Rhoy()    ! halo + land + nbghostcells - 1
             jend   = jpjglo - ( nn_hls + 1 )                                           ! halo + land + 1            - 1
             IF (lk_div_cons) jstart = jend
-            DO jj = mj0(jstart), mj1(jend)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                DO ji = 1, jpi
                   ssha_e(ji,jj) = hbdy(ji,jj)
                END DO
@@ -1551,7 +1551,7 @@ CONTAINS
          DO ji=i1,i2
             DO jj=j1,j2
                IF (utint_stage(ji,jj)==0) THEN 
-                  zx = 2._wp*MOD(ABS(mig0(ji)-nbghostcells_x_w), INT(Agrif_Rhox()))/zrhox - 1._wp  
+                  zx = 2._wp*MOD(ABS(mig(ji,0)-nbghostcells_x_w), INT(Agrif_Rhox()))/zrhox - 1._wp  
                   ubdy(ji,jj) = ubdy(ji,jj) + 0.25_wp*(1._wp-zx*zx) * ptab(ji,jj) & 
                               &         / zrhoy *r1_e2u(ji,jj) * umask(ji,jj,1) 
                   utint_stage(ji,jj) = 1 
@@ -1671,7 +1671,7 @@ CONTAINS
          DO ji=i1,i2
             DO jj=j1,j2
                IF (vtint_stage(ji,jj)==0) THEN 
-                  zy = 2._wp*MOD(ABS(mjg0(jj)-nbghostcells_y_s), INT(Agrif_Rhoy()))/zrhoy - 1._wp  
+                  zy = 2._wp*MOD(ABS(mjg(jj,0)-nbghostcells_y_s), INT(Agrif_Rhoy()))/zrhoy - 1._wp  
                   vbdy(ji,jj) = vbdy(ji,jj) + 0.25_wp*(1._wp-zy*zy) * ptab(ji,jj) & 
                               &         / zrhox * r1_e1v(ji,jj) * vmask(ji,jj,1) 
                   vtint_stage(ji,jj) = 1 
@@ -1755,7 +1755,7 @@ CONTAINS
          DO jj = j1, j2
             DO ji = i1, i2
                IF( ABS( ptab(ji,jj) - glamt(ji,jj) ) > ztst ) THEN
-                  WRITE(numout,*) ' Agrif error for glamt: parent, child, i, j ', ptab(ji,jj), glamt(ji,jj), mig0(ji), mig0(jj)
+                  WRITE(numout,*) ' Agrif error for glamt: parent, child, i, j ', ptab(ji,jj), glamt(ji,jj), mig(ji,0), mjg(jj,0)
 !                  kindic_agr = kindic_agr + 1
                ENDIF
             END DO
@@ -1784,7 +1784,7 @@ CONTAINS
          DO jj = j1, j2
             DO ji = i1, i2
                IF( ABS( ptab(ji,jj) - gphit(ji,jj) ) > ztst ) THEN
-                  WRITE(numout,*) ' Agrif error for gphit: parent, child, i, j ', ptab(ji,jj), gphit(ji,jj), mig0(ji), mig0(jj)
+                  WRITE(numout,*) ' Agrif error for gphit: parent, child, i, j ', ptab(ji,jj), gphit(ji,jj), mig(ji,0), mjg(jj,0)
 !                  kindic_agr = kindic_agr + 1
                ENDIF
             END DO
@@ -1999,8 +1999,8 @@ CONTAINS
          iend   = nn_hls + nbghostcells + ispon           ! halo + land + nbghostcells + sponge
          jstart = nn_hls + 2 
          jend   = jpjglo - nn_hls - 1 
-         DO ji = mi0(istart), mi1(iend)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2008,7 +2008,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO jj = mj0(jstart), mj1(jend-1)
+            DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2017,8 +2017,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO ji = mi0(istart), mi1(iend-1)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2036,8 +2036,8 @@ CONTAINS
          iend   = jpiglo - nn_hls - 1                            ! halo + land + 1                     - 1
          jstart = nn_hls + 2 
          jend   = jpjglo - nn_hls - 1
-         DO ji = mi0(istart), mi1(iend)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2045,7 +2045,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO jj = mj0(jstart), mj1(jend-1)
+            DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2054,8 +2054,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO ji = mi0(istart), mi1(iend-1)
-            DO jj = mj0(jstart), mj1(jend)
+         DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
+            DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2073,8 +2073,8 @@ CONTAINS
          jend   = nn_hls + nbghostcells + ispon          ! halo + land + nbghostcells + sponge
          istart = nn_hls + 2 
          iend   = jpiglo - nn_hls - 1 
-         DO jj = mj0(jstart), mj1(jend)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2082,7 +2082,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO ji = mi0(istart), mi1(iend-1)
+            DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2091,8 +2091,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO jj = mj0(jstart), mj1(jend-1)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2110,8 +2110,8 @@ CONTAINS
          jend   = jpjglo - nn_hls - 1                            ! halo + land + 1            - 1
          istart = nn_hls + 2 
          iend   = jpiglo - nn_hls - 1 
-         DO jj = mj0(jstart), mj1(jend)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(ht0_parent(ji,jj)-ht_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2119,7 +2119,7 @@ CONTAINS
                   END DO 
                ENDIF
             END DO
-            DO ji = mi0(istart), mi1(iend-1)
+            DO ji = mi0(istart,nn_hls), mi1(iend-1,nn_hls)
                IF ( ABS(hu0_parent(ji,jj)-hu_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
@@ -2128,8 +2128,8 @@ CONTAINS
                ENDIF
             END DO
          END DO
-         DO jj = mj0(jstart), mj1(jend-1)
-            DO ji = mi0(istart), mi1(iend)
+         DO jj = mj0(jstart,nn_hls), mj1(jend-1,nn_hls)
+            DO ji = mi0(istart,nn_hls), mi1(iend,nn_hls)
                IF ( ABS(hv0_parent(ji,jj)-hv_0(ji,jj)) > 1.e-3 ) iindic = iindic + 1
                IF ( .NOT.ln_vert_remap) THEN
                   DO jk = 1, jpkm1
diff --git a/src/NST/agrif_oce_sponge.F90 b/src/NST/agrif_oce_sponge.F90
index d077f7b88..7d9e58852 100644
--- a/src/NST/agrif_oce_sponge.F90
+++ b/src/NST/agrif_oce_sponge.F90
@@ -161,15 +161,15 @@ CONTAINS
       IF( lk_west ) THEN                            ! --- West --- !
          ind1 = nn_hls + nbghostcells               ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + ispongearea 
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
-               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji), wp) * z1_ispongearea
+               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji,nn_hls), wp) * z1_ispongearea
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls +  nbghostcells              ! halo + nbghostcells
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -178,15 +178,15 @@ CONTAINS
       IF( lk_east ) THEN                             ! --- East --- !
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 ) - ispongearea - 1
          ind2 = jpiglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + land + nbghostcells - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji) - ind1, wp) * z1_ispongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji,nn_hls) - ind1, wp) * z1_ispongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + land + nbghostcells - 1
          ind2 = jpiglo - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -195,15 +195,15 @@ CONTAINS
       IF( lk_south ) THEN                            ! --- South --- !
          ind1 = nn_hls + nbghostcells                ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + jspongearea 
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj), wp) * z1_jspongearea )
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj,nn_hls), wp) * z1_jspongearea )
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells                ! halo + nbghostcells
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -212,15 +212,15 @@ CONTAINS
       IF( lk_north ) THEN                            ! --- North --- !
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 ) - jspongearea - 1
          ind2 = jpjglo - ( nn_hls + nbghostcells -1 ) - 1    ! halo + nbghostcells - 1
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj) - ind1, wp) * z1_jspongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj,nn_hls) - ind1, wp) * z1_jspongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 )      ! halo + land + nbghostcells - 1
          ind2 = jpjglo
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -294,15 +294,15 @@ CONTAINS
       IF( lk_west ) THEN                             ! --- West --- !
          ind1 = nn_hls + nbghostcells + ishift
          ind2 = nn_hls + nbghostcells + ishift + ispongearea 
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
-               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji), wp) * z1_ispongearea
+               ztabramp(ji,jj) =                       REAL(ind2 - mig(ji,nn_hls), wp) * z1_ispongearea
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells + ishift               ! halo + nbghostcells
-         DO ji = mi0(ind1), mi1(ind2)   
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)   
             DO jj = 1, jpj               
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -311,15 +311,15 @@ CONTAINS
       IF( lk_east ) THEN                             ! --- East --- !
          ind1 = jpiglo - ( nn_hls + nbghostcells -1  + ishift) - ispongearea - 1
          ind2 = jpiglo - ( nn_hls + nbghostcells -1  + ishift) - 1    ! halo + nbghostcells - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji) - ind1, wp) * z1_ispongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mig(ji,nn_hls) - ind1, wp) * z1_ispongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpiglo - ( nn_hls + nbghostcells -1 + ishift) - 1    ! halo + nbghostcells - 1
          ind2 = jpiglo - 1
-         DO ji = mi0(ind1), mi1(ind2)
+         DO ji = mi0(ind1,nn_hls), mi1(ind2,nn_hls)
             DO jj = 1, jpj
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -328,15 +328,15 @@ CONTAINS
       IF( lk_south ) THEN                            ! --- South --- !
          ind1 = nn_hls + nbghostcells + jshift                ! halo + nbghostcells
          ind2 = nn_hls + nbghostcells + jshift + jspongearea 
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj), wp) * z1_jspongearea )
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(ind2 - mjg(jj,nn_hls), wp) * z1_jspongearea )
             END DO
          END DO
          ! ghost cells:
          ind1 = 1
          ind2 = nn_hls + nbghostcells + jshift                ! halo + land + nbghostcells
-         DO jj = mj0(ind1), mj1(ind2) 
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls) 
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -345,15 +345,15 @@ CONTAINS
       IF( lk_north ) THEN                            ! --- North --- !
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 + jshift) - jspongearea - 1
          ind2 = jpjglo - ( nn_hls + nbghostcells -1 + jshift) - 1    ! halo + land + nbghostcells - 1
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
-               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj) - ind1, wp) * z1_jspongearea ) 
+               ztabramp(ji,jj) = MAX( ztabramp(ji,jj), REAL(mjg(jj,nn_hls) - ind1, wp) * z1_jspongearea ) 
             END DO
          END DO
          ! ghost cells:
          ind1 = jpjglo - ( nn_hls + nbghostcells -1 + jshift)      ! halo + land + nbghostcells - 1
          ind2 = jpjglo
-         DO jj = mj0(ind1), mj1(ind2)
+         DO jj = mj0(ind1,nn_hls), mj1(ind2,nn_hls)
             DO ji = 1, jpi
                ztabramp(ji,jj) = 1._wp
             END DO
@@ -730,7 +730,7 @@ CONTAINS
 
          jmax = j2-1
          ind1 = jpjglo - ( nn_hls + nbghostcells + 1 )   ! North
-         DO jj = mj0(ind1), mj1(ind1)                 
+         DO jj = mj0(ind1,nn_hls), mj1(ind1,nn_hls)                 
             jmax = MIN(jmax,jj)
          END DO
 
@@ -858,7 +858,7 @@ CONTAINS
 
          imax = i2 - 1
          ind1 = jpiglo - ( nn_hls + nbghostcells + 1 )   ! East
-         DO ji = mi0(ind1), mi1(ind1)                
+         DO ji = mi0(ind1,nn_hls), mi1(ind1,nn_hls)                
             imax = MIN(imax,ji)
          END DO
          
@@ -958,7 +958,7 @@ CONTAINS
 
          jmax = j2-1
          ind1 = jpjglo - ( nn_hls + nbghostcells + 1 )   ! North
-         DO jj = mj0(ind1), mj1(ind1)                 
+         DO jj = mj0(ind1,nn_hls), mj1(ind1,nn_hls)                 
             jmax = MIN(jmax,jj)
          END DO
 
@@ -1025,7 +1025,7 @@ CONTAINS
 
          imax = i2 - 1
          ind1 = jpiglo - ( nn_hls + nbghostcells + 1 )   ! East
-         DO ji = mi0(ind1), mi1(ind1)                
+         DO ji = mi0(ind1,nn_hls), mi1(ind1,nn_hls)                
             imax = MIN(imax,ji)
          END DO
          
diff --git a/src/NST/agrif_oce_update.F90 b/src/NST/agrif_oce_update.F90
index 72fb2eca1..fed585975 100644
--- a/src/NST/agrif_oce_update.F90
+++ b/src/NST/agrif_oce_update.F90
@@ -1893,7 +1893,7 @@ CONTAINS
                      DO jk=k1,k2-1
                         IF  (ABS((ptab(ji,jj,jk)-e3u_0(ji,jj,jk))*umask(ji,jj,jk)).GE.1.e-6)  THEN 
                            kindic_agr = kindic_agr + 1 
-                           print *, 'erro u-pt', mig0(ji), mjg0(jj), jk, mbku(ji,jj), ikbot, ptab(ji,jj,jk), e3u_0(ji,jj,jk)
+                           PRINT *, 'erro u-pt', mig(ji,0), mjg(jj,0), jk, mbku(ji,jj), ikbot, ptab(ji,jj,jk), e3u_0(ji,jj,jk)
                         ENDIF
                      END DO
                   ENDIF
@@ -1933,7 +1933,7 @@ CONTAINS
                      DO jk=k1,k2-1
                         IF  (ABS((ptab(ji,jj,jk)-e3v_0(ji,jj,jk))*vmask(ji,jj,jk)).GE.1.e-6)  THEN 
                            kindic_agr = kindic_agr + 1 
-                           print *, 'erro v-pt', mig0(ji), mjg0(jj), mbkv(ji,jj), ptab(ji,jj,jk), e3v_0(ji,jj,jk)
+                           PRINT *, 'erro v-pt', mig(ji,0), mjg(jj,0), mbkv(ji,jj), ptab(ji,jj,jk), e3v_0(ji,jj,jk)
                         ENDIF
                      END DO
                   ENDIF
diff --git a/src/NST/agrif_user.F90 b/src/NST/agrif_user.F90
index 2bdc85c5d..76e583a4a 100644
--- a/src/NST/agrif_user.F90
+++ b/src/NST/agrif_user.F90
@@ -1095,8 +1095,8 @@
       !!----------------------------------------------------------------------
       !
       SELECT CASE( i )
-      CASE(1)        ;   indglob = mig(indloc)
-      CASE(2)        ;   indglob = mjg(indloc)
+      CASE(1)        ;   indglob = mig(indloc,nn_hls)
+      CASE(2)        ;   indglob = mjg(indloc,nn_hls)
       CASE DEFAULT   ;   indglob = indloc
       END SELECT
       !
@@ -1115,10 +1115,10 @@
       INTEGER, INTENT(out) :: jmin, jmax
       !!----------------------------------------------------------------------
       !
-      imin = mig( 1 )
-      jmin = mjg( 1 )
-      imax = mig(jpi)
-      jmax = mjg(jpj)
+      imin = mig( 1 ,nn_hls)
+      jmin = mjg( 1 ,nn_hls)
+      imax = mig(jpi,nn_hls)
+      jmax = mjg(jpj,nn_hls)
       ! 
    END SUBROUTINE Agrif_get_proc_info
 
diff --git a/src/OCE/BDY/bdyini.F90 b/src/OCE/BDY/bdyini.F90
index 3de3150bc..e0b1fe6d8 100644
--- a/src/OCE/BDY/bdyini.F90
+++ b/src/OCE/BDY/bdyini.F90
@@ -491,10 +491,10 @@ CONTAINS
       ! Find lenght of boundaries and rim on local mpi domain
       !------------------------------------------------------
       !
-      iwe = mig(1)
-      ies = mig(jpi)
-      iso = mjg(1) 
-      ino = mjg(jpj) 
+      iwe = mig(  1,nn_hls)
+      ies = mig(jpi,nn_hls)
+      iso = mjg(  1,nn_hls) 
+      ino = mjg(jpj,nn_hls) 
       !
       DO ib_bdy = 1, nb_bdy
          DO igrd = 1, jpbgrd
@@ -554,8 +554,8 @@ CONTAINS
                      & nbrdta(ib,igrd,ib_bdy) == ir  ) THEN
                      !
                      icount = icount  + 1
-                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy) - mig(1) + 1   ! global to local indexes
-                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy) - mjg(1) + 1   ! global to local indexes
+                     idx_bdy(ib_bdy)%nbi(icount,igrd)   = nbidta(ib,igrd,ib_bdy) - mig(1,nn_hls) + 1   ! global to local indexes
+                     idx_bdy(ib_bdy)%nbj(icount,igrd)   = nbjdta(ib,igrd,ib_bdy) - mjg(1,nn_hls) + 1   ! global to local indexes
                      idx_bdy(ib_bdy)%nbr(icount,igrd)   = nbrdta(ib,igrd,ib_bdy)
                      idx_bdy(ib_bdy)%nbmap(icount,igrd) = ib
                   ENDIF
@@ -1014,7 +1014,7 @@ CONTAINS
                DO ib = 1, idx_bdy(ib_bdy)%nblenrim(igrd)
                   ii = idx_bdy(ib_bdy)%nbi(ib,igrd)
                   ij = idx_bdy(ib_bdy)%nbj(ib,igrd)
-                  IF(  mig0(ii) > 2 .AND. mig0(ii) < Ni0glo-2 .AND. mjg0(ij) > 2 .AND. mjg0(ij) < Nj0glo-2  ) THEN
+                  IF(  mig(ii,0) > 2 .AND. mig(ii,0) < Ni0glo-2 .AND. mjg(ij,0) > 2 .AND. mjg(ij,0) < Nj0glo-2  ) THEN
                      WRITE(ctmp1,*) ' Orlanski is not safe when the open boundaries are on the interior of the computational domain'
                      CALL ctl_stop( ctmp1 )
                   END IF
@@ -1090,7 +1090,7 @@ CONTAINS
                ! This error check only works if you are using the bdyXmask arrays (which are set to 0 on rims)
                IF( i_offset == 1 .and. zefl + zwfl == 2._wp ) THEN
                   icount = icount + 1
-                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij)
+                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii,nn_hls),mjg(ij,nn_hls)
                ELSE
                   ztmp(ii,ij) = -zwfl + zefl
                ENDIF
@@ -1130,7 +1130,7 @@ CONTAINS
                znfl = zmask(ii,ij+j_offset  )
                ! This error check only works if you are using the bdyXmask arrays (which are set to 0 on rims)
                IF( j_offset == 1 .and. znfl + zsfl == 2._wp ) THEN
-                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii),mjg(ij)
+                  IF(lwp) WRITE(numout,*) 'Problem with igrd = ',igrd,' at (global) nbi, nbj : ',mig(ii,nn_hls),mjg(ij,nn_hls)
                   icount = icount + 1
                ELSE
                   ztmp(ii,ij) = -zsfl + znfl
@@ -1594,8 +1594,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mig0(ji) == jpiwob(ib) .AND. mjg0(jj) == jpjwdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mig0(ji) == jpiwob(ib) .AND. mjg0(jj) == jpjwft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mig(ji,0) == jpiwob(ib) .AND. mjg(jj,0) == jpjwdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mig(ji,0) == jpiwob(ib) .AND. mjg(jj,0) == jpjwft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1630,8 +1630,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mig0(ji) == jpieob(ib)+1 .AND. mjg0(jj) == jpjedt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mig0(ji) == jpieob(ib)+1 .AND. mjg0(jj) == jpjeft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mig(ji,0) == jpieob(ib)+1 .AND. mjg(jj,0) == jpjedt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mig(ji,0) == jpieob(ib)+1 .AND. mjg(jj,0) == jpjeft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1666,8 +1666,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-              IF( mjg0(jj) == jpjsob(ib) .AND. mig0(ji) == jpisdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-              IF( mjg0(jj) == jpjsob(ib) .AND. mig0(ji) == jpisft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+              IF( mjg(jj,0) == jpjsob(ib) .AND. mig(ji,0) == jpisdt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+              IF( mjg(jj,0) == jpjsob(ib) .AND. mig(ji,0) == jpisft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
@@ -1688,8 +1688,8 @@ CONTAINS
          ztestmask(1:2)=0.
          DO ji = 1, jpi
             DO jj = 1, jpj             
-               IF( mjg0(jj) == jpjnob(ib)+1 .AND. mig0(ji) == jpindt(ib) )   ztestmask(1) = tmask(ji,jj,1)
-               IF( mjg0(jj) == jpjnob(ib)+1 .AND. mig0(ji) == jpinft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
+               IF( mjg(jj,0) == jpjnob(ib)+1 .AND. mig(ji,0) == jpindt(ib) )   ztestmask(1) = tmask(ji,jj,1)
+               IF( mjg(jj,0) == jpjnob(ib)+1 .AND. mig(ji,0) == jpinft(ib) )   ztestmask(2) = tmask(ji,jj,1)  
             END DO
          END DO
          CALL mpp_sum( 'bdyini', ztestmask, 2 )   ! sum over the global domain
diff --git a/src/OCE/DIA/diadct.F90 b/src/OCE/DIA/diadct.F90
index 4fa5479f4..ffc50f370 100644
--- a/src/OCE/DIA/diadct.F90
+++ b/src/OCE/DIA/diadct.F90
@@ -414,9 +414,9 @@ CONTAINS
               !verify if the point is on the local domain:(1,Nie0)*(1,Nje0)
               IF( iiloc >= 1 .AND. iiloc <= Nie0 .AND. &
                   ijloc >= 1 .AND. ijloc <= Nje0       )THEN
-                 iptloc = iptloc + 1                                                 ! count local points
-                 secs(jsec)%listPoint(iptloc) = POINT_SECTION(mi0(iiglo),mj0(ijglo)) ! store local coordinates
-                 secs(jsec)%direction(iptloc) = directemp(jpt)                       ! store local direction
+                 iptloc = iptloc + 1                                                               ! count local points
+                 secs(jsec)%listPoint(iptloc) = POINT_SECTION(mi0(iiglo,nn_hls),mj0(ijglo,nn_hls)) ! store local coordinates
+                 secs(jsec)%direction(iptloc) = directemp(jpt)                                     ! store local direction
               ENDIF
               !
            END DO
diff --git a/src/OCE/DOM/dom_oce.F90 b/src/OCE/DOM/dom_oce.F90
index 71a085f23..480d3d2fb 100644
--- a/src/OCE/DOM/dom_oce.F90
+++ b/src/OCE/DOM/dom_oce.F90
@@ -76,10 +76,10 @@ MODULE dom_oce
    INTEGER         ::   nn_ltile_i, nn_ltile_j
 
    ! Domain tiling
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntsi_a       !: start of internal part of tile domain
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntsj_a       !
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntei_a       !: end of internal part of tile domain
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   ntej_a       !
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntsi_a       !: start of internal part of tile domain
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntsj_a       !
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntei_a       !: end of internal part of tile domain
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   ntej_a       !
    LOGICAL, PUBLIC                                  ::   l_istiled    ! whether tiling is currently active or not
 
    !                             !: domain MPP decomposition parameters
@@ -87,32 +87,30 @@ MODULE dom_oce
    INTEGER              , PUBLIC ::   narea            !: number for local area (starting at 1) = MPI rank + 1
    INTEGER,               PUBLIC ::   nidom      !: IOIPSL things...
 
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mig        !: local ==> global domain, including halos (jpiglo), i-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mjg        !: local ==> global domain, including halos (jpjglo), j-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mig0       !: local ==> global domain, excluding halos (Ni0glo), i-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mjg0       !: local ==> global domain, excluding halos (Nj0glo), j-index
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mi0, mi1   !: global, including halos (jpiglo) ==> local domain i-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mig        !: local ==> global domain, i-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mjg        !: local ==> global domain, j-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mi0, mi1   !: global ==> local domain, i-index
    !                                                                !:    (mi0=1 and mi1=0 if global index not in local domain)
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   mj0, mj1   !: global, including halos (jpjglo) ==> local domain j-index
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mj0, mj1   !: global ==> local domain, j-index
    !                                                                !:    (mj0=1 and mj1=0 if global index not in local domain)
-   INTEGER, PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:) ::   nfimpp, nfproc, nfjpi
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION(:) ::   nfimpp, nfproc, nfjpi, nfni_0
 
    !!----------------------------------------------------------------------
    !! horizontal curvilinear coordinate and scale factors
    !! ---------------------------------------------------------------------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   glamt , glamu, glamv , glamf    !: longitude at t, u, v, f-points [degree]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   gphit , gphiu, gphiv , gphif    !: latitude  at t, u, v, f-points [degree]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1t   , e2t  , r1_e1t, r1_e2t   !: t-point horizontal scale factors    [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1u   , e2u  , r1_e1u, r1_e2u   !: horizontal scale factors at u-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1v   , e2v  , r1_e1v, r1_e2v   !: horizontal scale factors at v-point [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, TARGET, DIMENSION(:,:) ::   e1f   , e2f  , r1_e1f, r1_e2f   !: horizontal scale factors at f-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   glamt , glamu, glamv , glamf    !: longitude at t, u, v, f-points [degree]
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   gphit , gphiu, gphiv , gphif    !: latitude  at t, u, v, f-points [degree]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1t   , e2t  , r1_e1t, r1_e2t   !: t-point horizontal scale factors    [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1u   , e2u  , r1_e1u, r1_e2u   !: horizontal scale factors at u-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1v   , e2v  , r1_e1v, r1_e2v   !: horizontal scale factors at v-point [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, TARGET, DIMENSION(:,:) ::   e1f   , e2f  , r1_e1f, r1_e2f   !: horizontal scale factors at f-point [m]
    !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2u , r1_e1e2u , e2_e1u       !: associated metrics at u-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2v , r1_e1e2v , e1_e2v       !: associated metrics at v-point
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE        , DIMENSION(:,:) ::   e1e2f , r1_e1e2f                !: associated metrics at f-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2t , r1_e1e2t                !: associated metrics at t-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2u , r1_e1e2u , e2_e1u       !: associated metrics at u-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2v , r1_e1e2v , e1_e2v       !: associated metrics at v-point
+   REAL(wp), PUBLIC, ALLOCATABLE,         DIMENSION(:,:) ::   e1e2f , r1_e1e2f                !: associated metrics at f-point
    !
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   ff_f  , ff_t                    !: Coriolis factor at f- & t-points  [1/s]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   ff_f  , ff_t                    !: Coriolis factor at f- & t-points  [1/s]
    
    !!----------------------------------------------------------------------
    !! vertical coordinate and scale factors
@@ -132,76 +130,76 @@ MODULE dom_oce
    LOGICAL, PUBLIC ::   ln_sco       !: s-coordinate or hybrid z-s coordinate
    LOGICAL, PUBLIC ::   ln_isfcav    !: presence of ISF
    !                                                        !  reference scale factors
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3t_0   !: t- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3u_0   !: u- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3v_0   !: v- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3f_0   !: f- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::     e3w_0   !: w- vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3uw_0   !: uw-vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:) ::    e3vw_0   !: vw-vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3t_0   !: t- vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3u_0   !: u- vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3v_0   !: v- vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3f_0   !: f- vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::     e3w_0   !: w- vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::    e3uw_0   !: uw-vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:) ::    e3vw_0   !: vw-vert. scale factor [m]
 
    !                                                        !  time-dependent scale factors     (domvvl)
 #if defined key_qco || defined key_linssh
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   e3t, e3u, e3v, e3w, e3uw, e3vw  !: vert. scale factor [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   e3f                             !: F-point vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::   e3t, e3u, e3v, e3w, e3uw, e3vw  !: vert. scale factor [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   e3f                             !: F-point vert. scale factor [m]
 #endif
    !                                                        !  time-dependent ratio ssh / h_0   (domqco)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v                   !: time-dependent    ratio at t-, u- and v-point [-]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3f                             !: mid-time-level    ratio at f-point            [-]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   r3t_f, r3u_f, r3v_f             !: now time-filtered ratio at t-, u- and v-point [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   r3t, r3u, r3v                   !: time-dependent    ratio at t-, u- and v-point [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   r3f                             !: mid-time-level    ratio at f-point            [-]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   r3t_f, r3u_f, r3v_f             !: now time-filtered ratio at t-, u- and v-point [-]
 
    !                                                        !  reference depths of cells
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdept_0  !: t- depth              [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gdepw_0  !: w- depth              [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   gdept_0  !: t- depth              [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   gdepw_0  !: w- depth              [m]
    
    !                                                        !  time-dependent depths of cells   (domvvl)
 #if defined key_qco || defined key_linssh
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   gde3w_0, gde3w !: w- depth (sum of e3w) [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:,:) ::   gdept, gdepw
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   gde3w_0, gde3w !: w- depth (sum of e3w) [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:,:) ::   gdept, gdepw
 #endif
    !                                                        !  reference heights of ocean water column and its inverse
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht_0, r1_ht_0   !: t-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hu_0, r1_hu_0   !: u-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hv_0, r1_hv_0   !: v-depth        [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   hf_0, r1_hf_0   !: f-depth        [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   ht_0, r1_ht_0   !: t-depth        [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   hu_0, r1_hu_0   !: u-depth        [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   hv_0, r1_hv_0   !: v-depth        [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   hf_0, r1_hf_0   !: f-depth        [m] and [1/m]
    
    !                                                        ! time-dependent heights of ocean water column   (domvvl)
 #if defined key_qco || defined key_linssh 
 #else
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)     ::   ht          !: t-points           [m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hu, r1_hu   !: u-depth            [m] and [1/m]
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:)   ::   hv, r1_hv   !: v-depth            [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)     ::   ht          !: t-points           [m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   hu, r1_hu   !: u-depth            [m] and [1/m]
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:)   ::   hv, r1_hv   !: v-depth            [m] and [1/m]
 #endif
    INTEGER, PUBLIC ::   nla10              !: deepest    W level Above  ~10m (nlb10 - 1)
    INTEGER, PUBLIC ::   nlb10              !: shallowest W level Bellow ~10m (nla10 + 1)
 
    !! 1D reference  vertical coordinate
    !! =-----------------====------
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   gdept_1d, gdepw_1d !: reference depth of t- and w-points (m)
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:)   ::   e3t_1d  , e3w_1d   !: reference vertical scale factors at T- and W-pts (m)
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:)   ::   gdept_1d, gdepw_1d !: reference depth of t- and w-points (m)
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:)   ::   e3t_1d  , e3w_1d   !: reference vertical scale factors at T- and W-pts (m)
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   risfdep, bathy
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   risfdep, bathy
 
    !!----------------------------------------------------------------------
    !! masks, top and bottom ocean point position
    !! ---------------------------------------------------------------------
 !!gm Proposition of new name for top/bottom vertical indices
-!   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mtk_t, mtk_u, mtk_v   !: top    first wet T-, U-, and V-level (ISF)
-!   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbk_t, mbk_u, mbk_v   !: bottom last  wet T-, U-, and V-level
+!   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mtk_t, mtk_u, mtk_v   !: top    first wet T-, U-, and V-level (ISF)
+!   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mbk_t, mbk_u, mbk_v   !: bottom last  wet T-, U-, and V-level
 !!gm
-   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mbkt, mbku, mbkv, mbkf   !: bottom last wet T-, U-, V- and F-level
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   tmask_i                  !: interior (excluding halos+duplicated points) domain T-point mask
+   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mbkt, mbku, mbkv, mbkf   !: bottom last wet T-, U-, V- and F-level
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   tmask_i                  !: interior (excluding halos+duplicated points) domain T-point mask
 
-   INTEGER , PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf   !: top first wet T-, U-, V-, F-level           (ISF)
+   INTEGER , PUBLIC, ALLOCATABLE, DIMENSION(:,:) ::   mikt, miku, mikv, mikf   !: top first wet T-, U-, V-, F-level           (ISF)
 
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   smask0                              !: surface mask at T-pts on inner domain
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:)           ::   ssmask, ssumask, ssvmask, ssfmask   !: surface mask at T-,U-, V- and F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts
-   REAL(wp), PUBLIC, ALLOCATABLE, SAVE, DIMENSION(:,:) :: tmask_upd, umask_upd, vmask_upd                 !: land/ocean mask at F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)           ::   smask0                              !: surface mask at T-pts on inner domain
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:)           ::   ssmask, ssumask, ssvmask, ssfmask   !: surface mask at T-,U-, V- and F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   tmask, umask, vmask, wmask, fmask   !: land/ocean mask at T-, U-, V-, W- and F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   wumask, wvmask                      !: land/ocean mask at WU- and WV-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:,:), TARGET ::   fe3mask                             !: land/ocean mask at F-pts
+   REAL(wp), PUBLIC, ALLOCATABLE, DIMENSION(:,:) :: tmask_upd, umask_upd, vmask_upd                 !: land/ocean mask at F-pts
 
    !!----------------------------------------------------------------------
    !! calendar variables
diff --git a/src/OCE/DOM/domvvl.F90 b/src/OCE/DOM/domvvl.F90
index 94bf1ce8b..2de0762a7 100644
--- a/src/OCE/DOM/domvvl.F90
+++ b/src/OCE/DOM/domvvl.F90
@@ -282,8 +282,8 @@ CONTAINS
                IF( nn_cfg == 3 ) THEN   ! ORCA2: Suppress ztilde in the Foxe Basin for ORCA2
                   ii0 = 103 + nn_hls - 1   ;   ii1 = 111 + nn_hls - 1
                   ij0 = 128 + nn_hls       ;   ij1 = 135 + nn_hls
-                  frq_rst_e3t( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  0.0_wp
-                  frq_rst_hdv( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ) =  1.e0_wp / rn_Dt
+                  frq_rst_e3t( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) ) =  0.0_wp
+                  frq_rst_hdv( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) ) =  1.e0_wp / rn_Dt
                ENDIF
             ENDIF
          ENDIF
diff --git a/src/OCE/DOM/domzgr.F90 b/src/OCE/DOM/domzgr.F90
index 85f89ed2c..e6bfeaf33 100644
--- a/src/OCE/DOM/domzgr.F90
+++ b/src/OCE/DOM/domzgr.F90
@@ -130,14 +130,14 @@ CONTAINS
       !
       zmsk(:,:) = 1._wp                                       ! default: no closed boundaries
       IF( .NOT. l_Iperio ) THEN                                    ! E-W closed:
-         zmsk(  mi0(     1+nn_hls):mi1(     1+nn_hls),:) = 0._wp   ! first column of inner global domain at 0
-         zmsk(  mi0(jpiglo-nn_hls):mi1(jpiglo-nn_hls),:) = 0._wp   ! last  column of inner global domain at 0 
+         zmsk(  mi0(     1+nn_hls,nn_hls):mi1(     1+nn_hls,nn_hls),:) = 0._wp   ! first column of inner global domain at 0
+         zmsk(  mi0(jpiglo-nn_hls,nn_hls):mi1(jpiglo-nn_hls,nn_hls),:) = 0._wp   ! last  column of inner global domain at 0 
       ENDIF
       IF( .NOT. l_Jperio ) THEN                                    ! S closed:
-         zmsk(:,mj0(     1+nn_hls):mj1(     1+nn_hls)  ) = 0._wp   ! first   line of inner global domain at 0
+         zmsk(:,mj0(     1+nn_hls,nn_hls):mj1(     1+nn_hls,nn_hls)  ) = 0._wp   ! first   line of inner global domain at 0
       ENDIF
       IF( .NOT. ( l_Jperio .OR. l_NFold ) ) THEN                   ! N closed:
-         zmsk(:,mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)  ) = 0._wp   ! last    line of inner global domain at 0
+         zmsk(:,mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)  ) = 0._wp   ! last    line of inner global domain at 0
       ENDIF
       CALL lbc_lnk( 'usrdef_zgr', zmsk, 'T', 1. )             ! set halos
       k_top(:,:) = k_top(:,:) * NINT( zmsk(:,:) )
diff --git a/src/OCE/DOM/dtatsd.F90 b/src/OCE/DOM/dtatsd.F90
index 5863789cc..cf634beda 100644
--- a/src/OCE/DOM/dtatsd.F90
+++ b/src/OCE/DOM/dtatsd.F90
@@ -161,8 +161,8 @@ CONTAINS
                ij0 = 101 + nn_hls       ;   ij1 = 109 + nn_hls                       ! Reduced T & S in the Alboran Sea
                ii0 = 141 + nn_hls - 1   ;   ii1 = 155 + nn_hls - 1
                IF( sf_tsd(jp_tem)%ln_tint .OR. irec_n(jp_tem) /= irec_b(jp_tem) ) THEN
-                  DO jj = mj0(ij0), mj1(ij1)
-                     DO ji = mi0(ii0), mi1(ii1)
+                  DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+                     DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
                         sf_tsd(jp_tem)%fnow(ji,jj,13:13) = sf_tsd(jp_tem)%fnow(ji,jj,13:13) - 0.20_wp
                         sf_tsd(jp_tem)%fnow(ji,jj,14:15) = sf_tsd(jp_tem)%fnow(ji,jj,14:15) - 0.35_wp
                         sf_tsd(jp_tem)%fnow(ji,jj,16:25) = sf_tsd(jp_tem)%fnow(ji,jj,16:25) - 0.40_wp
@@ -172,8 +172,8 @@ CONTAINS
                ENDIF
                !
                IF( sf_tsd(jp_sal)%ln_tint .OR. irec_n(jp_sal) /= irec_b(jp_sal) ) THEN
-                  DO jj = mj0(ij0), mj1(ij1)
-                     DO ji = mi0(ii0), mi1(ii1)
+                  DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+                     DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
                         sf_tsd(jp_sal)%fnow(ji,jj,13:13) = sf_tsd(jp_sal)%fnow(ji,jj,13:13) - 0.15_wp
                         sf_tsd(jp_sal)%fnow(ji,jj,14:15) = sf_tsd(jp_sal)%fnow(ji,jj,14:15) - 0.25_wp
                         sf_tsd(jp_sal)%fnow(ji,jj,16:17) = sf_tsd(jp_sal)%fnow(ji,jj,16:17) - 0.30_wp
@@ -185,9 +185,9 @@ CONTAINS
                !
                ij0 =  87 + nn_hls       ;   ij1 =  96 + nn_hls                       ! Reduced temperature in Red Sea
                ii0 = 148 + nn_hls - 1   ;   ii1 = 160 + nn_hls - 1
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) ,  4:10 ) = 7.0_wp
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 11:13 ) = 6.5_wp
-               sf_tsd(jp_tem)%fnow( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 14:20 ) = 6.0_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) ,  4:10 ) = 7.0_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 11:13 ) = 6.5_wp
+               sf_tsd(jp_tem)%fnow( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 14:20 ) = 6.0_wp
             ENDIF
          ENDIF
 !!gm end
diff --git a/src/OCE/DYN/sshwzv.F90 b/src/OCE/DYN/sshwzv.F90
index 0e2569708..4d2ca527f 100644
--- a/src/OCE/DYN/sshwzv.F90
+++ b/src/OCE/DYN/sshwzv.F90
@@ -244,28 +244,28 @@ CONTAINS
          ! inside computational domain (cosmetic) 
          DO jk = 1, jpkm1
             IF( lk_west ) THEN                             ! --- West --- !
-               DO ji = mi0(2+nn_hls), mi1(2+nn_hls)
+               DO ji = mi0(2+nn_hls,nn_hls), mi1(2+nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp 
                   END DO
                END DO
             ENDIF
             IF( lk_east ) THEN                             ! --- East --- !
-               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls)
+               DO ji = mi0(jpiglo-1-nn_hls,nn_hls), mi1(jpiglo-1-nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_south ) THEN                            ! --- South --- !
-               DO jj = mj0(2+nn_hls), mj1(2+nn_hls)
+               DO jj = mj0(2+nn_hls,nn_hls), mj1(2+nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_north ) THEN                            ! --- North --- !
-               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls)
+               DO jj = mj0(jpjglo-1-nn_hls,nn_hls), mj1(jpjglo-1-nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
@@ -375,28 +375,28 @@ CONTAINS
          ! inside computational domain (cosmetic) 
          DO jk = 1, jpkm1
             IF( lk_west ) THEN                             ! --- West --- !
-               DO ji = mi0(2+nn_hls), mi1(2+nn_hls)
+               DO ji = mi0(2+nn_hls,nn_hls), mi1(2+nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp 
                   END DO
                END DO
             ENDIF
             IF( lk_east ) THEN                             ! --- East --- !
-               DO ji = mi0(jpiglo-1-nn_hls), mi1(jpiglo-1-nn_hls)
+               DO ji = mi0(jpiglo-1-nn_hls,nn_hls), mi1(jpiglo-1-nn_hls,nn_hls)
                   DO jj = 1, jpj
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_south ) THEN                            ! --- South --- !
-               DO jj = mj0(2+nn_hls), mj1(2+nn_hls)
+               DO jj = mj0(2+nn_hls,nn_hls), mj1(2+nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
                END DO
             ENDIF
             IF( lk_north ) THEN                            ! --- North --- !
-               DO jj = mj0(jpjglo-1-nn_hls), mj1(jpjglo-1-nn_hls)
+               DO jj = mj0(jpjglo-1-nn_hls,nn_hls), mj1(jpjglo-1-nn_hls,nn_hls)
                   DO ji = 1, jpi
                      pww(ji,jj,jk) = 0._wp
                   END DO
diff --git a/src/OCE/FLO/floblk.F90 b/src/OCE/FLO/floblk.F90
index 4d7450719..95b0682aa 100644
--- a/src/OCE/FLO/floblk.F90
+++ b/src/OCE/FLO/floblk.F90
@@ -105,10 +105,10 @@ CONTAINS
       iloop = 0
 222   DO jfl = 1, jpnfl
 # if ! defined key_mpi_off
-         IF( iil(jfl) >= mig(Nis0) .AND. iil(jfl) <= mig(Nie0) .AND.   &
-             ijl(jfl) >= mjg(Njs0) .AND. ijl(jfl) <= mjg(Nje0)   ) THEN
-            iiloc(jfl) = iil(jfl) - mig(1) + 1
-            ijloc(jfl) = ijl(jfl) - mjg(1) + 1
+         IF( iil(jfl) >= mig(Nis0,nn_hls) .AND. iil(jfl) <= mig(Nie0,nn_hls) .AND.   &
+             ijl(jfl) >= mjg(Njs0,nn_hls) .AND. ijl(jfl) <= mjg(Nje0,nn_hls)   ) THEN
+            iiloc(jfl) = iil(jfl) - mig(1,nn_hls) + 1
+            ijloc(jfl) = ijl(jfl) - mjg(1,nn_hls) + 1
 # else 
             iiloc(jfl) = iil(jfl)
             ijloc(jfl) = ijl(jfl)
diff --git a/src/OCE/FLO/flodom.F90 b/src/OCE/FLO/flodom.F90
index e6536bd9b..2a0210d4e 100644
--- a/src/OCE/FLO/flodom.F90
+++ b/src/OCE/FLO/flodom.F90
@@ -234,8 +234,8 @@ CONTAINS
             zdyad = flo_dstnce( flxx(jfl), flyy(jfl), flxx(jfl), gphif(iimfl(jfl)-1,ijmfl(jfl)-1) )
 
             ! Translation of this distances (in meter) in indexes
-            zgifl(jfl)= (iimfl(jfl)-0.5) + zdxab/e1u(iimfl(jfl)-1,ijmfl(jfl)) + (mig(1)-1)
-            zgjfl(jfl)= (ijmfl(jfl)-0.5) + zdyad/e2v(iimfl(jfl),ijmfl(jfl)-1) + (mjg(1)-1)
+            zgifl(jfl)= (iimfl(jfl)-0.5) + zdxab/e1u(iimfl(jfl)-1,ijmfl(jfl)) + (mig(1,nn_hls)-1)
+            zgjfl(jfl)= (ijmfl(jfl)-0.5) + zdyad/e2v(iimfl(jfl),ijmfl(jfl)-1) + (mjg(1,nn_hls)-1)
             zgkfl(jfl) = (( gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl)+1,Kmm) - flzz(jfl) )* ikmfl(jfl))   &
                &                 / (  gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl)+1,Kmm)                              &
                &                    - gdepw(iimfl(jfl),ijmfl(jfl),ikmfl(jfl) ,Kmm) )                             &
diff --git a/src/OCE/FLO/florst.F90 b/src/OCE/FLO/florst.F90
index 59817e085..c855b1b7a 100644
--- a/src/OCE/FLO/florst.F90
+++ b/src/OCE/FLO/florst.F90
@@ -97,10 +97,10 @@ CONTAINS
          !
          IF( lk_mpp ) THEN
             DO jfl = 1, jpnfl
-               IF( (INT(tpifl(jfl)) >= mig(Nis0)) .AND.   &
-                  &(INT(tpifl(jfl)) <= mig(Nie0)) .AND.   &
-                  &(INT(tpjfl(jfl)) >= mjg(Njs0)) .AND.   &
-                  &(INT(tpjfl(jfl)) <= mjg(Nje0)) ) THEN
+               IF( (INT(tpifl(jfl)) >= mig(Nis0,nn_hls)) .AND.   &
+                  &(INT(tpifl(jfl)) <= mig(Nie0,nn_hls)) .AND.   &
+                  &(INT(tpjfl(jfl)) >= mjg(Njs0,nn_hls)) .AND.   &
+                  &(INT(tpjfl(jfl)) <= mjg(Nje0,nn_hls)) ) THEN
                   iperproc(narea) = iperproc(narea)+1
                ENDIF
             END DO
diff --git a/src/OCE/FLO/flowri.F90 b/src/OCE/FLO/flowri.F90
index 7451c1be5..9c3473ffb 100644
--- a/src/OCE/FLO/flowri.F90
+++ b/src/OCE/FLO/flowri.F90
@@ -103,8 +103,8 @@ CONTAINS
 
          IF( lk_mpp ) THEN
                
-            iafloc = mi1( iafl )
-            ibfloc = mj1( ibfl )
+            iafloc = mi1( iafl, nn_hls )
+            ibfloc = mj1( ibfl, nn_hls )
  
             IF( Nis0 <= iafloc .AND. iafloc <= Nie0 .AND. &
               & Njs0 <= ibfloc .AND. ibfloc <= Nje0       ) THEN 
diff --git a/src/OCE/ICB/icbclv.F90 b/src/OCE/ICB/icbclv.F90
index 0121cbb85..bb26759d0 100644
--- a/src/OCE/ICB/icbclv.F90
+++ b/src/OCE/ICB/icbclv.F90
@@ -132,8 +132,8 @@ CONTAINS
                   !
                   newpt%lon = glamt(ji,jj)         ! at t-point (centre of the cell)
                   newpt%lat = gphit(ji,jj)
-                  newpt%xi  = REAL( mig(ji), wp ) - ( nn_hls - 1 )
-                  newpt%yj  = REAL( mjg(jj), wp ) - ( nn_hls - 1 )
+                  newpt%xi  = REAL( mig(ji,nn_hls), wp ) - ( nn_hls - 1 )
+                  newpt%yj  = REAL( mjg(jj,nn_hls), wp ) - ( nn_hls - 1 )
                   !
                   newpt%uvel = 0._wp               ! initially at rest
                   newpt%vvel = 0._wp
diff --git a/src/OCE/ICB/icbdyn.F90 b/src/OCE/ICB/icbdyn.F90
index 323758f4f..0de3d453c 100644
--- a/src/OCE/ICB/icbdyn.F90
+++ b/src/OCE/ICB/icbdyn.F90
@@ -197,10 +197,10 @@ CONTAINS
       IF( ii == ii0  .AND.  ij == ij0  )   RETURN           ! berg remains in the same cell
       !
       ! map into current processor
-      ii0 = mi1( ii0 )
-      ij0 = mj1( ij0 )
-      ii  = mi1( ii  )
-      ij  = mj1( ij  )
+      ii0 = mi1( ii0, nn_hls )
+      ij0 = mj1( ij0, nn_hls )
+      ii  = mi1( ii , nn_hls )
+      ij  = mj1( ij , nn_hls )
       !
       ! assume icb is grounded if tmask(ii,ij,1) or tmask(ii,ij,ikb), depending of the option is not 0
       IF ( ln_M2016 .AND. ln_icb_grd ) THEN
diff --git a/src/OCE/ICB/icbini.F90 b/src/OCE/ICB/icbini.F90
index d7bd2624c..0fd183888 100644
--- a/src/OCE/ICB/icbini.F90
+++ b/src/OCE/ICB/icbini.F90
@@ -140,7 +140,7 @@ CONTAINS
 
       DO_2D( 1, 1, 1, 1 )
          src_calving_hflx(ji,jj) = narea
-         src_calving     (ji,jj) = nicbpack * mjg(jj) + mig(ji)
+         src_calving     (ji,jj) = nicbpack * mjg(jj,nn_hls) + mig(ji,nn_hls)
       END_2D
       CALL lbc_lnk( 'icbini', src_calving_hflx, 'T', 1._wp )
       CALL lbc_lnk( 'icbini', src_calving     , 'T', 1._wp )
@@ -156,7 +156,7 @@ CONTAINS
          i2 = INT( i3/nicbpack )
          i1 = i3 - i2*nicbpack
          i3 = INT( src_calving_hflx(ji,jj) )
-         IF( i1 == mig(ji) .AND. i3 == narea ) THEN
+         IF( i1 == mig(ji,nn_hls) .AND. i3 == narea ) THEN
             IF( nicbdi < 0 ) THEN   ;   nicbdi = ji
             ELSE                    ;   nicbei = ji
             ENDIF
@@ -172,7 +172,7 @@ CONTAINS
          i2 = INT( i3/nicbpack )
          i1 = i3 - i2*nicbpack
          i3 = INT( src_calving_hflx(ji,jj) )
-         IF( i2 == mjg(jj) .AND. i3 == narea ) THEN
+         IF( i2 == mjg(jj,nn_hls) .AND. i3 == narea ) THEN
             IF( nicbdj < 0 ) THEN   ;   nicbdj = jj
             ELSE                    ;   nicbej = jj
             ENDIF
@@ -361,8 +361,8 @@ CONTAINS
                 rn_test_box(1) < glamt(ji,jj) .AND. glamt(ji,jj) < rn_test_box(2) .AND.   &
                 rn_test_box(3) < gphit(ji,jj) .AND. gphit(ji,jj) < rn_test_box(4) ) THEN
                localberg%mass_scaling = rn_mass_scaling(iberg)
-               localpt%xi = REAL( mig(ji) - (nn_hls-1), wp )
-               localpt%yj = REAL( mjg(jj) - (nn_hls-1), wp )
+               localpt%xi = REAL( mig(ji,nn_hls) - (nn_hls-1), wp )
+               localpt%yj = REAL( mjg(jj,nn_hls) - (nn_hls-1), wp )
                CALL icb_utl_interp( localpt%xi, localpt%yj, plat=localpt%lat, plon=localpt%lon )   
                localpt%mass      = rn_initial_mass     (iberg)
                localpt%thickness = rn_initial_thickness(iberg)
diff --git a/src/OCE/ICB/icblbc.F90 b/src/OCE/ICB/icblbc.F90
index fa901486a..6a8823f1a 100644
--- a/src/OCE/ICB/icblbc.F90
+++ b/src/OCE/ICB/icblbc.F90
@@ -90,9 +90,9 @@ CONTAINS
          this => first_berg
          DO WHILE( ASSOCIATED(this) )
             pt => this%current_point
-            IF( pt%xi > REAL(mig(nicbei),wp) + 0.5_wp ) THEN
+            IF( pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp ) THEN
                pt%xi = ricb_right + MOD(pt%xi, 1._wp ) - 1._wp
-            ELSE IF( pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp ) THEN
+            ELSE IF( pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp ) THEN
                pt%xi = ricb_left + MOD(pt%xi, 1._wp )
             ENDIF
             this => this%next
@@ -125,10 +125,10 @@ CONTAINS
       DO WHILE( ASSOCIATED(this) )
          pt => this%current_point
          ijne = INT( pt%yj + 0.5 )
-         IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp ) THEN
+         IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp ) THEN
             !
             iine = INT( pt%xi + 0.5 )
-            ipts  = nicbfldpts (mi1(iine))
+            ipts  = nicbfldpts (mi1(iine,nn_hls))
             !
             ! moving across the cut line means both position and
             ! velocity must change
@@ -228,7 +228,7 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( ipe_E >= 0 .AND. pt%xi > REAL(mig(nicbei),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( ipe_E >= 0 .AND. pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_e = ibergs_to_send_e + 1
@@ -241,7 +241,7 @@ CONTAINS
                ! now pack it into buffer and delete from list
                CALL icb_pack_into_buffer( tmpberg, obuffer_e, ibergs_to_send_e)
                CALL icb_utl_delete(first_berg, tmpberg)
-            ELSE IF( ipe_W >= 0 .AND. pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp - (nn_hls-1) ) THEN
+            ELSE IF( ipe_W >= 0 .AND. pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_w = ibergs_to_send_w + 1
@@ -320,7 +320,7 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( ipe_N >= 0 .AND. pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( ipe_N >= 0 .AND. pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_n = ibergs_to_send_n + 1
@@ -330,7 +330,7 @@ CONTAINS
                ENDIF
                CALL icb_pack_into_buffer( tmpberg, obuffer_n, ibergs_to_send_n)
                CALL icb_utl_delete(first_berg, tmpberg)
-            ELSE IF( ipe_S >= 0 .AND. pt%yj < REAL(mjg(nicbdj),wp) - 0.5_wp - (nn_hls-1) ) THEN
+            ELSE IF( ipe_S >= 0 .AND. pt%yj < REAL(mjg(nicbdj,nn_hls),wp) - 0.5_wp - (nn_hls-1) ) THEN
                tmpberg => this
                this => this%next
                ibergs_to_send_s = ibergs_to_send_s + 1
@@ -441,10 +441,10 @@ CONTAINS
          this => first_berg
          DO WHILE (ASSOCIATED(this))
             pt => this%current_point
-            IF( pt%xi < REAL(mig(nicbdi),wp) - 0.5_wp - (nn_hls-1) .OR. &
-                pt%xi > REAL(mig(nicbei),wp) + 0.5_wp - (nn_hls-1) .OR. &
-                pt%yj < REAL(mjg(nicbdj),wp) - 0.5_wp - (nn_hls-1) .OR. &
-                pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+            IF( pt%xi < REAL(mig(nicbdi,nn_hls),wp) - 0.5_wp - (nn_hls-1) .OR. &
+                pt%xi > REAL(mig(nicbei,nn_hls),wp) + 0.5_wp - (nn_hls-1) .OR. &
+                pt%yj < REAL(mjg(nicbdj,nn_hls),wp) - 0.5_wp - (nn_hls-1) .OR. &
+                pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                i = i + 1
                WRITE(numicb,*) 'berg lost in halo: ', this%number(:)
                WRITE(numicb,*) '                   ', nimpp, njmpp
@@ -514,8 +514,8 @@ CONTAINS
                DO WHILE (ASSOCIATED(this))
                   pt => this%current_point
                   iine = INT( pt%xi + 0.5 ) + (nn_hls-1)
-                  iproc = nicbflddest(mi1(iine))
-                  IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+                  iproc = nicbflddest(mi1(iine,nn_hls))
+                  IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                      IF( iproc == ifldproc ) THEN
                         !
                         IF( iproc /= narea ) THEN
@@ -593,9 +593,9 @@ CONTAINS
                   pt => this%current_point
                   iine = INT( pt%xi + 0.5 ) + (nn_hls-1)
                   ijne = INT( pt%yj + 0.5 ) + (nn_hls-1)
-                  ipts  = nicbfldpts (mi1(iine))
-                  iproc = nicbflddest(mi1(iine))
-                  IF( pt%yj > REAL(mjg(nicbej),wp) + 0.5_wp - (nn_hls-1) ) THEN
+                  ipts  = nicbfldpts (mi1(iine,nn_hls))
+                  iproc = nicbflddest(mi1(iine,nn_hls))
+                  IF( pt%yj > REAL(mjg(nicbej,nn_hls),wp) + 0.5_wp - (nn_hls-1) ) THEN
                      IF( iproc == ifldproc ) THEN
                         !
                         ! moving across the cut line means both position and
diff --git a/src/OCE/ICB/icbrst.F90 b/src/OCE/ICB/icbrst.F90
index 092b56e58..9e7560197 100644
--- a/src/OCE/ICB/icbrst.F90
+++ b/src/OCE/ICB/icbrst.F90
@@ -90,8 +90,8 @@ CONTAINS
             ii = INT( localpt%xi + 0.5 ) + ( nn_hls-1 )
             ij = INT( localpt%yj + 0.5 ) + ( nn_hls-1 )
             ! Only proceed if this iceberg is on the local processor (excluding halos).
-            IF ( ii >= mig(Nis0) .AND. ii <= mig(Nie0) .AND.   &
-           &     ij >= mjg(Njs0) .AND. ij <= mjg(Nje0) ) THEN           
+            IF ( ii >= mig(Nis0,nn_hls) .AND. ii <= mig(Nie0,nn_hls) .AND.   &
+           &     ij >= mjg(Njs0,nn_hls) .AND. ij <= mjg(Nje0,nn_hls) ) THEN           
 
                CALL iom_get( ncid, jpdom_unknown, 'number', zdata(:) , ktime=jn, kstart=(/1/), kcount=(/nkounts/) )
                localberg%number(:) = INT(zdata(:))
@@ -244,16 +244,16 @@ CONTAINS
          ! global attributes
          IF( lk_mpp ) THEN
             ! Set domain parameters (assume jpdom_local_full)
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                        )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                      )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1         , 2          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo    , Nj0glo     /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0      , Nj_0       /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig0(Nie0), mjg0(Nje0) /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0         , 0          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0         , 0          /) )
-            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                        )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                          )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                        )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1          , 2           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo     , Nj0glo      /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0       , Nj_0        /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig(Nis0,0), mjg(Njs0,0) /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig(Nie0,0), mjg(Nje0,0) /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0          , 0           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0          , 0           /) )
+            nret = NF90_PUT_ATT( ncid, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                          )
          ENDIF
          
          IF (associated(first_berg)) then
diff --git a/src/OCE/ICB/icbthm.F90 b/src/OCE/ICB/icbthm.F90
index c39500dbe..89999acfd 100644
--- a/src/OCE/ICB/icbthm.F90
+++ b/src/OCE/ICB/icbthm.F90
@@ -112,9 +112,9 @@ CONTAINS
          zxi  = pt%xi                                      ! position in (i,j) referential
          zyj  = pt%yj
          ii  = INT( zxi + 0.5 )                            ! T-cell of the berg
-         ii  = mi1( ii + (nn_hls-1) )
+         ii  = mi1( ii + (nn_hls-1), nn_hls )
          ij  = INT( zyj + 0.5 )              
-         ij  = mj1( ij + (nn_hls-1) )
+         ij  = mj1( ij + (nn_hls-1), nn_hls )
          zVol = zT * zW * zL
 
          ! Environment
diff --git a/src/OCE/ICB/icbutl.F90 b/src/OCE/ICB/icbutl.F90
index 873245fcd..0666a6143 100644
--- a/src/OCE/ICB/icbutl.F90
+++ b/src/OCE/ICB/icbutl.F90
@@ -312,18 +312,18 @@ CONTAINS
       !
       IF (TRIM(cd_type) == 'T' ) THEN
          ierr = 0
-         IF    ( kii <  mig( 1 ) ) THEN   ;  ierr = ierr + 1
-         ELSEIF( kii >= mig(jpi) ) THEN   ;  ierr = ierr + 1
+         IF    ( kii <  mig( 1 ,nn_hls) ) THEN   ;  ierr = ierr + 1
+         ELSEIF( kii >= mig(jpi,nn_hls) ) THEN   ;  ierr = ierr + 1
          ENDIF
          !
-         IF    ( kij <  mjg( 1 ) ) THEN   ;   ierr = ierr + 1
-         ELSEIF( kij >= mjg(jpj) ) THEN   ;   ierr = ierr + 1
+         IF    ( kij <  mjg( 1 ,nn_hls) ) THEN   ;   ierr = ierr + 1
+         ELSEIF( kij >= mjg(jpj,nn_hls) ) THEN   ;   ierr = ierr + 1
          ENDIF
          !
          IF ( ierr > 0 ) THEN
             WRITE(numicb,*) 'bottom left corner T point out of bound'
-            WRITE(numicb,*) pi, kii, mig( 1 ), mig(jpi)
-            WRITE(numicb,*) pj, kij, mjg( 1 ), mjg(jpj)
+            WRITE(numicb,*) pi, kii, mig( 1,nn_hls ), mig(jpi,nn_hls)
+            WRITE(numicb,*) pj, kij, mjg( 1,nn_hls ), mjg(jpj,nn_hls)
             WRITE(numicb,*) pmsk
             CALL FLUSH(numicb)
             CALL ctl_stop('STOP','icb_utl_bilin_e: an icebergs coordinates is out of valid range (out of bound error).'       , &
@@ -335,13 +335,13 @@ CONTAINS
       ! find position in this processor. Prevent near edge problems (see #1389)
       ! (PM) will be useless if extra halo is used in NEMO
       !
-      IF    ( kii <= mig(1)-1 ) THEN   ;   kii = 0
-      ELSEIF( kii  > mig(jpi) ) THEN   ;   kii = jpi
-      ELSE                             ;   kii = mi1(kii)
+      IF    ( kii <= mig(1,nn_hls)-1 ) THEN   ;   kii = 0
+      ELSEIF( kii  > mig(jpi,nn_hls) ) THEN   ;   kii = jpi
+      ELSE                                    ;   kii = mi1(kii,nn_hls)
       ENDIF
-      IF    ( kij <= mjg(1)-1 ) THEN   ;   kij = 0
-      ELSEIF( kij  > mjg(jpj) ) THEN   ;   kij = jpj
-      ELSE                             ;   kij = mj1(kij)
+      IF    ( kij <= mjg(1,nn_hls)-1 ) THEN   ;   kij = 0
+      ELSEIF( kij  > mjg(jpj,nn_hls) ) THEN   ;   kij = jpj
+      ELSE                                    ;   kij = mj1(kij,nn_hls)
       ENDIF
       !
       ! define mask array 
@@ -462,8 +462,8 @@ CONTAINS
       zj = pj - REAL(ij,wp)
 
       ! conversion to local domain (no need to do a sanity check already done in icbpos)
-      ii = mi1(ii) + (nn_hls-1)
-      ij = mj1(ij) + (nn_hls-1)
+      ii = mi1(ii,nn_hls) + (nn_hls-1)
+      ij = mj1(ij,nn_hls) + (nn_hls-1)
       !
       IF(    0.0_wp <= zi .AND. zi < 0.5_wp   ) THEN
          IF( 0.0_wp <= zj .AND. zj < 0.5_wp        )   THEN        !  NE quadrant
diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index 9a1f1c859..39a8b05a2 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -1202,7 +1202,6 @@ CONTAINS
       CHARACTER(LEN=1)               ::   cl_type     ! local value of cd_type
       LOGICAL                        ::   ll_only3rd  ! T => if kstart, kcount present then *only* use values for 3rd spatial dimension.
       INTEGER                        ::   inlev       ! number of levels for 3D data
-      INTEGER                        ::   ihls        ! local value of the halo size
       REAL(dp)                       ::   gma, gmi
       !---------------------------------------------------------------------
       CHARACTER(LEN=lc)                               ::   context
@@ -1299,7 +1298,7 @@ CONTAINS
                ENDIF
             ELSE   !   not a 1D array as pv_r1d requires jpdom_unknown
                ! we do not read the overlap and the extra-halos -> from Nis0 to Nie0 and from Njs0 to Nje0
-               IF( idom == jpdom_global )   istart(1:2) = (/ mig0(Nis0), mjg0(Njs0) /)
+               IF( idom == jpdom_global )   istart(1:2) = (/ mig(Nis0,0), mjg(Njs0,0) /)
                icnt(1:2) = (/ Ni_0, Nj_0 /)
                IF( PRESENT(pv_r3d) ) THEN
                   IF( idom == jpdom_auto_xy ) THEN
@@ -1334,15 +1333,12 @@ CONTAINS
                IF( irankpv == 2 )   ishape(1:2) = SHAPE(pv_r2d)
                IF( irankpv == 3 )   ishape(1:3) = SHAPE(pv_r3d)
                IF(     ishape(1) == Ni_0   .AND. ishape(2) == Nj_0   ) THEN           ! array with 0 halo
-                  ihls = 0
                   ix1 = 1      ;   ix2 = Ni_0     ;   iy1 = 1      ;   iy2 = Nj_0     ! index of the array to be read
                   ctmp1 = 'd(:,:'
                ELSEIF( ishape(1) == jpi    .AND. ishape(2) == jpj    ) THEN           ! array with nn_hls halos
-                  ihls = nn_hls
                   ix1 = Nis0   ;   ix2 = Nie0     ;   iy1 = Njs0   ;   iy2 = Nje0     ! index of the array to be read
                   ctmp1 = 'd(Nis0:Nie0,Njs0:Nje0'
                ELSEIF( ishape(1) == Ni_0+1 .AND. ishape(2) == Nj_0+1 ) THEN           ! nn_hls = 2 and array with 1 halo
-                  ihls = 1
                   ix1 = 2      ;   ix2 = Ni_0+1   ;   iy1 = 2      ;   iy2 = Nj_0+1   ! index of the array to be read
                   ctmp1 = 'd(2:Ni_0+1,2:Ni_0+1'
                ELSE
@@ -1368,16 +1364,16 @@ CONTAINS
             IF( istop == nstop ) THEN   ! no additional errors until this point...
                IF(lwp) WRITE(numout,"(10x,' read ',a,' (rec: ',i6,') in ',a,' ok')") TRIM(cdvar), itime, TRIM(iom_file(kiomid)%name)
 
+               cl_type = 'T'
+               IF( PRESENT(cd_type) )   cl_type = cd_type
                !--- halos and NP folding (NP folding to be done even if no halos)
                IF( idom /= jpdom_unknown .AND. cl_type /= 'Z' .AND. ( PRESENT(pv_r2d) .OR. PRESENT(pv_r3d) ) ) THEN
-                  cl_type = 'T'
-                  IF( PRESENT(cd_type) )   cl_type = cd_type
                   zsgn = 1._wp
                   IF( PRESENT(psgn   ) )   zsgn    = psgn
                   IF(     PRESENT(pv_r2d) .AND. llok ) THEN
-                     CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill, khls = ihls )
+                     CALL lbc_lnk( 'iom', pv_r2d, cl_type, zsgn, kfillmode = kfill )
                   ELSEIF( PRESENT(pv_r3d) .AND. llok ) THEN
-                     CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill, khls = ihls )
+                     CALL lbc_lnk( 'iom', pv_r3d, cl_type, zsgn, kfillmode = kfill )
                   ENDIF
                ENDIF
                !
@@ -2335,11 +2331,11 @@ CONTAINS
       LOGICAL, INTENT(IN) :: ldxios, ldrxios
       !!----------------------------------------------------------------------
       !
-      CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig0(Nis0)-1,jbegin=mjg0(Njs0)-1,ni=Ni_0,nj=Nj_0)
+      CALL iom_set_domain_attr("grid_"//cdgrd,ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig(Nis0,0)-1,jbegin=mjg(Njs0,0)-1,ni=Ni_0,nj=Nj_0)
       CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = -nn_hls, data_ni=jpi, data_jbegin = -nn_hls, data_nj=jpj)
 
       CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", ni_glo = Ni0glo, nj_glo = Nj0glo,   &
-         &                     ibegin = mig0(Nis0) - 1, jbegin = mjg0(Njs0) - 1, ni = Ni_0, nj = Nj_0)
+         &                     ibegin = mig(Nis0,0) - 1, jbegin = mjg(Njs0,0) - 1, ni = Ni_0, nj = Nj_0)
       CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", data_dim=2, data_ibegin = 0, data_ni=Ni_0, data_jbegin = 0, data_nj=Nj_0)
 
       IF( ln_tile ) THEN
@@ -2465,7 +2461,7 @@ CONTAINS
       !
 !      CALL dom_ngb( -168.53_wp, 65.03_wp, ix, iy, 'T' ) !  i-line that passes through Bering Strait: Reference latitude (used in plots)
       CALL dom_ngb( 180.0_wp, 90.0_wp, ix, iy, 'T' ) !  i-line that passes near the North Pole : Reference latitude (used in plots)
-      CALL iom_set_domain_attr("gznl", ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig0(Nis0)-1, jbegin=mjg0(Njs0)-1, ni=Ni_0, nj=Nj_0)
+      CALL iom_set_domain_attr("gznl", ni_glo=Ni0glo, nj_glo=Nj0glo, ibegin=mig(Nis0,0)-1, jbegin=mjg(Njs0,0)-1, ni=Ni_0, nj=Nj_0)
       CALL iom_set_domain_attr("gznl", data_dim=2, data_ibegin=0, data_ni=Ni_0, data_jbegin=0, data_nj=Nj_0)
       CALL iom_set_domain_attr("gznl", lonvalue = real(zlon, dp),   &
          &                             latvalue = real(RESHAPE(plat(Nis0:Nie0, Njs0:Nje0),(/ Ni_0*Nj_0 /)),dp))
diff --git a/src/OCE/IOM/iom_nf90.F90 b/src/OCE/IOM/iom_nf90.F90
index 171ef53bf..6a95cdd39 100644
--- a/src/OCE/IOM/iom_nf90.F90
+++ b/src/OCE/IOM/iom_nf90.F90
@@ -146,16 +146,16 @@ CONTAINS
             END SELECT
                                CALL iom_nf90_check(NF90_DEF_DIM( if90id, 'time_counter', NF90_UNLIMITED, idmy ), clinfo)
             ! global attributes
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                        ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_number'         , narea-1                      ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1        , 2           /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo    , Nj0glo     /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0      , Nj_0       /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig0(Nis0), mjg0(Njs0) /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig0(Nie0), mjg0(Nje0) /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0         , 0          /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0         , 0          /) ), clinfo)
-            CALL iom_nf90_check(NF90_PUT_ATT( if90id, NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                        ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_number_total'   , jpnij                          ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_number'         , narea-1                        ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_dimensions_ids' , (/ 1         , 2            /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_size_global'    , (/ Ni0glo     , Nj0glo      /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_size_local'     , (/ Ni_0       , Nj_0        /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_position_first' , (/ mig(Nis0,0), mjg(Njs0,0) /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_position_last'  , (/ mig(Nie0,0), mjg(Nje0,0) /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_halo_size_start', (/ 0          , 0           /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_halo_size_end'  , (/ 0          , 0           /) ), clinfo)
+            CALL iom_nf90_check(NF90_PUT_ATT(if90id,NF90_GLOBAL, 'DOMAIN_type'           , 'BOX'                          ), clinfo)
          ELSE                          !* the file should be open for read mode so it must exist...
             CALL ctl_stop( TRIM(clinfo), ' should be impossible case...' )
          ENDIF
diff --git a/src/OCE/IOM/prtctl.F90 b/src/OCE/IOM/prtctl.F90
index 6fcca35f9..863932c9e 100644
--- a/src/OCE/IOM/prtctl.F90
+++ b/src/OCE/IOM/prtctl.F90
@@ -472,22 +472,22 @@ CONTAINS
          !
          idg = MAXVAL( (/ nall_ictls(jl), nall_ictle(jl), nall_jctls(jl), nall_jctle(jl) /) )   ! temporary use of idg
          idg = INT(LOG10(REAL(idg,wp))) + 1                                                     ! how many digits do we use?
-         idg2 = MAXVAL( (/ mig0(nall_ictls(jl)), mig0(nall_ictle(jl)), mjg0(nall_jctls(jl)), mjg0(nall_jctle(jl)) /) )
+         idg2 = MAXVAL( (/ mig(nall_ictls(jl),0), mig(nall_ictle(jl),0), mjg(nall_jctls(jl),0), mjg(nall_jctle(jl),0) /) )
          idg2 = INT(LOG10(REAL(idg2,wp))) + 1                                                   ! how many digits do we use?
          WRITE(clfmt2, "('(18x, 13a1, a9, i', i1, ', a2, i',i1,', a2, 13a1)')") idg, idg2
          WRITE(clfmt3, "('(18x, a1, ', i2,'x, a1)')") 13+9+idg+2+idg2+2+13 - 2
          WRITE(clfmt4, "('(', i2,'x, a9, i', i1,', a2, i', i1,', a2, ', i2,'x, a9, i', i1,', a2, i', i1,', a2)')") &
             &          18-7, idg, idg2, 13+9+idg+2+idg2+2+13 - (2+idg+2+idg2+2+8), idg, idg2
-         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctle = ', nall_jctle(jl), ' (', mjg0(nall_jctle(jl)), ') ', ('-', ji=1,13)
+         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctle = ', nall_jctle(jl), ' (', mjg(nall_jctle(jl),0), ') ', ('-', ji=1,13)
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
-         WRITE(inum,clfmt4)                 ' ictls = ', nall_ictls(jl), ' (', mig0(nall_ictls(jl)), ') ',   &
-            &                               ' ictle = ', nall_ictle(jl), ' (', mig0(nall_ictle(jl)), ') '
+         WRITE(inum,clfmt4)                 ' ictls = ', nall_ictls(jl), ' (', mig(nall_ictls(jl),0), ') ',   &
+            &                               ' ictle = ', nall_ictle(jl), ' (', mig(nall_ictle(jl),0), ') '
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
          WRITE(inum,clfmt3) '|', '|'
-         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctls = ', nall_jctls(jl), ' (', mjg0(nall_jctls(jl)), ') ', ('-', ji=1,13)
+         WRITE(inum,clfmt2) ('-', ji=1,13), ' jctls = ', nall_jctls(jl), ' (', mjg(nall_jctls(jl),0), ') ', ('-', ji=1,13)
          WRITE(inum,*)
          WRITE(inum,*)
          !
diff --git a/src/OCE/ISF/isfcpl.F90 b/src/OCE/ISF/isfcpl.F90
index b035cd5e6..4989dc850 100644
--- a/src/OCE/ISF/isfcpl.F90
+++ b/src/OCE/ISF/isfcpl.F90
@@ -736,7 +736,8 @@ CONTAINS
       END IF
       !
       ! update isfpts structure
-      sisfpts(kpts) = isfcons(mig(ki), mjg(kj), kk, pratio * pdvol, pratio * pdsal, pratio * pdtem, glamt(ki,kj), gphit(ki,kj), ifind )
+      sisfpts(kpts) = isfcons(mig(ki,nn_hls), mjg(kj,nn_hls), kk, pratio * pdvol, pratio * pdsal, pratio * pdtem,   &
+         &                    glamt(ki,kj), gphit(ki,kj), ifind )
       !
    END SUBROUTINE update_isfpts
    !
@@ -761,8 +762,8 @@ CONTAINS
       IF ( kfind == 1 ) CALL dom_ngb( plon, plat, iig, ijg,'T', kk)
       !
       ! fill the correction array
-      DO jj = mj0(ijg),mj1(ijg)
-         DO ji = mi0(iig),mi1(iig)
+      DO jj = mj0(ijg,nn_hls),mj1(ijg,nn_hls)
+         DO ji = mi0(iig,nn_hls),mi1(iig,nn_hls)
             ! correct the vol_flx and corresponding heat/salt flx in the closest cell
             risfcpl_cons_vol(ji,jj,kk)        =  risfcpl_cons_vol(ji,jj,kk       ) + pvolinc
             risfcpl_cons_tsc(ji,jj,kk,jp_sal) =  risfcpl_cons_tsc(ji,jj,kk,jp_sal) + psalinc
diff --git a/src/OCE/LBC/lbc_lnk_call_generic.h90 b/src/OCE/LBC/lbc_lnk_call_generic.h90
index 0d2e2514b..f735ac909 100644
--- a/src/OCE/LBC/lbc_lnk_call_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_call_generic.h90
@@ -27,7 +27,7 @@
       &                   , pt21, cdna21, psgn21, pt22, cdna22, psgn22, pt23, cdna23, psgn23, pt24, cdna24, psgn24  &
       &                   , pt25, cdna25, psgn25, pt26, cdna26, psgn26, pt27, cdna27, psgn27, pt28, cdna28, psgn28  &
       &                   , pt29, cdna29, psgn29, pt30, cdna30, psgn30                                              &
-      &                   , kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+      &                   , kfillmode, pfillval, lsend, lrecv, ld4only )
       !!---------------------------------------------------------------------
       CHARACTER(len=*)     ,                   INTENT(in   ) ::   cdname  ! name of the calling subroutine
       REAL(PRECISION), DIMENSION(DIMS)          , TARGET, CONTIGUOUS, INTENT(inout) ::   pt1        ! arrays on which the lbc is applied
@@ -50,7 +50,6 @@
          &                                                        psgn30
       INTEGER              , OPTIONAL        , INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION)      , OPTIONAL        , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER              , OPTIONAL        , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8), OPTIONAL        , INTENT(in   ) ::   lsend, lrecv   ! indicate how communications are to be carried out
       LOGICAL              , OPTIONAL        , INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
       !!
@@ -96,15 +95,11 @@
       IF( PRESENT(psgn29) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt29, cdna29, psgn29, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
       IF( PRESENT(psgn30) )   CALL load_ptr_/**/XD/**/_/**/PRECISION( pt30, cdna30, psgn30, ptab_ptr, cdna_ptr, psgn_ptr, kfld )
       !
-#if ! defined key_mpi2     
       IF( nn_comm == 1 ) THEN 
-         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+         CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only )
       ELSE
-         CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+         CALL lbc_lnk_neicoll( cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, lsend, lrecv, ld4only )
       ENDIF
-#else
-      CALL lbc_lnk_pt2pt(   cdname, ptab_ptr, cdna_ptr, psgn_ptr, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
-#endif
       !
    END SUBROUTINE lbc_lnk_call_/**/XD/**/_/**/PRECISION
 
diff --git a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90 b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
index 3ce416fe1..d6bd30380 100644
--- a/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_neicoll_generic.h90
@@ -1,5 +1,5 @@
 
-   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+   SUBROUTINE lbc_lnk_neicoll_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -7,265 +7,311 @@
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc
       LOGICAL,              OPTIONAL, INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
       !
       INTEGER  ::    ji,  jj,  jk , jl,  jf, jn      ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipk, ipl, ipf          ! dimension of the input array
       INTEGER  ::   ip0i, ip1i, im0i, im1i
       INTEGER  ::   ip0j, ip1j, im0j, im1j
       INTEGER  ::   ishti, ishtj, ishti2, ishtj2
-      INTEGER  ::   iszS, iszR
+      INTEGER  ::   inbS, inbR, iszS, iszR
       INTEGER  ::   ierr
-      INTEGER  ::   ihls, idx
+      INTEGER  ::   ihls, ihlsmax, idx
       INTEGER  ::   impi_nc
       INTEGER  ::   ifill_nfd
       INTEGER, DIMENSION(4)  ::   iwewe, issnn
-      INTEGER, DIMENSION(8)  ::   isizei, ishtSi, ishtRi, ishtPi
-      INTEGER, DIMENSION(8)  ::   isizej, ishtSj, ishtRj, ishtPj
-      INTEGER, DIMENSION(8)  ::   ifill, iszall
-      INTEGER, DIMENSION(8)  ::   jnf
+      INTEGER, DIMENSION(  kfld)  ::   ipi, ipj, ipk, ipl   ! dimension of the input array
+      INTEGER, DIMENSION(8,kfld)  ::   ifill
+      INTEGER, DIMENSION(8,kfld)  ::   isizei, ishtSi, ishtRi, ishtPi
+      INTEGER, DIMENSION(8,kfld)  ::   isizej, ishtSj, ishtRj, ishtPj
       INTEGER, DIMENSION(:), ALLOCATABLE  ::   iScnt, iRcnt    ! number of elements to be sent/received
       INTEGER, DIMENSION(:), ALLOCATABLE  ::   iSdpl, iRdpl    ! displacement in halos arrays
-      LOGICAL, DIMENSION(8)  ::   llsend, llrecv
-      REAL(PRECISION) ::   zland
+      LOGICAL, DIMENSION(8,kfld)  ::   llsend, llrecv
       LOGICAL  ::   ll4only                                    ! default: 8 neighbourgs
+      REAL(PRECISION) ::   zland
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------------- !
       !     1. local variables initialization     !
       ! ----------------------------------------- !
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
-      !
-      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. )
-      !
       ! take care of optional parameters
       !
-      ihls = nn_hls       ! default definition
-      IF( PRESENT( khls ) )   ihls = khls
-      IF( ihls > n_hlsmax ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipi /= Ni_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipj /= Nj_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
       ll4only = .FALSE.    ! default definition
       IF( PRESENT(ld4only) )   ll4only = ld4only
       !
-      impi_nc = mpi_nc_com8(ihls)   ! default
-      IF( ll4only )   impi_nc = mpi_nc_com4(ihls)
-      !
       zland = 0._wp                                     ! land filling value: zero by default
       IF( PRESENT( pfillval ) )   zland = pfillval      ! set land value
       !
-      ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
-      IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
-         CALL ctl_stop( 'STOP', 'mpp_nc_generic+lsend and lrecv not yet implemented')
-      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with only one of the two arguments lsend or lrecv'
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ELSE                                              ! default neighbours
-         llsend(:) = mpiSnei(ihls,:) >= 0
-         IF( ll4only )   llsend(5:8) = .FALSE.          ! exclude corners
-         llrecv(:) = mpiRnei(ihls,:) >= 0
-         IF( ll4only )   llrecv(5:8) = .FALSE.          ! exclude corners
-      ENDIF
+      ifill_nfd = jpfillcst                             ! default definition
+      IF( PRESENT(kfillmode) )   ifill_nfd = kfillmode
       !
-      ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
-      ! default definition
-      DO jn = 1, 8
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn) = jpfillperio  ! with self-periodicity
-         ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn) = kfillmode    ! localy defined
-         ELSE                                ;   ifill(jn) = jpfillcst    ! constant value (zland)
-         ENDIF
-      END DO
-      ! take care of "indirect self-periodicity" for the corners
-      DO jn = 5, 8
-         IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpwe))   ifill(jn) = jpfillnothing   ! no bi-perio but ew-perio: do corners later
-         IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpso))   ifill(jn) = jpfillnothing   ! no bi-perio but ns-perio: do corners later
-      END DO
-      ! north fold treatment
-      IF( l_IdoNFold ) THEN
-         ifill_nfd = ifill(jpno)             ! if we are here, this means llrecv(jpno) = .false. and l_SelfPerio(jpno) = .false.
-         ifill( (/jpno/) ) = jpfillnothing   ! we do north fold -> do nothing for northern halo
-      ENDIF
-      
-      ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
-      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
-      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+      ihlsmax = 0
       !
-      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
-      !                   !                       ________________________
-      ip0i =          0   !          im0j = inner |__|________________|__|
-      ip1i =       ihls   !   im1j = inner - halo |  |__|__________|__|  |
-      im1i = ipi-2*ihls   !                       |  |  |          |  |  |
-      im0i = ipi - ihls   !                       |  |  |          |  |  |
-      ip0j =          0   !                       |  |  |          |  |  |
-      ip1j =       ihls   !                       |  |__|__________|__|  |
-      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__|
-      im0j = ipj - ihls   !              ip0j = 0 |__|________________|__|
-      !                   !                    ip0i ip1i        im1i im0i
+      DO jf = 1, kfld
+         !
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls    = ( ipi(jf) - Ni_0 ) / 2
+         ihlsmax = MAX(ihls, ihlsmax)
+         !
+         IF( numcom == -1 ) THEN   ! test input array shape. Use numcom to do these tests only at the beginning of the run
+            IF( MOD( ipi(jf) - Ni_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong i-size: ', ipi(jf), Ni_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( MOD( ipj(jf) - Nj_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong j-size: ', ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ( ipj(jf) - Nj_0 ) / 2 /= ihls ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array as wong i and j-size: ',   &
+                  &           ipi(jf), Ni_0, ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ihls > n_hlsmax ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but for the ', jf,'th input array, ', ihls, ' > n_hlsmax = ',   &
+                  &           n_hlsmax
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+         ENDIF
+         !
+         ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
+         IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
+            CALL ctl_stop( 'STOP', 'mpp_nc_generic+lsend and lrecv not yet implemented')
+         ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
+            WRITE(ctmp1,*) TRIM(cdname), '  is calling lbc_lnk with only one of the two arguments lsend or lrecv'
+            CALL ctl_stop( 'STOP', ctmp1 )
+         ELSE                                                  ! default neighbours
+            llsend(:,jf) = mpiSnei(ihls,:) >= 0
+            IF( ll4only )   llsend(5:8,jf) = .FALSE.           ! exclude corners
+            llrecv(:,jf) = mpiRnei(ihls,:) >= 0
+            IF( ll4only )   llrecv(5:8,jf) = .FALSE.           ! exclude corners
+         ENDIF
+         !
+         ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
+         ! default definition
+         DO jn = 1, 8
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn,jf) = jpfillperio     ! with self-periodicity
+            ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn,jf) = kfillmode       ! localy defined
+            ELSEIF(          ihls == 0 ) THEN   ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ELSE                                ;   ifill(jn,jf) = jpfillcst       ! constant value (zland)
+            ENDIF
+         END DO
+         ! take care of "indirect self-periodicity" for the corners
+         DO jn = 5, 8
+            IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpwe)) ifill(jn,jf) = jpfillnothing ! no bi-perio but ew-perio: do corners later
+            IF(.NOT.l_SelfPerio(jn) .AND. l_SelfPerio(jpso)) ifill(jn,jf) = jpfillnothing ! no bi-perio but ns-perio: do corners later
+         END DO
+         ! north fold treatment
+         IF( l_IdoNFold )   ifill(jpno,jf) = jpfillnothing    ! we do north fold -> do nothing for northern halo
+         
+         ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
+         ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
+         ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+         !
+         ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
+         !                       !                       ________________________
+         ip0i =              0   !          im0j = inner |__|________________|__|
+         ip1i =           ihls   !   im1j = inner - halo |  |__|__________|__|  |
+         im1i = ipi(jf)-2*ihls   !                       |  |  |          |  |  |
+         im0i = ipi(jf) - ihls   !                       |  |  |          |  |  |
+         ip0j =              0   !                       |  |  |          |  |  |
+         ip1j =           ihls   !                       |  |__|__________|__|  |
+         im1j = ipj(jf)-2*ihls   !           ip1j = halo |__|__|__________|__|__|
+         im0j = ipj(jf) - ihls   !              ip0j = 0 |__|________________|__|
+         !                       !                    ip0i ip1i        im1i im0i
+         !
+         iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
+         !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
+         isizei(1:4,jf) = (/ ihls, ihls, Ni_0, Ni_0 /)   ;   isizei(5:8,jf) = ihls                 ! i- count
+         isizej(1:4,jf) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8,jf) = ihls                 ! j- count
+         ishtSi(1:4,jf) = (/ ip1i, im1i, ip1i, ip1i /)   ;   ishtSi(5:8,jf) = ishtSi( iwewe,jf )   ! i- shift  send data
+         ishtSj(1:4,jf) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8,jf) = ishtSj( issnn,jf )   ! j- shift  send data
+         ishtRi(1:4,jf) = (/ ip0i, im0i, ip1i, ip1i /)   ;   ishtRi(5:8,jf) = ishtRi( iwewe,jf )   ! i- shift  recv data
+         ishtRj(1:4,jf) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8,jf) = ishtRj( issnn,jf )   ! j- shift  recv data
+         ishtPi(1:4,jf) = (/ im1i, ip1i, ip1i, ip1i /)   ;   ishtPi(5:8,jf) = ishtPi( iwewe,jf )   ! i- shift perio data
+         ishtPj(1:4,jf) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8,jf) = ishtPj( issnn,jf )   ! j- shift perio data
+         !
+      END DO   ! jf
       !
-      iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
-      !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
-      isizei(1:4) = (/ ihls, ihls, Ni_0, Ni_0 /)   ;   isizei(5:8) = ihls              ! i- count
-      isizej(1:4) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8) = ihls              ! j- count
-      ishtSi(1:4) = (/ ip1i, im1i, ip1i, ip1i /)   ;   ishtSi(5:8) = ishtSi( iwewe )   ! i- shift send data
-      ishtSj(1:4) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8) = ishtSj( issnn )   ! j- shift send data
-      ishtRi(1:4) = (/ ip0i, im0i, ip1i, ip1i /)   ;   ishtRi(5:8) = ishtRi( iwewe )   ! i- shift received data location
-      ishtRj(1:4) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8) = ishtRj( issnn )   ! j- shift received data location
-      ishtPi(1:4) = (/ im1i, ip1i, ip1i, ip1i /)   ;   ishtPi(5:8) = ishtPi( iwewe )   ! i- shift data used for periodicity
-      ishtPj(1:4) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8) = ishtPj( issnn )   ! j- shift data used for periodicity
+      IF( narea == 1 .AND. numcom == -1 )   CALL mpp_report( cdname, SUM(ipk(:))/kfld, SUM(ipl(:))/kfld, kfld, ld_lbc = .TRUE. )
       !
       ! -------------------------------- !
       !     2. Prepare MPI exchanges     !
       ! -------------------------------- !
       !
       ! Allocate local temporary arrays to be sent/received.
-      iszS = COUNT( llsend )
-      iszR = COUNT( llrecv )
-      ALLOCATE( iScnt(iszS), iRcnt(iszR), iSdpl(iszS), iRdpl(iszR) )   ! ok if iszS = 0 or iszR = 0
-      iszall(:) = isizei(:) * isizej(:) * ipk * ipl * ipf
-      iScnt(:) = PACK( iszall, mask = llsend )                                       ! ok if mask = .false.
-      iRcnt(:) = PACK( iszall, mask = llrecv )
-      IF( iszS > 0 )   iSdpl(1) = 0
-      DO jn = 2,iszS
+      inbS = COUNT( ANY(llsend,dim=2) )   ! number of snd neighbourgs
+      inbR = COUNT( ANY(llrecv,dim=2) )   ! number of rcv neighbourgs
+      ALLOCATE( iScnt(inbS), iRcnt(inbR), iSdpl(inbS), iRdpl(inbR) )   ! ok if iszS = 0 or iszR = 0
+
+      iScnt(:) = 0   ;   idx = 0
+      DO jn = 1, 8
+         IF( COUNT( llsend(jn,:) ) > 0 ) THEN   ! we send something to neighbourg jn
+            idx = idx + 1
+            DO jf = 1, kfld
+               IF( llsend(jn,jf) ) iScnt(idx) = iScnt(idx) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            END DO
+         ENDIF
+      END DO
+      IF( inbS > 0 )   iSdpl(1) = 0
+      DO jn = 2,inbS
          iSdpl(jn) = iSdpl(jn-1) + iScnt(jn-1)   ! with _alltoallv: in units of sendtype
       END DO
-      IF( iszR > 0 )   iRdpl(1) = 0
-      DO jn = 2,iszR
+
+      iRcnt(:) = 0   ;   idx = 0
+      DO jn = 1, 8
+         IF( COUNT( llrecv(jn,:) ) > 0 ) THEN   ! we get something from neighbourg jn
+            idx = idx + 1
+            DO jf = 1, kfld
+               IF( llrecv(jn,jf) ) iRcnt(idx) = iRcnt(idx) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            END DO
+         ENDIF
+      END DO
+      IF( inbR > 0 )   iRdpl(1) = 0
+      DO jn = 2,inbR
          iRdpl(jn) = iRdpl(jn-1) + iRcnt(jn-1)   ! with _alltoallv: in units of sendtype
       END DO
-      
+      !
       ! Allocate buffer arrays to be sent/received if needed
-      iszS = SUM(iszall, mask = llsend)                             ! send buffer size
+      iszS = SUM(iScnt)                             ! send buffer size
       IF( ALLOCATED(BUFFSND) ) THEN
+         CALL mpi_waitall(8, nreq_p2p, MPI_STATUSES_IGNORE, ierr)   ! needed only if PREVIOUS call was using nn_comm = 1 (for tests)
          IF( SIZE(BUFFSND) < iszS )    DEALLOCATE(BUFFSND)          ! send buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFSND) )   ALLOCATE( BUFFSND(iszS) )
-      iszR = SUM(iszall, mask = llrecv)                             ! recv buffer size
+      iszR = SUM(iRcnt)                             ! recv buffer size
       IF( ALLOCATED(BUFFRCV) ) THEN
          IF( SIZE(BUFFRCV) < iszR )    DEALLOCATE(BUFFRCV)          ! recv buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFRCV) )   ALLOCATE( BUFFRCV(iszR) )
-
+      !
       ! fill sending buffer with ptab(jf)%pt4d
-      idx = 1
+      idx = 0
       DO jn = 1, 8
-         IF( llsend(jn) ) THEN
-            ishti = ishtSi(jn)
-            ishtj = ishtSj(jn)
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               BUFFSND(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
-               idx = idx + 1
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         ENDIF
+         DO jf = 1, kfld
+            IF( llsend(jn,jf) ) THEN
+               ishti = ishtSi(jn,jf)
+               ishtj = ishtSj(jn,jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  idx = idx + 1
+                  BUFFSND(idx) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            ENDIF
+         END DO
       END DO
       !
       ! ------------------------------------------------ !
       !     3. Do all MPI exchanges in 1 unique call     !
       ! ------------------------------------------------ !
       !
-      IF( ln_timing ) CALL tic_tac(.TRUE.)
-      CALL mpi_neighbor_alltoallv (BUFFSND, iScnt, iSdpl, MPI_TYPE, BUFFRCV, iRcnt, iRdpl, MPI_TYPE, impi_nc, ierr)
-      IF( ln_timing ) CALL tic_tac(.FALSE.)
+      IF( ihlsmax > 0 ) THEN
+         impi_nc = mpi_nc_com8( ihlsmax )
+         IF( ll4only )   impi_nc = mpi_nc_com4( ihlsmax )
+#if ! defined key_mpi2
+         IF( ln_timing ) CALL tic_tac( .TRUE.)
+         CALL mpi_Ineighbor_alltoallv(BUFFSND, iScnt, iSdpl, MPI_TYPE, BUFFRCV, iRcnt, iRdpl, MPI_TYPE, impi_nc, nreq_nei, ierr)
+         IF( ln_timing ) CALL tic_tac(.FALSE.)
+#endif
+      ENDIF
+      nreq_p2p = MPI_REQUEST_NULL   ! needed only if we switch between nn_comm = 1 and 2 (for tests)
       !
-      ! ------------------------- !
-      !     4. Fill all halos     !
-      ! ------------------------- !
+      ! --------------------------------- !
+      !     4. Fill all Non-MPI halos     !
+      ! --------------------------------- !
       !
-      idx = 1
-      ! MPI3 bug fix when domain decomposition has 2 columns/rows
-      IF (jpni .eq. 2) THEN
-         IF (jpnj .eq. 2) THEN
-            jnf(1:8) = (/ 2, 1, 4, 3, 8, 7, 6, 5 /)
-         ELSE
-            jnf(1:8) = (/ 2, 1, 3, 4, 6, 5, 8, 7 /)
-         ENDIF
-      ELSE
-         IF (jpnj .eq. 2) THEN
-            jnf(1:8) = (/ 1, 2, 4, 3, 7, 8, 5, 6 /)
-         ELSE
-            jnf(1:8) = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)
-         ENDIF
-      ENDIF
-
+      ! do it first to give (potentially) more time for the communications
       DO jn = 1, 8
-         ishti = ishtRi(jnf(jn))
-         ishtj = ishtRj(jnf(jn))
-         SELECT CASE ( ifill(jnf(jn)) )
-         CASE ( jpfillnothing )               ! no filling 
-         CASE ( jpfillmpi   )                 ! fill with data received by MPI
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idx)
-               idx = idx + 1
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillperio )                 ! use periodicity
-            ishti2 = ishtPi(jnf(jn))
-            ishtj2 = ishtPj(jnf(jn))
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillcopy  )                 ! filling with inner domain values
-            ishti2 = ishtSi(jnf(jn))
-            ishtj2 = ishtSj(jnf(jn))
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         CASE ( jpfillcst   )                 ! filling with constant value
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jnf(jn))  ;  DO ji = 1,isizei(jnf(jn))
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-         END SELECT
+         DO jf = 1, kfld
+            ishti = ishtRi(jn,jf)
+            ishtj = ishtRj(jn,jf)
+            SELECT CASE ( ifill(jn,jf) )
+            CASE ( jpfillnothing )               ! no filling 
+            CASE ( jpfillmpi   )                 ! no it later
+            CASE ( jpfillperio )                 ! use periodicity
+               ishti2 = ishtPi(jn,jf)
+               ishtj2 = ishtPj(jn,jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            CASE ( jpfillcopy  )                 ! filling with inner domain values
+               ishti2 = ishtSi(jn,jf)
+               ishtj2 = ishtSj(jn,jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            CASE ( jpfillcst   )                 ! filling with constant value
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            END SELECT
+         END DO
+      END DO
+      !
+      ! ----------------------------- !
+      !     5. Fill all MPI halos     !
+      ! ----------------------------- !
+      !
+      CALL mpi_wait( nreq_nei, MPI_STATUS_IGNORE, ierr )
+      !
+      idx = 0
+      DO jn = 1, 8
+         DO jf = 1, kfld
+            IF( ifill(jn,jf) == jpfillmpi ) THEN   ! fill with data received by MPI
+               ishti = ishtRi(jn,jf)
+               ishtj = ishtRj(jn,jf)
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  idx = idx + 1
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idx)
+               END DO;   END DO   ;   END DO   ;   END DO
+            ENDIF
+         END DO
       END DO
 
       DEALLOCATE( iScnt, iRcnt, iSdpl, iRdpl )
       IF( iszS > jpi*jpj )   DEALLOCATE(BUFFSND)                    ! blocking Send -> can directly deallocate
       IF( iszR > jpi*jpj )   DEALLOCATE(BUFFRCV)                    ! blocking Recv -> can directly deallocate
-
-      ! potential "indirect self-periodicity" for the corners
+      !
+      ! ---------------------------------------------------------------- !
+      !     6. Potential "indirect self-periodicity" for the corners     !
+      ! ---------------------------------------------------------------- !
+      !
       DO jn = 5, 8
          IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpwe)  ) THEN   ! no bi-perio but ew-perio: corners indirect definition
-            ishti  = ishtRi(jn)
-            ishtj  = ishtRj(jn)
-            ishti2 = ishtPi(jn)   ! use i- shift periodicity
-            ishtj2 = ishtRj(jn)   ! use j- shift recv location: use ew-perio -> ok as filling of the south and north halos now done
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+            DO jf = 1, kfld
+               ishti  = ishtRi(jn,jf)
+               ishtj  = ishtRj(jn,jf)
+               ishti2 = ishtPi(jn,jf)   ! use i- shift periodicity
+               ishtj2 = ishtRj(jn,jf)   ! use j- shift recv location: use ew-perio -> ok as filling of the so and no halos now done
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            END DO
          ENDIF
          IF( .NOT. l_SelfPerio(jn) .AND. l_SelfPerio(jpso)  ) THEN   ! no bi-perio but ns-perio: corners indirect definition
-            ishti  = ishtRi(jn)
-            ishtj  = ishtRj(jn)
-            ishti2 = ishtRi(jn)   ! use i- shift recv location: use ns-perio -> ok as filling of the west and east halos now done
-            ishtj2 = ishtPj(jn)   ! use j- shift periodicity
-            DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-            END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+            DO jf = 1, kfld
+               ishti  = ishtRi(jn,jf)
+               ishtj  = ishtRj(jn,jf)
+               ishti2 = ishtRi(jn,jf)   ! use i- shift recv location: use ns-perio -> ok as filling of the we and ea halos now done
+               ishtj2 = ishtPj(jn,jf)   ! use j- shift periodicity
+               DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)   ;   DO jj = 1,isizej(jn,jf)   ;   DO ji = 1,isizei(jn,jf)
+                  ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+               END DO   ;   END DO   ;   END DO   ;   END DO
+            END DO
          ENDIF
       END DO
       !
       ! ------------------------------- !
-      !     5. north fold treatment     !
+      !     7. north fold treatment     !
       ! ------------------------------- !
       !
       IF( l_IdoNFold ) THEN
-         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold
-         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold
+         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , kfld )   ! self NFold
+         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld )   ! mpi  NFold
          ENDIF
       ENDIF
       !
diff --git a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90 b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
index 395a3e93c..777c9913d 100644
--- a/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
+++ b/src/OCE/LBC/lbc_lnk_pt2pt_generic.h90
@@ -1,6 +1,6 @@
   
-#if ! defined BLOCK_ISEND && ! defined BLOCK_FILL
-   SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, khls, lsend, lrecv, ld4only )
+#if ! defined BLOCK_ISEND && ! defined BLOCK_FILL_nonMPI && ! defined BLOCK_FILL_MPI_RECV
+   SUBROUTINE lbc_lnk_pt2pt_/**/PRECISION( cdname, ptab, cd_nat, psgn, kfld, kfillmode, pfillval, lsend, lrecv, ld4only )
       CHARACTER(len=*)              , INTENT(in   ) ::   cdname      ! name of the calling subroutine
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
@@ -8,161 +8,185 @@
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       INTEGER ,             OPTIONAL, INTENT(in   ) ::   kfillmode   ! filling method for halo over land (default = constant)
       REAL(PRECISION),      OPTIONAL, INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER ,             OPTIONAL, INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       LOGICAL, DIMENSION(8),OPTIONAL, INTENT(in   ) ::   lsend, lrecv  ! communication with other 4 proc
       LOGICAL,              OPTIONAL, INTENT(in   ) ::   ld4only     ! if .T., do only 4-neighbour comm (ignore corners)
       !
       INTEGER  ::     ji,   jj,  jk,  jl,  jf, jn     ! dummy loop indices
-      INTEGER  ::    ipi,  ipj, ipk, ipl, ipf         ! dimension of the input array
       INTEGER  ::   ip0i, ip1i, im0i, im1i
       INTEGER  ::   ip0j, ip1j, im0j, im1j
       INTEGER  ::   ishti, ishtj, ishti2, ishtj2
       INTEGER  ::   ifill_nfd, icomm, ierr
-      INTEGER  ::   ihls, idxs, idxr, iszS, iszR
+      INTEGER  ::   ihls, iisz
+      INTEGER  ::   idxs, idxr, iszS, iszR
       INTEGER, DIMENSION(4)  ::   iwewe, issnn
-      INTEGER, DIMENSION(8)  ::   isizei, ishtSi, ishtRi, ishtPi
-      INTEGER, DIMENSION(8)  ::   isizej, ishtSj, ishtRj, ishtPj
-      INTEGER, DIMENSION(8)  ::   ifill, iszall, ishtS, ishtR
-      INTEGER, DIMENSION(8)  ::   ireq             ! mpi_request id
+      INTEGER, DIMENSION(8)  ::   ibufszS, ibufszR, ishtS, ishtR
       INTEGER, DIMENSION(8)  ::   iStag, iRtag     ! Send and Recv mpi_tag id
-      REAL(PRECISION) ::   zland
-      LOGICAL, DIMENSION(8)  ::   llsend, llrecv
+      INTEGER, DIMENSION(  kfld)  ::   ipi, ipj, ipk, ipl   ! dimension of the input array
+      INTEGER, DIMENSION(8,kfld)  ::   ifill
+      INTEGER, DIMENSION(8,kfld)  ::   isizei, ishtSi, ishtRi, ishtPi
+      INTEGER, DIMENSION(8,kfld)  ::   isizej, ishtSj, ishtRj, ishtPj
+      LOGICAL, DIMENSION(8,kfld)  ::   llsend, llrecv
       LOGICAL  ::   ll4only                                        ! default: 8 neighbourgs
+      REAL(PRECISION) ::   zland
       !!----------------------------------------------------------------------
       !
       ! ----------------------------------------- !
       !     1. local variables initialization     !
       ! ----------------------------------------- !
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
-      !
-      IF( narea == 1 .AND. numcom == -1 ) CALL mpp_report( cdname, ipk, ipl, ipf, ld_lbc = .TRUE. )
-      !
       idxs = 1   ! initalize index for send buffer
       idxr = 1   ! initalize index for recv buffer
       icomm = mpi_comm_oce        ! shorter name
       !
       ! take care of optional parameters
       !
-      ihls = nn_hls   ! default definition
-      IF( PRESENT( khls ) )   ihls = khls
-      IF( ihls > n_hlsmax ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with khls > n_hlsmax : ', khls, '>', n_hlsmax
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipi /= Ni_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along i: ', ipi, ihls, Ni_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      IF( ipj /= Nj_0+2*ihls ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with an input array which does not match ihls along j:', ipj, ihls , Nj_0
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
-      ll4only = .FALSE.    ! default definition
-      IF( PRESENT(ld4only) )   ll4only = ld4only
+      ll4only = .FALSE.                                 ! default definition
+      IF( PRESENT( ld4only ) )   ll4only = ld4only
       !
       zland = 0._wp                                     ! land filling value: zero by default
-      IF( PRESENT( pfillval ) )   zland = pfillval      ! set land value
+      IF( PRESENT( pfillval) )   zland = pfillval       ! set land value
       !
-      ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
-      IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
-         llsend(:) = lsend(:)   ;   llrecv(:) = lrecv(:)
-      ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
-         WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with only one of the two arguments lsend or lrecv'
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ELSE                                              ! default neighbours
-         llsend(:) = mpiSnei(ihls,:) >= 0
-         IF( ll4only )   llsend(5:8) = .FALSE.          ! exclude corners
-         llrecv(:) = mpiRnei(ihls,:) >= 0
-         IF( ll4only )   llrecv(5:8) = .FALSE.          ! exclude corners
-      ENDIF
+      ifill_nfd = jpfillcst                             ! default definition
+      IF( PRESENT(kfillmode) )   ifill_nfd = kfillmode
       !
-      ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
-      ! default definition
-      DO jn = 1, 4
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn) = jpfillperio  ! with self-periodicity
-         ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn) = kfillmode    ! localy defined
-         ELSE                                ;   ifill(jn) = jpfillcst    ! constant value (zland)
+      DO jf = 1, kfld
+         !
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls = ( ipi(jf) - Ni_0 ) / 2
+         !
+         IF( numcom == -1 ) THEN   ! test input array shape. Use numcom to do these tests only at the beginning of the run
+            IF( MOD( ipi(jf) - Ni_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong i-size: ', ipi(jf), Ni_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( MOD( ipj(jf) - Nj_0, 2 ) /= 0 ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array has wong j-size: ', ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ( ipj(jf) - Nj_0 ) / 2 /= ihls ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but the ', jf,'th input array as wong i and j-size: ',   &
+                  &           ipi(jf), Ni_0, ipj(jf), Nj_0
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
+            IF( ihls > n_hlsmax ) THEN
+               WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk but for the ', jf,'th input array, ', ihls, ' > n_hlsmax = ',   &
+                  &           n_hlsmax
+               CALL ctl_stop( 'STOP', ctmp1 )
+            ENDIF
          ENDIF
-      END DO
-      DO jn = 5, 8
-         IF(             llrecv(jn) ) THEN   ;   ifill(jn) = jpfillmpi    ! with an mpi communication
-         ELSE                                ;   ifill(jn) = jpfillnothing! do nothing
+         !
+         ! define llsend and llrecv: logicals which say if mpi-neibourgs for send or receive exist or not.
+         IF     ( PRESENT(lsend) .AND. PRESENT(lrecv) ) THEN   ! localy defined neighbourgs 
+            llsend(:,jf) = lsend(:)   ;   llrecv(:,jf) = lrecv(:)
+         ELSE IF( PRESENT(lsend) .OR.  PRESENT(lrecv) ) THEN
+            WRITE(ctmp1,*) TRIM(cdname), ' is calling lbc_lnk with only one of the two arguments lsend or lrecv'
+            CALL ctl_stop( 'STOP', ctmp1 )
+         ELSE                                              ! default neighbours
+            llsend(:,jf) = mpiSnei(ihls,:) >= 0
+            IF( ll4only )   llsend(5:8,jf) = .FALSE.       ! exclude corners
+            llrecv(:,jf) = mpiRnei(ihls,:) >= 0
+            IF( ll4only )   llrecv(5:8,jf) = .FALSE.       ! exclude corners
          ENDIF
-      END DO
          !
-      ! north fold treatment
-      IF( l_IdoNFold ) THEN
-         ifill_nfd = ifill(jpno)             ! if we are here, this means llrecv(jpno) = .false. and l_SelfPerio(jpno) = .false.
-         ifill( (/jpno/) ) = jpfillnothing   ! we do north fold -> do nothing for northern halo
-      ENDIF
-      
-      ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
-      ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
-      ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
-      !
-      ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
-      !                   !                       ________________________
-      ip0i =          0   !          im0j = inner |__|__|__________|__|__|
-      ip1i =       ihls   !   im1j = inner - halo |__|__|__________|__|__|
-      im1i = ipi-2*ihls   !                       |  |  |          |  |  |
-      im0i = ipi - ihls   !                       |  |  |          |  |  |
-      ip0j =          0   !                       |  |  |          |  |  |
-      ip1j =       ihls   !                       |__|__|__________|__|__|
-      im1j = ipj-2*ihls   !           ip1j = halo |__|__|__________|__|__|
-      im0j = ipj - ihls   !              ip0j = 0 |__|__|__________|__|__|
-      !                   !                    ip0i ip1i        im1i im0i
+         ! define ifill: which method should be used to fill each parts (sides+corners) of the halos
+         ! default definition
+         DO jn = 1, 4   ! 4 sides
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSEIF(    l_SelfPerio(jn) ) THEN   ;   ifill(jn,jf) = jpfillperio     ! with self-periodicity
+            ELSEIF( PRESENT(kfillmode) ) THEN   ;   ifill(jn,jf) = kfillmode       ! localy defined
+            ELSEIF(          ihls == 0 ) THEN   ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ELSE                                ;   ifill(jn,jf) = jpfillcst       ! constant value (zland)
+            ENDIF
+         END DO
+         DO jn = 5, 8   ! 4 corners
+            IF(          llrecv(jn,jf) ) THEN   ;   ifill(jn,jf) = jpfillmpi       ! with an mpi communication
+            ELSE                                ;   ifill(jn,jf) = jpfillnothing   ! do nothing
+            ENDIF
+         END DO
+         !
+         ! north fold treatment
+         IF( l_IdoNFold )   ifill(jpno,jf) = jpfillnothing    ! we do north fold -> do nothing for northern halo
+         
+         ! We first define the localization and size of the parts of the array that will be sent (s), received (r)
+         ! or used for periodocity (p). The localization is defined as "the bottom left corner - 1" in i and j directions.
+         ! This is a shift that will be applied later in the do loops to pick-up the appropriate part of the array
+         !
+         ! all definitions bellow do not refer to N[ij][se]0 so we can use it with any local value of ihls
+         !
+         !                       !                       ________________________
+         ip0i =             0    !          im0j = inner |__|__|__________|__|__|
+         ip1i =           ihls   !   im1j = inner - halo |__|__|__________|__|__|
+         im1i = ipi(jf)-2*ihls   !                       |  |  |          |  |  |
+         im0i = ipi(jf) - ihls   !                       |  |  |          |  |  |
+         ip0j =             0    !                       |  |  |          |  |  |
+         ip1j =           ihls   !                       |__|__|__________|__|__|
+         im1j = ipj(jf)-2*ihls   !           ip1j = halo |__|__|__________|__|__|
+         im0j = ipj(jf) - ihls   !              ip0j = 0 |__|__|__________|__|__|
+         !                       !                    ip0i ip1i        im1i im0i
+         !
+         ! define shorter names...
+         iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
+         iisz = ipi(jf)
+         !        sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
+         isizei(1:4,jf) = (/ ihls, ihls, iisz, iisz /)   ;   isizei(5:8,jf) = ihls                 ! i- count
+         isizej(1:4,jf) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8,jf) = ihls                 ! j- count
+         ishtSi(1:4,jf) = (/ ip1i, im1i, ip0i, ip0i /)   ;   ishtSi(5:8,jf) = ishtSi( iwewe,jf )   ! i- shift  send data
+         ishtSj(1:4,jf) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8,jf) = ishtSj( issnn,jf )   ! j- shift  send data
+         ishtRi(1:4,jf) = (/ ip0i, im0i, ip0i, ip0i /)   ;   ishtRi(5:8,jf) = ishtRi( iwewe,jf )   ! i- shift  recv data
+         ishtRj(1:4,jf) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8,jf) = ishtRj( issnn,jf )   ! j- shift  recv data
+         ishtPi(1:4,jf) = (/ im1i, ip1i, ip0i, ip0i /)   ;   ishtPi(5:8,jf) = ishtPi( iwewe,jf )   ! i- shift perio data
+         ishtPj(1:4,jf) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8,jf) = ishtPj( issnn,jf )   ! j- shift perio data
+         !
+      END DO   ! jf
       !
-      iwewe(:) = (/ jpwe,jpea,jpwe,jpea /)   ;   issnn(:) = (/ jpso,jpso,jpno,jpno /)
-      !     sides:     west  east south north      ;   corners: so-we, so-ea, no-we, no-ea
-      isizei(1:4) = (/ ihls, ihls,  ipi,  ipi /)   ;   isizei(5:8) = ihls              ! i- count
-      isizej(1:4) = (/ Nj_0, Nj_0, ihls, ihls /)   ;   isizej(5:8) = ihls              ! j- count
-      ishtSi(1:4) = (/ ip1i, im1i, ip0i, ip0i /)   ;   ishtSi(5:8) = ishtSi( iwewe )   ! i- shift send data
-      ishtSj(1:4) = (/ ip1j, ip1j, ip1j, im1j /)   ;   ishtSj(5:8) = ishtSj( issnn )   ! j- shift send data
-      ishtRi(1:4) = (/ ip0i, im0i, ip0i, ip0i /)   ;   ishtRi(5:8) = ishtRi( iwewe )   ! i- shift received data location
-      ishtRj(1:4) = (/ ip1j, ip1j, ip0j, im0j /)   ;   ishtRj(5:8) = ishtRj( issnn )   ! j- shift received data location
-      ishtPi(1:4) = (/ im1i, ip1i, ip0i, ip0i /)   ;   ishtPi(5:8) = ishtPi( iwewe )   ! i- shift data used for periodicity
-      ishtPj(1:4) = (/ ip1j, ip1j, im1j, ip1j /)   ;   ishtPj(5:8) = ishtPj( issnn )   ! j- shift data used for periodicity
+      IF( narea == 1 .AND. numcom == -1 )   CALL mpp_report( cdname, SUM(ipk(:))/kfld, SUM(ipl(:))/kfld, kfld, ld_lbc = .TRUE. )
       !
       ! -------------------------------- !
       !     2. Prepare MPI exchanges     !
       ! -------------------------------- !
       !
-      iStag = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)   ! any value but each one must be different
+      iStag = (/ 1, 2, 3, 4, 5, 6, 7, 8 /)   ! can be any value but each value must be unique
       ! define iRtag with the corresponding iStag, e.g. data received at west where sent at east.
       iRtag(jpwe) = iStag(jpea)   ;   iRtag(jpea) = iStag(jpwe)   ;   iRtag(jpso) = iStag(jpno)   ;   iRtag(jpno) = iStag(jpso)
       iRtag(jpsw) = iStag(jpne)   ;   iRtag(jpse) = iStag(jpnw)   ;   iRtag(jpnw) = iStag(jpse)   ;   iRtag(jpne) = iStag(jpsw)
       !
-      iszall(:) = isizei(:) * isizej(:) * ipk * ipl * ipf
+      ! size of the buffer to be sent/recv in each direction
+      ibufszS(:) = 0   ! defaut definition
+      ibufszR(:) = 0
+      DO jf = 1, kfld
+         DO jn = 1, 8
+            IF( llsend(jn,jf) )   ibufszS(jn) = ibufszS(jn) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+            IF( llrecv(jn,jf) )   ibufszR(jn) = ibufszR(jn) + isizei(jn,jf) * isizej(jn,jf) * ipk(jf) * ipl(jf)
+         END DO
+      END DO
+      !
+      ! offset to apply to find the position of the sent/recv data within the buffer
       ishtS(1) = 0
       DO jn = 2, 8
-         ishtS(jn) = ishtS(jn-1) + iszall(jn-1) * COUNT( (/llsend(jn-1)/) )
+         ishtS(jn) = ishtS(jn-1) + ibufszS(jn-1)
       END DO
       ishtR(1) = 0
       DO jn = 2, 8
-         ishtR(jn) = ishtR(jn-1) + iszall(jn-1) * COUNT( (/llrecv(jn-1)/) )
+         ishtR(jn) = ishtR(jn-1) + ibufszR(jn-1)
       END DO
-
+      !
       ! Allocate buffer arrays to be sent/received if needed
-      iszS = SUM(iszall, mask = llsend)                             ! send buffer size
+      iszS = SUM(ibufszS)                                           ! send buffer size
       IF( ALLOCATED(BUFFSND) ) THEN
          CALL mpi_waitall(8, nreq_p2p, MPI_STATUSES_IGNORE, ierr)   ! wait for Isend from the PREVIOUS call
          IF( SIZE(BUFFSND) < iszS )    DEALLOCATE(BUFFSND)          ! send buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFSND) )   ALLOCATE( BUFFSND(iszS) )
-      iszR = SUM(iszall, mask = llrecv)                             ! recv buffer size
+      iszR = SUM(ibufszR)                                           ! recv buffer size
       IF( ALLOCATED(BUFFRCV) ) THEN
          IF( SIZE(BUFFRCV) < iszR )    DEALLOCATE(BUFFRCV)          ! recv buffer is too small
       ENDIF
       IF( .NOT. ALLOCATED(BUFFRCV) )   ALLOCATE( BUFFRCV(iszR) )
       !
-      ! default definition when no communication is done. understood by mpi_waitall
+      ! Default definition when no communication is done. Understood by mpi_waitall
       nreq_p2p(:) = MPI_REQUEST_NULL   ! WARNING: Must be done after the call to mpi_waitall just above
       !
       ! ----------------------------------------------- !
@@ -177,19 +201,28 @@
       !
       ! ----------------------------------- !
       !     4. Fill east and west halos     !
+      !   Must be done before sending data  !
+      !     data to south/north/corners     !
       ! ----------------------------------- !
       !
-      DO jn = 1, 2
-#define BLOCK_FILL
+      DO jn = 1, 2   ! first: do all the non-MPI filling to give more time to MPI_RECV
+#define BLOCK_FILL_nonMPI
+#  include "lbc_lnk_pt2pt_generic.h90"         
+#undef BLOCK_FILL_nonMPI
+      END DO
+      DO jn = 1, 2   ! next: do the MPI_RECV part
+#define BLOCK_FILL_MPI_RECV
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
+#undef BLOCK_FILL_MPI_RECV
       END DO
       !
       ! ------------------------------------------------- !
       !     5. Do north and south MPI_Isend if needed     !
+      !      and Specific problem in corner treatment     !
+      !               ( very rate case... )               !
       ! ------------------------------------------------- !
       !
-      DO jn = 3, 4
+      DO jn = 3, 8
 #define BLOCK_ISEND
 #  include "lbc_lnk_pt2pt_generic.h90"         
 #undef BLOCK_ISEND
@@ -199,44 +232,34 @@
       !     6. north fold treatment     !
       ! ------------------------------- !
       !
-      ! Must be done after receiving data from East/West neighbourgs (as it is coded in mpp_nfd, to be changed one day...)
-      ! Do it after MPI_iSend to south/north neighbourgs so they won't wait (too much) to receive their data
-      ! Do if before MPI_Recv from south/north neighbourgs so we have more time to receive data
+      ! Do it after MPI_iSend to south/north/corners neighbourgs so they won't wait (too much) to receive their data
+      ! Do if before MPI_Recv from south/north/corners neighbourgs so we will have more time to receive data
       !
       IF( l_IdoNFold ) THEN
-         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , ihls, ipf )   ! self NFold
-         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, ihls, ipf )   ! mpi  NFold
+         IF( jpni == 1 )  THEN   ;   CALL lbc_nfd( ptab, cd_nat, psgn                  , kfld )   ! self NFold
+         ELSE                    ;   CALL mpp_nfd( ptab, cd_nat, psgn, ifill_nfd, zland, kfld )   ! mpi  NFold
          ENDIF
       ENDIF
       !
-      ! ------------------------------------- !
-      !     7. Fill south and north halos     !
-      ! ------------------------------------- !
+      ! ------------------------------------------------ !
+      !           7. Fill south and north halos          !
+      !     and specific problem in corner treatment     !
+      !               ( very rate case... )              !
+      ! ------------------------------------------------ !
       !
-      DO jn = 3, 4
-#define BLOCK_FILL
+      DO jn = 3, 8   ! first: do all the non-MPI filling to give more time to MPI_RECV
+#define BLOCK_FILL_nonMPI
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
+#undef BLOCK_FILL_nonMPI
       END DO
-      !
-      ! ----------------------------------------------- !
-      !     8. Specific problem in corner treatment     !
-      !              ( very rate case... )              !
-      ! ----------------------------------------------- !
-      !
-      DO jn = 5, 8
-#define BLOCK_ISEND
+      DO jn = 3, 8   ! next: do the MPI_RECV part
+#define BLOCK_FILL_MPI_RECV
 #  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_ISEND
-      END DO
-      DO jn = 5, 8
-#define BLOCK_FILL
-#  include "lbc_lnk_pt2pt_generic.h90"         
-#undef BLOCK_FILL
+#undef BLOCK_FILL_MPI_RECV
       END DO
       !
       ! -------------------------------------------- !
-      !     9. deallocate local temporary arrays     !
+      !     8. deallocate local temporary arrays     !
       !        if they areg larger than jpi*jpj      !  <- arbitrary max size...
       ! -------------------------------------------- !
       !
@@ -250,53 +273,72 @@
 #endif
 
 #if defined BLOCK_ISEND
-   IF( llsend(jn) ) THEN
-      ishti = ishtSi(jn)
-      ishtj = ishtSj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         BUFFSND(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
-         idxs = idxs + 1
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
+   IF( ibufszS(jn) > 0 ) THEN          ! we must send some data
+      DO jf = 1, kfld                  ! first: fill the buffer to be sent
+         IF( llsend(jn,jf) ) THEN
+            ishti = ishtSi(jn,jf)
+            ishtj = ishtSj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               BUFFSND(idxs) = ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl)
+               idxs = idxs + 1
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         ENDIF
+      END DO
 #if ! defined key_mpi_off
       IF( ln_timing ) CALL tic_tac(.TRUE.)
-      ! non-blocking send of the west/east side using local buffer
-      CALL MPI_ISEND( BUFFSND(ishtS(jn)+1), iszall(jn), MPI_TYPE, mpiSnei(ihls,jn), iStag(jn), icomm, nreq_p2p(jn), ierr )
+      ! next: non-blocking send using local buffer. use mpiSnei(n_hlsmax,jn), see mppini
+      CALL MPI_ISEND( BUFFSND(ishtS(jn)+1), ibufszS(jn), MPI_TYPE, mpiSnei(n_hlsmax,jn), iStag(jn), icomm, nreq_p2p(jn), ierr )
       IF( ln_timing ) CALL tic_tac(.FALSE.)
 #endif
    ENDIF
+
 #endif
 
-#if defined BLOCK_FILL
-   ishti = ishtRi(jn)
-   ishtj = ishtRj(jn)
-   SELECT CASE ( ifill(jn) )
-   CASE ( jpfillnothing )               ! no filling 
-   CASE ( jpfillmpi   )                 ! fill with data received by MPI
+#if defined BLOCK_FILL_nonMPI
+   DO jf = 1, kfld
+      IF( ifill(jn,jf) /= jpfillmpi ) THEN    ! treat first all non-MPI cases
+         ishti = ishtRi(jn,jf)
+         ishtj = ishtRj(jn,jf)
+         SELECT CASE ( ifill(jn,jf) )
+         CASE ( jpfillnothing )               ! no filling 
+         CASE ( jpfillperio )                 ! we will do it later
+            ishti2 = ishtPi(jn,jf)
+            ishtj2 = ishtPj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         CASE ( jpfillcopy  )                 ! filling with inner domain values
+            ishti2 = ishtSi(jn,jf)
+            ishtj2 = ishtSj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         CASE ( jpfillcst   )                 ! filling with constant value
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         END SELECT
+      ENDIF
+   END DO
+#endif
+
+#if defined BLOCK_FILL_MPI_RECV
+   IF( ibufszR(jn) > 0 ) THEN          ! we must receive some data
 #if ! defined key_mpi_off
       IF( ln_timing ) CALL tic_tac(.TRUE.)
-      !                                 ! blocking receive of the west/east halo in local temporary arrays
-      CALL MPI_RECV( BUFFRCV(ishtR(jn)+1), iszall(jn), MPI_TYPE, mpiRnei(ihls,jn), iRtag(jn), icomm, MPI_STATUS_IGNORE, ierr )
+      ! blocking receive in local buffer. use mpiRnei(n_hlsmax,jn), see mppini
+      CALL MPI_RECV( BUFFRCV(ishtR(jn)+1), ibufszR(jn), MPI_TYPE, mpiRnei(n_hlsmax,jn), iRtag(jn), icomm, MPI_STATUS_IGNORE, ierr )
       IF( ln_timing ) CALL tic_tac(.FALSE.)
 #endif
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idxr)
-         idxr = idxr + 1
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillperio )                 ! use periodicity
-      ishti2 = ishtPi(jn)
-      ishtj2 = ishtPj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillcopy  )                 ! filling with inner domain values
-      ishti2 = ishtSi(jn)
-      ishtj2 = ishtSj(jn)
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = ptab(jf)%pt4d(ishti2+ji,ishtj2+jj,jk,jl)
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   CASE ( jpfillcst   )                 ! filling with constant value
-      DO jf = 1, ipf  ;  DO jl = 1, ipl  ;  DO jk = 1, ipk  ;  DO jj = 1,isizej(jn)  ;  DO ji = 1,isizei(jn)
-         ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = zland
-      END DO   ;   END DO   ;   END DO   ;   END DO   ;   END DO
-   END SELECT
+      DO jf = 1, kfld
+         IF( ifill(jn,jf) == jpfillmpi ) THEN    ! Use MPI-received data
+            ishti = ishtRi(jn,jf)
+            ishtj = ishtRj(jn,jf)
+            DO jl = 1, ipl(jf)  ;  DO jk = 1, ipk(jf)  ;  DO jj = 1,isizej(jn,jf)  ;  DO ji = 1,isizei(jn,jf)
+               ptab(jf)%pt4d(ishti+ji,ishtj+jj,jk,jl) = BUFFRCV(idxr)
+               idxr = idxr + 1
+            END DO   ;   END DO   ;   END DO   ;   END DO
+         ENDIF
+      END DO
+   ENDIF
 #endif
diff --git a/src/OCE/LBC/lbc_nfd_generic.h90 b/src/OCE/LBC/lbc_nfd_generic.h90
index 18ae89738..fdfa8b62b 100644
--- a/src/OCE/LBC/lbc_nfd_generic.h90
+++ b/src/OCE/LBC/lbc_nfd_generic.h90
@@ -1,28 +1,23 @@
 
-   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, khls, kfld )
+   SUBROUTINE lbc_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfld )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
       CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
       REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
-      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
       INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       !
       INTEGER  ::    ji,  jj,  jk,  jl,  jf   ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipk, ipl, ipf   ! dimension of the input array
+      INTEGER  ::   ipi, ipj, ipk, ipl, ihls  ! dimension of the input array
       INTEGER  ::   ii1, ii2, ij1, ij2
       !!----------------------------------------------------------------------
       !
-      ipi = SIZE(ptab(1)%pt4d,1)
-      ipj = SIZE(ptab(1)%pt4d,2)
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
+      DO jf = 1, kfld                      ! Loop on the number of arrays to be treated
       !
-      IF( ipi /= Ni0glo+2*khls ) THEN
-         WRITE(ctmp1,*) 'lbc_nfd input array does not match khls', ipi, khls, Ni0glo
-         CALL ctl_stop( 'STOP', ctmp1 )
-      ENDIF
-      !
-      DO jf = 1, ipf                      ! Loop on the number of arrays to be treated
+         ipi = SIZE(ptab(jf)%pt4d,1)
+         ipj = SIZE(ptab(jf)%pt4d,2)
+         ipk = SIZE(ptab(jf)%pt4d,3)
+         ipl = SIZE(ptab(jf)%pt4d,4)
+         !
+         ihls = ( ipi - Ni0glo ) / 2
          !
          IF( c_NFtype == 'T' ) THEN            ! *  North fold  T-point pivot
             !
@@ -30,160 +25,162 @@
             CASE ( 'T' , 'W' )                         ! T-, W-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls+1
-                        ii1 = khls + ji
+                     DO ji = 1, 1                 ! point ihls+1
+                        ii1 = ihls + ji
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =   2 + ihls + ji - 1        ! ends at: 2 + ihls + ipi - 2*ihls - 1 - 1 = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls + 1
-                        ii1 = ipi - khls + ji
-                        ii2 =       khls + ji
+                     DO ji = 1, COUNT( (/ihls > 0/) ) ! point ipi - ihls + 1
+                        ii1 = ipi - ihls + ji
+                        ii2 =       ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! last khls-1 points
-                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
-                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
+                     DO ji = 1, ihls-1            ! last ihls-1 points
+                        ii1 = ipi - ihls + 1 + ji        ! ends at: ipi - ihls + 1 + ihls - 1 = ipi
+                        ii2 = ipi - ihls + 1 - ji        ! ends at: ipi - ihls + 1 - ihls + 1 = ipi - 2*ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - khls - 1) + 1 = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls - 1) + 1 = khls + 2
+                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji + 1             ! ends at: ipi/2 + (ipi/2 - ihls - 1) + 1 = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls - 1) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
+                     !                            ! last ihls-1 points: have been or will be done by e-w periodicity 
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'U' )                               ! U-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
+                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls-1 points: have been / will done by e-w periodicity 
+                     !                            ! last ihls-1 points: have been or will be done by e-w periodicity 
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'V' )                               ! V-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls+1 lines (from ipj to ipj-khls) : full
-               	  DO jj = 1, khls+1
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
-                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
+                  ! last ihls+1 lines (from ipj to ipj-ihls) : full
+               	  DO jj = 1, ihls+1
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( ihls + 1 ) + 1 = ipj - ihls
+                     ij2 = ipj - 2*ihls + jj - 2         ! ends at: ipj - 2*ihls + ihls + 1 - 2 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 2 - ji            ! ends at: 2*khls + 2 - khls = khls + 2
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 2 - ji            ! ends at: 2*ihls + 2 - ihls = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls+1
-                        ii1 = khls + ji
+                     DO ji = 1, 1                 ! point ihls+1
+                        ii1 = ihls + ji
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+2 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =   2 + khls + ji - 1        ! ends at: 2 + khls + ipi - 2*khls - 1 - 1 = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) + 1 = khls + 2
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+2 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =   2 + ihls + ji - 1        ! ends at: 2 + ihls + ipi - 2*ihls - 1 - 1 = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) + 1 = ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls + 1
-                        ii1 = ipi - khls + ji
-                        ii2 =       khls + ji
+                     IF( ihls > 0 ) THEN
+                     DO ji = 1, COUNT( (/ihls > 0/) ) ! point ipi - ihls + 1
+                        ii1 = ipi - ihls + ji
+                        ii2 =       ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! last khls-1 points
-                        ii1 = ipi - khls + 1 + ji        ! ends at: ipi - khls + 1 + khls - 1 = ipi
-                        ii2 = ipi - khls + 1 - ji        ! ends at: ipi - khls + 1 - khls + 1 = ipi - 2*khls + 2
+                     ENDIF
+                     DO ji = 1, ihls-1            ! last ihls-1 points
+                        ii1 = ipi - ihls + 1 + ji        ! ends at: ipi - ihls + 1 + ihls - 1 = ipi
+                        ii2 = ipi - ihls + 1 - ji        ! ends at: ipi - ihls + 1 - ihls + 1 = ipi - 2*ihls + 2
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
                   !
-               END DO; END DO
+               END DO   ;   END DO
             CASE ( 'F' )                               ! F-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls+1 lines (from ipj to ipj-khls) : full
-               	  DO jj = 1, khls+1
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( khls + 1 ) + 1 = ipj - khls
-                     ij2 = ipj - 2*khls + jj - 2         ! ends at: ipj - 2*khls + khls + 1 - 2 = ipj - khls - 1
+                  ! last ihls+1 lines (from ipj to ipj-ihls) : full
+               	  DO jj = 1, ihls+1
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ( ihls + 1 ) + 1 = ipj - ihls
+                     ij2 = ipj - 2*ihls + jj - 2         ! ends at: ipj - 2*ihls + ihls + 1 - 2 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -199,9 +196,9 @@
             CASE ( 'T' , 'W' )                         ! T-, W-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! first: line number ipj-khls : 3 points
+                  ! first: line number ipj-ihls : 3 points
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
                      DO ji = 1, 1                 ! points from ipi/2+1
@@ -209,37 +206,37 @@
                         ii2 = ipi/2 - ji + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                      END DO
-                     DO ji = 1, 1                 ! points ipi - khls
-                        ii1 = ipi - khls + ji - 1
-                        ii2 =       khls + ji
+                     DO ji = 1, 1                 ! points ipi - ihls
+                        ii1 = ipi - ihls + ji - 1
+                        ii2 =       ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                      END DO
-                     DO ji = 1, 1                 ! point khls: redo it just in case (if e-w periodocity already done)
-                        !                         ! as we just changed point ipi - khls
-                        ii1 = khls + ji - 1
-                        ii2 = khls + ji
+                     DO ji = 1, COUNT( (/ihls > 0/) ) ! point ihls: redo it just in case (if e-w periodocity already done)
+                        !                             ! as we just changed point ipi - ihls
+                        ii1 = ihls + ji - 1
+                        ii2 = ihls + ji
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) =            ptab(jf)%pt4d(ii2,ij2,jk,jl)   ! Warning: pb with sign...
                      END DO
                   END DO
                   !
-                  ! Second: last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
-                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
+                  ! Second: last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - ihls
+                     ij2 = ipj - 2*ihls + jj             ! ends at: ipj - 2*ihls + ihls = ipj - ihls
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1        ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -248,34 +245,34 @@
             CASE ( 'U' )                               ! U-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - khls
-                     ij2 = ipj - 2*khls + jj             ! ends at: ipj - 2*khls + khls = ipj - khls
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj + 1      - jj             ! ends at: ipj + 1 - ihls
+                     ij2 = ipj - 2*ihls + jj             ! ends at: ipj - 2*ihls + ihls = ipj - ihls
                      !
-                     DO ji = 1, khls-1            ! first khls-1 points
-                        ii1 =          ji                ! ends at: khls-1
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points
+                        ii1 =          ji                ! ends at: ihls-1
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls
-                        ii1 = khls + ji - 1
+                     DO ji = 1, 1                        ! point ihls (here ihls > 0 so it is ok)
+                        ii1 = ihls + ji - 1
                         ii2 = ipi - ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+1 to ipi - ihls - 1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ( ipi - 2*ihls - 1 ) = ipi - ihls - 1
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls
-                        ii1 = ipi - khls + ji - 1
+                     DO ji = 1, 1                 ! point ipi - ihls
+                        ii1 = ipi - ihls + ji - 1
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ihls = ipi - 2*ihls
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO
@@ -284,100 +281,100 @@
             CASE ( 'V' )                               ! V-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls              ! first khls points
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo            ! points from khls to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji          ! ends at: khls + ipi - 2*khls = ipi - khls
-                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls - ( ipi - 2*khls ) + 1 = khls + 1
+                     DO ji = 1, Ni0glo            ! points from ihls to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ipi - 2*ihls = ipi - ihls
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls - ( ipi - 2*ihls ) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls            ! last khls points
-                        ii1 = ipi - khls + ji          ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji + 1      ! ends at: ipi - khls + 1 - khls = ipi - 2*khls + 1
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji + 1        ! ends at: ipi - ihls + 1 - ihls = ipi - 2*ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO   
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - khls   (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - khls) + 1 = khls + 1
+                     DO ji = 1, Ni0glo/2          ! points from ipi/2+1 to ipi - ihls   (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji + 1             ! ends at: ipi/2 - (ipi/2 - ihls) + 1 = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! first khls points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-khls  
-                        ii1 =              ji            ! ends at: khls
-                        ii2 = 2*khls + 1 - ji            ! ends at: 2*khls + 1 - khls = khls + 1
+                     DO ji = 1, ihls              ! first ihls points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-ihls  
+                        ii1 =              ji            ! ends at: ihls
+                        ii2 = 2*ihls + 1 - ji            ! ends at: 2*ihls + 1 - ihls = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls points: have been / will done by e-w periodicity 
+                     !                            ! last ihls points: have been or will be done by e-w periodicity 
                   END DO
                   !
                END DO; END DO
             CASE ( 'F' )                               ! F-point
                DO jl = 1, ipl   ;   DO jk = 1, ipk
                   !
-                  ! last khls lines (from ipj to ipj-khls+1) : full
-               	  DO jj = 1, khls
-               	     ij1 = ipj          - jj + 1         ! ends at: ipj - khls + 1
-                     ij2 = ipj - 2*khls + jj - 1         ! ends at: ipj - 2*khls + khls - 1 = ipj - khls - 1
+                  ! last ihls lines (from ipj to ipj-ihls+1) : full
+               	  DO jj = 1, ihls
+               	     ij1 = ipj          - jj + 1         ! ends at: ipj - ihls + 1
+                     ij2 = ipj - 2*ihls + jj - 1         ! ends at: ipj - 2*ihls + ihls - 1 = ipj - ihls - 1
                      !
-                     DO ji = 1, khls-1            ! first khls-1 points
-                        ii1 =          ji                ! ends at: khls-1
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points
+                        ii1 =          ji                ! ends at: ihls-1
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point khls
-                        ii1 = khls + ji - 1
+                     DO ji = 1, 1                 ! point ihls (here ihls > 0 so it is ok)
+                        ii1 = ihls + ji - 1
                         ii2 = ipi - ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, Ni0glo - 1        ! points from khls+1 to ipi - khls - 1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 =       khls + ji            ! ends at: khls + ( ipi - 2*khls - 1 ) = ipi - khls - 1
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - ( ipi - 2*khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo - 1        ! points from ihls+1 to ipi - ihls - 1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 =       ihls + ji            ! ends at: ihls + ( ipi - 2*ihls - 1 ) = ipi - ihls - 1
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ( ipi - 2*ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, 1                 ! point ipi - khls
-                        ii1 = ipi - khls + ji - 1
+                     DO ji = 1, 1                 ! point ipi - ihls
+                        ii1 = ipi - ihls + ji - 1
                         ii2 = ii1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls              ! last khls points
-                        ii1 = ipi - khls + ji            ! ends at: ipi - khls + khls = ipi
-                        ii2 = ipi - khls - ji            ! ends at: ipi - khls - khls = ipi - 2*khls
+                     DO ji = 1, ihls              ! last ihls points
+                        ii1 = ipi - ihls + ji            ! ends at: ipi - ihls + ihls = ipi
+                        ii2 = ipi - ihls - ji            ! ends at: ipi - ihls - ihls = ipi - 2*ihls
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
                   END DO   
                   !
-                  ! line number ipj-khls : right half
+                  ! line number ipj-ihls : right half
                	  DO jj = 1, 1
-                     ij1 = ipj - khls
+                     ij1 = ipj - ihls
                      ij2 = ij1   ! same line
                      !
-                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - khls-1  (note: Ni0glo = ipi - 2*khls)
-                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - khls) = ipi - khls
-                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - khls - 1 ) = khls + 1
+                     DO ji = 1, Ni0glo/2-1        ! points from ipi/2+1 to ipi - ihls-1  (note: Ni0glo = ipi - 2*ihls)
+                        ii1 = ipi/2 + ji                 ! ends at: ipi/2 + (ipi/2 - ihls) = ipi - ihls
+                        ii2 = ipi/2 - ji                 ! ends at: ipi/2 - (ipi/2 - ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     DO ji = 1, khls-1            ! first khls-1 points: redo them just in case (if e-w periodocity already done)
-                        !                         ! as we just changed points ipi-2khls+1 to ipi-nn_hl-1  
-                        ii1 =          ji                ! ends at: khls
-                        ii2 = 2*khls - ji                ! ends at: 2*khls - ( khls - 1 ) = khls + 1
+                     DO ji = 1, ihls-1            ! first ihls-1 points: redo them just in case (if e-w periodocity already done)
+                        !                         ! as we just changed points ipi-2ihls+1 to ipi-nn_hl-1  
+                        ii1 =          ji                ! ends at: ihls
+                        ii2 = 2*ihls - ji                ! ends at: 2*ihls - ( ihls - 1 ) = ihls + 1
                         ptab(jf)%pt4d(ii1,ij1,jk,jl) = psgn(jf) * ptab(jf)%pt4d(ii2,ij2,jk,jl)
                      END DO
-                     !                            ! last khls points: have been / will done by e-w periodicity 
+                     !                            ! last ihls points: have been or will be done by e-w periodicity 
                   END DO
                   !
                END DO; END DO
@@ -385,7 +382,7 @@
             !
          ENDIF   ! c_NFtype == 'F'
          !
-      END DO   ! ipf
+      END DO   ! kfld
       !
    END SUBROUTINE lbc_nfd_/**/PRECISION
 
diff --git a/src/OCE/LBC/lbclnk.F90 b/src/OCE/LBC/lbclnk.F90
index be65cdc13..3776b5953 100644
--- a/src/OCE/LBC/lbclnk.F90
+++ b/src/OCE/LBC/lbclnk.F90
@@ -38,11 +38,9 @@ MODULE lbclnk
       MODULE PROCEDURE   lbc_lnk_pt2pt_sp, lbc_lnk_pt2pt_dp
    END INTERFACE
 
-#if ! defined key_mpi2
    INTERFACE lbc_lnk_neicoll
       MODULE PROCEDURE   lbc_lnk_neicoll_sp ,lbc_lnk_neicoll_dp
    END INTERFACE
-#endif
    !
    INTERFACE lbc_lnk_icb
       MODULE PROCEDURE mpp_lnk_2d_icb_dp, mpp_lnk_2d_icb_sp
@@ -51,10 +49,10 @@ MODULE lbclnk
    PUBLIC   lbc_lnk            ! ocean/ice lateral boundary conditions
    PUBLIC   lbc_lnk_icb        ! iceberg lateral boundary conditions
 
-   REAL(dp), DIMENSION(:), ALLOCATABLE ::   buffsnd_dp, buffrcv_dp   ! MPI send/recv buffers
-   REAL(sp), DIMENSION(:), ALLOCATABLE ::   buffsnd_sp, buffrcv_sp   ! 
-   INTEGER,  DIMENSION(8)              ::   nreq_p2p                 ! request id for MPI_Isend in point-2-point communication
-   
+   REAL(dp), DIMENSION(:), ALLOCATABLE ::   buffsnd_dp, buffrcv_dp         ! MPI send/recv buffers
+   REAL(sp), DIMENSION(:), ALLOCATABLE ::   buffsnd_sp, buffrcv_sp         ! 
+   INTEGER,  DIMENSION(8)              ::   nreq_p2p = MPI_REQUEST_NULL    ! request id for MPI_Isend in point-2-point communication
+   INTEGER                             ::   nreq_nei = MPI_REQUEST_NULL    ! request id for mpi_neighbor_ialltoallv
    !! * Substitutions
    !!#  include "do_loop_substitute.h90"
    !!----------------------------------------------------------------------
@@ -134,9 +132,7 @@ CONTAINS
 #  define BUFFSND buffsnd_sp
 #  define BUFFRCV buffrcv_sp
 #  include "lbc_lnk_pt2pt_generic.h90"
-#if ! defined key_mpi2
 #  include "lbc_lnk_neicoll_generic.h90"
-#endif
 #  undef MPI_TYPE
 #  undef BUFFSND
 #  undef BUFFRCV
@@ -149,9 +145,7 @@ CONTAINS
 #  define BUFFSND buffsnd_dp
 #  define BUFFRCV buffrcv_dp
 #  include "lbc_lnk_pt2pt_generic.h90"
-#if ! defined key_mpi2
 #  include "lbc_lnk_neicoll_generic.h90"
-#endif
 #  undef MPI_TYPE
 #  undef BUFFSND
 #  undef BUFFRCV
diff --git a/src/OCE/LBC/lbcnfd.F90 b/src/OCE/LBC/lbcnfd.F90
index dc784b868..c6be460c9 100644
--- a/src/OCE/LBC/lbcnfd.F90
+++ b/src/OCE/LBC/lbcnfd.F90
@@ -23,8 +23,11 @@ MODULE lbcnfd
    PRIVATE
 
    INTERFACE lbc_nfd            ! called by mpp_nfd, lbc_lnk_pt2pt or lbc_lnk_neicoll
-      MODULE PROCEDURE   lbc_nfd_sp, lbc_nfd_ext_sp
-      MODULE PROCEDURE   lbc_nfd_dp, lbc_nfd_ext_dp
+      MODULE PROCEDURE   lbc_nfd_sp, lbc_nfd_dp
+   END INTERFACE
+
+   INTERFACE lbc_nfd_ext        ! called by mpp_lnk_2d_icb
+      MODULE PROCEDURE   lbc_nfd_ext_sp, lbc_nfd_ext_dp
    END INTERFACE
 
    INTERFACE mpp_nfd            ! called by lbc_lnk_pt2pt or lbc_lnk_neicoll
@@ -33,11 +36,13 @@ MODULE lbcnfd
    
    PUBLIC   mpp_nfd            ! mpi north fold conditions
    PUBLIC   lbc_nfd            ! north fold conditions
+   PUBLIC   lbc_nfd_ext        ! north fold conditions, called by mpp_lnk_2d_icb
 
-   INTEGER, PUBLIC                               :: nfd_nbnei
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:  ) :: nfd_rknei
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:) :: nfd_rksnd
-   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:) :: nfd_jisnd
+   INTEGER, PUBLIC                                 :: nfd_nbnei
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:    ) :: nfd_rknei
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:,:) :: nfd_rksnd
+   INTEGER, PUBLIC, ALLOCATABLE, DIMENSION (:,:,:) :: nfd_jisnd
+   LOGICAL, PUBLIC, ALLOCATABLE, DIMENSION (:,:  ) :: lnfd_same
    
    !!----------------------------------------------------------------------
    !! NEMO/OCE 4.0 , NEMO Consortium (2018)
diff --git a/src/OCE/LBC/lib_mpp.F90 b/src/OCE/LBC/lib_mpp.F90
index 9854cb04b..3c4c955f9 100644
--- a/src/OCE/LBC/lib_mpp.F90
+++ b/src/OCE/LBC/lib_mpp.F90
@@ -142,7 +142,7 @@ MODULE lib_mpp
    INTEGER :: MPI_SUMDD
 
    ! Neighbourgs informations
-   INTEGER,    PARAMETER, PUBLIC ::   n_hlsmax = 3
+   INTEGER,    PARAMETER, PUBLIC ::   n_hlsmax = 2
    INTEGER, DIMENSION(           8), PUBLIC ::   mpinei      !: 8-neighbourg MPI indexes (starting at 0, -1 if no neighbourg)
    INTEGER, DIMENSION(0:n_hlsmax,8), PUBLIC ::   mpiSnei     !: 8-neighbourg Send MPI indexes (starting at 0, -1 if no neighbourg)
    INTEGER, DIMENSION(0:n_hlsmax,8), PUBLIC ::   mpiRnei     !: 8-neighbourg Recv MPI indexes (starting at 0, -1 if no neighbourg)
@@ -1127,7 +1127,7 @@ CONTAINS
       INTEGER                            :: ierr
       LOGICAL, PARAMETER                 :: ireord = .FALSE.
       !!----------------------------------------------------------------------
-#if ! defined key_mpi_off && ! defined key_mpi2
+#if ! defined key_mpi_off
       
       iScnt4 = COUNT( mpiSnei(khls,1:4) >= 0 )
       iRcnt4 = COUNT( mpiRnei(khls,1:4) >= 0 )
@@ -1141,10 +1141,19 @@ CONTAINS
       iSnei8 = PACK( mpiSnei(khls,1:8), mask = mpiSnei(khls,1:8) >= 0 )
       iRnei8 = PACK( mpiRnei(khls,1:8), mask = mpiRnei(khls,1:8) >= 0 )
 
+      ! Isolated processes (i.e., processes WITH no outgoing or incoming edges, that is, processes that have specied
+      ! indegree and outdegree as zero and thus DO not occur as source or destination rank in the graph specication)
+      ! are allowed. 
+      
+# if ! defined key_mpi2
       CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt4, iSnei4, MPI_UNWEIGHTED, iRcnt4, iRnei4, MPI_UNWEIGHTED,   &
          &                                 MPI_INFO_NULL, ireord, mpi_nc_com4(khls), ierr )
       CALL MPI_Dist_graph_create_adjacent( mpi_comm_oce, iScnt8, iSnei8, MPI_UNWEIGHTED, iRcnt8, iRnei8, MPI_UNWEIGHTED,   &
          &                                 MPI_INFO_NULL, ireord, mpi_nc_com8(khls), ierr)
+# else
+      mpi_nc_com4(khls) = -1
+      mpi_nc_com8(khls) = -1
+# endif
 
       DEALLOCATE( iSnei4, iRnei4, iSnei8, iRnei8 )
 #endif
@@ -1307,7 +1316,7 @@ CONTAINS
             IF ( ncomm_sequence(ji,1) .GT. 1 .AND. ncomm_sequence(ji,2) .GT. 1 ) jj = jj + 1
             jh = MAX (jh, ncomm_sequence(ji,1)*ncomm_sequence(ji,2))
          END DO
-         WRITE(numcom,'(A,I3)') ' 3D Exchanged halos : ', jk
+         WRITE(numcom,'(A,I3)') ' 3D or 4D Exchanged halos : ', jk
          WRITE(numcom,'(A,I3)') ' Multi arrays exchanged halos : ', jf
          WRITE(numcom,'(A,I3)') '   from which 3D : ', jj
          WRITE(numcom,'(A,I10)') ' Array max size : ', jh*jpi*jpj
diff --git a/src/OCE/LBC/mpp_lbc_north_icb_generic.h90 b/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
index 3c8382eac..63cef9abf 100644
--- a/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
+++ b/src/OCE/LBC/mpp_lbc_north_icb_generic.h90
@@ -92,7 +92,7 @@
 
       ! 2. North-Fold boundary conditions
       ! ----------------------------------
-      CALL lbc_nfd( ztab_e(:,1-kextj:ipj+kextj), cd_type, psgn, kextj )
+      CALL lbc_nfd_ext( ztab_e(:,1-kextj:ipj+kextj), cd_type, psgn, kextj )
 
       ij = 1 - kextj
       !! Scatter back to pt2d
diff --git a/src/OCE/LBC/mpp_lnk_icb_generic.h90 b/src/OCE/LBC/mpp_lnk_icb_generic.h90
index 8798f3e0c..b0cb70d46 100644
--- a/src/OCE/LBC/mpp_lnk_icb_generic.h90
+++ b/src/OCE/LBC/mpp_lnk_icb_generic.h90
@@ -87,7 +87,7 @@
       IF( l_IdoNFold ) THEN
          !
          SELECT CASE ( jpni )
-                   CASE ( 1 )     ;   CALL lbc_nfd         ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
+                   CASE ( 1 )     ;   CALL lbc_nfd_ext     ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
                    CASE DEFAULT   ;   CALL LBCNORTH        ( pt2d(1:jpi,1:jpj+kextj), cd_type, psgn, kextj )
          END SELECT
          !
diff --git a/src/OCE/LBC/mpp_loc_generic.h90 b/src/OCE/LBC/mpp_loc_generic.h90
index 1bce8df2d..fe5697630 100644
--- a/src/OCE/LBC/mpp_loc_generic.h90
+++ b/src/OCE/LBC/mpp_loc_generic.h90
@@ -47,6 +47,7 @@
       !
       INTEGER  ::   ierror, ii, idim
       INTEGER  ::   index0
+      INTEGER  ::   ihls, ipiglo, ipjglo
       INTEGER , DIMENSION(:), ALLOCATABLE  ::   ilocs
       REAL(PRECISION) ::   zmin     ! local minimum
       REAL(PRECISION), DIMENSION(2,1) ::   zain, zaout
@@ -60,6 +61,9 @@
       ENDIF
       !
       idim = SIZE(kindex)
+      ihls = ( SIZE(ARRAY_IN(:,:,:), 1) - Ni_0 ) / 2
+      ipiglo = Ni0glo + 2*ihls
+      ipjglo = Nj0glo + 2*ihls
       !
       IF ( ANY( MASK_IN(:,:,:) ) ) THEN   ! there is at least 1 valid point...
          !
@@ -68,9 +72,9 @@
          ilocs = LOC_OPERATION( ARRAY_IN(:,:,:) , mask= MASK_IN(:,:,:) )
          zmin  = ARRAY_IN(ilocs(1),ilocs(2),ilocs(3))
          !
-         kindex(1) = mig( ilocs(1) )
+         kindex(1) = mig( ilocs(1), ihls )
 #if defined DIM_2d || defined DIM_3d    /* avoid warning when kindex has 1 element */
-         kindex(2) = mjg( ilocs(2) )
+         kindex(2) = mjg( ilocs(2), ihls )
 #endif
 #if defined DIM_3d                      /* avoid warning when kindex has 2 elements */
          kindex(3) = ilocs(3)
@@ -80,10 +84,10 @@
          !
          index0 = kindex(1)-1   ! 1d index starting at 0
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-         index0 = index0 + jpiglo * (kindex(2)-1)
+         index0 = index0 + ipiglo * (kindex(2)-1)
 #endif
 #if defined DIM_3d                     /* avoid warning when kindex has 2 elements */
-         index0 = index0 + jpiglo * jpjglo * (kindex(3)-1)
+         index0 = index0 + ipiglo * ipjglo * (kindex(3)-1)
 #endif
       ELSE
          ! special case for land processors
@@ -105,20 +109,20 @@
       pmin      = zaout(1,1)
       index0    = NINT( zaout(2,1) )
 #if defined DIM_3d                     /* avoid warning when kindex has 2 elements */
-      kindex(3) = index0 / (jpiglo*jpjglo)
-      index0    = index0 - kindex(3) * (jpiglo*jpjglo)
+      kindex(3) = index0 / (ipiglo*ipjglo)
+      index0    = index0 - kindex(3) * (ipiglo*ipjglo)
 #endif
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-      kindex(2) = index0 / jpiglo
-      index0 = index0 - kindex(2) * jpiglo
+      kindex(2) = index0 / ipiglo
+      index0 = index0 - kindex(2) * ipiglo
 #endif
       kindex(1) = index0
       kindex(:) = kindex(:) + 1   ! start indices at 1
 
       IF( .NOT. llhalo ) THEN
-         kindex(1)  = kindex(1) - nn_hls
+         kindex(1)  = kindex(1) - ihls
 #if defined DIM_2d || defined DIM_3d   /* avoid warning when kindex has 1 element */
-         kindex(2)  = kindex(2) - nn_hls
+         kindex(2)  = kindex(2) - ihls
 #endif
       ENDIF
       
diff --git a/src/OCE/LBC/mpp_nfd_generic.h90 b/src/OCE/LBC/mpp_nfd_generic.h90
index fd45035fe..237f9b311 100644
--- a/src/OCE/LBC/mpp_nfd_generic.h90
+++ b/src/OCE/LBC/mpp_nfd_generic.h90
@@ -1,38 +1,39 @@
 
-   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, khls, kfld )
+   SUBROUTINE mpp_nfd_/**/PRECISION( ptab, cd_nat, psgn, kfillmode, pfillval, kfld )
       TYPE(PTR_4d_/**/PRECISION),  DIMENSION(:), INTENT(inout) ::   ptab        ! pointer of arrays on which apply the b.c.
-      CHARACTER(len=1), DIMENSION(:), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
-      REAL(PRECISION),  DIMENSION(:), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
-      INTEGER                       , INTENT(in   ) ::   kfillmode   ! filling method for halo over land 
-      REAL(PRECISION)               , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
-      INTEGER                       , INTENT(in   ) ::   khls        ! halo size, default = nn_hls
-      INTEGER                       , INTENT(in   ) ::   kfld        ! number of pt3d arrays
+      CHARACTER(len=1), DIMENSION(kfld), INTENT(in   ) ::   cd_nat      ! nature of array grid-points
+      REAL(PRECISION),  DIMENSION(kfld), INTENT(in   ) ::   psgn        ! sign used across the north fold boundary
+      INTEGER                          , INTENT(in   ) ::   kfillmode   ! filling method for halo over land 
+      REAL(PRECISION)                  , INTENT(in   ) ::   pfillval    ! background value (used at closed boundaries)
+      INTEGER                          , INTENT(in   ) ::   kfld        ! number of pt3d arrays
       !
       LOGICAL  ::   ll_add_line
       INTEGER  ::   ji,  jj,  jk,  jl, jf, jr, jg, jn   ! dummy loop indices
-      INTEGER  ::   ipi, ipj, ipj2, ipk, ipl, ipf   ! dimension of the input array
-      INTEGER  ::   ierr, ibuffsize, iis0, iie0, impp
-      INTEGER  ::   ii1, ii2, ij1, ij2, iis, iie, iib, iig, iin
-      INTEGER  ::   i0max
-      INTEGER  ::   ij, iproc, ipni, ijnr
-      INTEGER, DIMENSION (:), ALLOCATABLE ::   ireq_s, ireq_r   ! for mpi_isend when avoiding mpi_allgather
-      INTEGER                             ::   ipjtot           ! sum of lines for all multi fields
-      INTEGER                             ::   i012             ! 0, 1 or 2
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijsnd  ! j-position of sent lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijbuf  ! j-position of send buffer lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ijrcv  ! j-position of recv buffer lines for each field
-      INTEGER , DIMENSION(:,:)        , ALLOCATABLE ::   ii1st, iiend
-      INTEGER , DIMENSION(:)          , ALLOCATABLE ::   ipjfld ! number of sent lines for each field
-      REAL(PRECISION), DIMENSION(:,:,:,:)    , ALLOCATABLE ::   zbufs  ! buffer, receive and work arrays
-      REAL(PRECISION), DIMENSION(:,:,:,:,:)  , ALLOCATABLE ::   zbufr  ! buffer, receive and work arrays
-      REAL(PRECISION), DIMENSION(:,:,:,:,:)  , ALLOCATABLE ::   znorthloc
-      REAL(PRECISION), DIMENSION(:,:,:,:,:,:), ALLOCATABLE ::   znorthglo
-      TYPE(PTR_4D_/**/PRECISION), DIMENSION(:), ALLOCATABLE ::   ztabglo        ! array or pointer of arrays on which apply the b.c.
+      INTEGER  ::   ierr, ibuffsize, impp, ipi0
+      INTEGER  ::   ii1, ii2, ij1, ij2, ij3, iig, inei
+      INTEGER  ::   i0max, ilntot, iisht, ijsht, ihsz
+      INTEGER  ::   iproc, ijnr, ipjtot, iFT, iFU, i012
+      INTEGER,         DIMENSION(kfld)               ::   ipi, ipj, ipj1, ipj2, ipk, ipl   ! dimension of the input array
+      INTEGER,         DIMENSION(kfld)               ::   ihls                             ! halo size
+      INTEGER,         DIMENSION(:)    , ALLOCATABLE ::   ireq_s, ireq_r   ! for mpi_isend when avoiding mpi_allgather
+      INTEGER,         DIMENSION(:)    , ALLOCATABLE ::   ipjfld ! number of sent lines for each field
+      REAL(PRECISION)                                ::   zhuge, zztmp
+      REAL(PRECISION), DIMENSION(:,:)  , ALLOCATABLE ::   zbufs  ! buffer, receive and work arrays
+      REAL(PRECISION), DIMENSION(:,:,:), ALLOCATABLE ::   zbufr  ! buffer, receive and work arrays
+      REAL(PRECISION), DIMENSION(:,:)  , ALLOCATABLE ::   znorthloc
+      REAL(PRECISION), DIMENSION(:,:,:), ALLOCATABLE ::   znorthall
+      TYPE(PTR_4D_/**/PRECISION), DIMENSION(1) ::   ztabglo        ! array or pointer of arrays on which apply the b.c.
       !!----------------------------------------------------------------------
       !
-      ipk = SIZE(ptab(1)%pt4d,3)
-      ipl = SIZE(ptab(1)%pt4d,4)
-      ipf = kfld
+      zhuge = HUGE(0._/**/PRECISION)   ! avoid to call the huge function inside do loops
+      !
+      DO jf = 1, kfld
+         ipi(jf) = SIZE(ptab(jf)%pt4d,1)
+         ipj(jf) = SIZE(ptab(jf)%pt4d,2)
+         ipk(jf) = SIZE(ptab(jf)%pt4d,3)
+         ipl(jf) = SIZE(ptab(jf)%pt4d,4)
+         ihls(jf) = ( ipi(jf) - Ni_0 ) / 2
+      END DO
       !
       IF( ln_nnogather ) THEN      !==  no allgather exchanges  ==!
 
@@ -61,74 +62,43 @@
          ! also force it if not restart during the first 2 steps (leap frog?)
          ll_add_line = l_full_nf_update .OR. ( ncom_stp <= nit000+1 .AND. .NOT. ln_rstart )
          
-         ALLOCATE(ipjfld(ipf))                 ! how many lines do we exchange for each field?
+         ALLOCATE(ipjfld(kfld))                 ! how many lines do we send for each field?
          IF( ll_add_line ) THEN
-            DO jf = 1, ipf                     ! Loop over the number of arrays to be processed
-               ipjfld(jf) = khls + COUNT( (/ c_NFtype == 'T' .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )
+            DO jf = 1, kfld                     ! Loop over the number of arrays to be processed
+               ipjfld(jf) = ihls(jf) + COUNT( (/ c_NFtype == 'T'  .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )   &
+               &                     + COUNT( (/ c_NFtype == 'F' .AND. cd_nat(jf) == 'T' .AND.  ihls(jf) ==  0  /) )
             END DO
          ELSE
-            ipjfld(:) = khls
+            ipjfld(:) = ihls(:)
          ENDIF
-         
-         ipj    = MAXVAL(ipjfld(:))            ! Max 2nd dimension of message transfers
-         ipjtot = SUM(   ipjfld(:))            ! Total number of lines to be exchanged
-
-         ! Index of modifying lines in input
-         ALLOCATE( ijsnd(ipj, ipf), ijbuf(ipj, ipf), ijrcv(ipj, ipf), ii1st(ipj, ipf), iiend(ipj, ipf) )
-
-         ij1 = 0
-         DO jf = 1, ipf                        ! Loop over the number of arrays to be processed
-            !
-            DO jj = 1, khls   ! first khls lines (starting from top) must be fully defined
-               ii1st(jj, jf) = 1
-               iiend(jj, jf) = jpi
-            END DO
-            !
-            ! what do we do with line khls+1 (starting from top)
-            IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot
-               SELECT CASE ( cd_nat(jf) )
-               CASE ('T','W')   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+2)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls)
-               CASE ('U'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls)
-               CASE ('V'    )   ;   i012 = 2   ;   ii1st(khls+1, jf) = 1                 ;   iiend(khls+1, jf) = jpi
-               CASE ('F'    )   ;   i012 = 2   ;   ii1st(khls+1, jf) = 1                 ;   iiend(khls+1, jf) = jpi
-               END SELECT
-            ENDIF
-            IF( c_NFtype == 'F' ) THEN          ! *  North fold  F-point pivot
-               SELECT CASE ( cd_nat(jf) )
-               CASE ('T','W')   ;   i012 = 0   ! we don't touch line khls+1
-               CASE ('U'    )   ;   i012 = 0   ! we don't touch line khls+1
-               CASE ('V'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls  )
-               CASE ('F'    )   ;   i012 = 1   ;   ii1st(khls+1, jf) = mi0(jpiglo/2+1)   ;   iiend(khls+1, jf) = mi1(jpiglo-khls-1)
-               END SELECT
-            ENDIF
-            !
-            DO jj = 1, ipjfld(jf)
-               ij1 = ij1 + 1
-               ijsnd(jj,jf) = jpj - 2*khls + jj - i012   ! sent lines (from bottom of sent lines)
-               ijbuf(jj,jf) = ij1                        ! gather all lines in the snd/rcv buffers
-               ijrcv(jj,jf) = jpj - jj + 1               ! recv lines (from the top -> reverse order for jj)
-            END DO
-            !
-         END DO
          !
-         i0max = jpimax - 2 * khls                                    ! we are not sending the halos
-         ALLOCATE( zbufs(i0max,ipjtot,ipk,ipl), ireq_s(nfd_nbnei) )   ! store all the data to be sent in a buffer array
-         ibuffsize = i0max * ipjtot * ipk * ipl
+         i0max = MAXVAL( nfni_0, mask = nfproc /= -1 )        ! largest value of Ni_0 among processors (we are not sending halos)
+         ilntot = SUM( ipjfld(:) * ipk(:) * ipl(:) )
+         ALLOCATE( zbufs(i0max,ilntot), ireq_s(nfd_nbnei) )   ! store all the data to be sent in a buffer array
+         ibuffsize = i0max * ilntot                           ! must be the same for all processors -> use i0max
          !
          ! fill the send buffer with all the lines
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-            DO jj = 1, ipjfld(jf)
-               ij1 = ijbuf(jj,jf)
-               ij2 = ijsnd(jj,jf)
-               DO ji = Nis0, Nie0       ! should not use any other value
-                  iib = ji - Nis0 + 1
-                  zbufs(iib,ij1,jk,jl) = ptab(jf)%pt4d(ji,ij2,jk,jl)
-               END DO
-               DO ji = Ni_0+1, i0max    ! avoid sending uninitialized values (make sure we don't use it)
-                  zbufs(ji,ij1,jk,jl) = HUGE(0._/**/PRECISION)   ! make sure we don't use it...
+         ij1 = 0
+         DO jf = 1, kfld
+            !
+            i012 = COUNT( (/ c_NFtype == 'T' /) ) + COUNT( (/ cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )  &
+               &              + COUNT( (/ ihls(jf) == 0 .AND. cd_nat(jf) == 'T' .AND.  c_NFtype == 'F' /) )   ! 0, 1 OR 2
+            ijsht = ipj(jf) - 2*ihls(jf) - i012         ! j-position of the sent lines (from bottom of sent lines)
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+               DO jj = 1, ipjfld(jf)
+                  ij1 = ij1 + 1
+                  ij2 = jj + ijsht
+                  DO ji = 1, Ni_0          ! use only inner domain
+                     ii2 = ji + ihls(jf)
+                     zbufs(ji,ij1) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+                  END DO
+                  DO ji = Ni_0+1, i0max    ! avoid sending uninitialized values and make sure we don't use it
+                     zbufs(ji,ij1) = zhuge
+                  END DO
                END DO
-            END DO
-         END DO   ;   END DO   ;   END DO
+            END DO   ;   END DO
+         END DO   ! jf
          !
          ! start waiting time measurement
          IF( ln_timing ) CALL tic_tac(.TRUE.)
@@ -136,68 +106,62 @@
          ! send the same buffer data to all neighbourgs as soon as possible
          DO jn = 1, nfd_nbnei
             iproc = nfd_rknei(jn)
-            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN
+            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN   ! it is neither me nor a land-only neighbourg
 #if ! defined key_mpi_off
                CALL MPI_Isend( zbufs, ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_s(jn), ierr )
 #endif
             ELSE
-               ireq_s(jn) = MPI_REQUEST_NULL
+               ireq_s(jn) = MPI_REQUEST_NULL   ! must be defined for mpi_waitall
             ENDIF
          END DO
          !
-         ALLOCATE( zbufr(i0max,ipjtot,ipk,ipl,nfd_nbnei), ireq_r(nfd_nbnei) ) 
+         ALLOCATE( zbufr(i0max,ilntot,nfd_nbnei), ireq_r(nfd_nbnei) ) 
          !
-         DO jn = 1, nfd_nbnei
-            !
+         DO jn = 1, nfd_nbnei                  ! 1st loop: first get data which does not need any communication
+            !                                  !           -> this gives more time to receive the communications
             iproc = nfd_rknei(jn)
             !
-            IF(           iproc == -1 ) THEN   ! No neighbour (land proc that was suppressed)
+            IF(           iproc == -1 ) THEN   ! No neighbour (land-only neighbourg that was suppressed)
                !
-               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received
-               zbufr(:,:,:,:,jn) = HUGE(0._/**/PRECISION)   ! default: define it and make sure we don't use it...
+               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received, must be defined for mpi_waitall
                SELECT CASE ( kfillmode )
                CASE ( jpfillnothing )                       ! no filling 
-               CASE ( jpfillcopy    )                       ! filling with inner domain values
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipjfld(jf)
-                        ij1 = ijbuf(jj,jf)
-                        ij2 = ijsnd(jj,jf)                                      ! we will use only the first value, see init_nfdcom
-                        zbufr(1,ij1,jk,jl,jn) = ptab(jf)%pt4d(Nis0,ij2,jk,jl)   ! chose to take the 1st inner domain point
-                     END DO
-                  END DO   ;   END DO   ;   END DO
+               CASE ( jpfillcopy    )                       ! filling with my inner domain values
+                  !                                            ! trick: we use only the 1st value, see init_nfdcom
+                  zbufr(1,:,jn) = zbufs(1,:)                   ! chose to take the 1st inner domain point
                CASE ( jpfillcst     )                       ! filling with constant value
-                  zbufr(1,:,:,:,jn) = pfillval              ! we will use only the first value, see init_nfdcom
+                  zbufr(1,:,jn) = pfillval                     ! trick: we use only the 1st value, see init_nfdcom
                END SELECT
                !
-            ELSE IF( iproc == narea-1 ) THEN   ! get data from myself!
+            ELSE IF( iproc == narea-1 ) THEN   ! I get data from myself!
                !
-               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received
-               DO jf = 1, ipf   ;   DO jl = 1, ipl  ;   DO jk = 1, ipk
-                  DO jj = 1, ipjfld(jf)
-                     ij1 = ijbuf(jj,jf)
-                     ij2 = ijsnd(jj,jf)
-                     DO ji = Nis0, Nie0                     ! should not use any other value
-                        iib = ji - Nis0 + 1
-                        zbufr(iib,ij1,jk,jl,jn) = ptab(jf)%pt4d(ji,ij2,jk,jl)
-                     END DO
-                  END DO
-               END DO   ;   END DO   ;   END DO
+               ireq_r(jn) = MPI_REQUEST_NULL                ! no message to be received, must be defined for mpi_waitall
+               zbufr(:,:,jn) = zbufs(:,:)                      ! we can directly do: received buffer = sent buffer!
                !
-            ELSE                               ! get data from a neighbour trough communication
+            ENDIF
+            !
+         END DO   ! nfd_nbnei
+         !
+         DO jn = 1, nfd_nbnei                  ! 2nd loop: now get data from a neighbour trough communication
+            !
+            iproc = nfd_rknei(jn)
+            IF( iproc /= narea-1 .AND. iproc /= -1 ) THEN   ! it is neither me nor a land-only neighbourg
 #if ! defined key_mpi_off
-               CALL MPI_Irecv( zbufr(:,:,:,:,jn), ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_r(jn), ierr )
+               CALL MPI_Irecv( zbufr(:,:,jn), ibuffsize, MPI_TYPE, iproc, 5, mpi_comm_oce, ireq_r(jn), ierr )
 #endif
             ENDIF
-            !
          END DO   ! nfd_nbnei
          !
+#if ! defined key_mpi_off
          CALL mpi_waitall(nfd_nbnei, ireq_r, MPI_STATUSES_IGNORE, ierr)   ! wait for all Irecv
+#endif
          !
          IF( ln_timing ) CALL tic_tac(.FALSE.)
          !
-         ! North fold boundary condition
+         ! Apply the North pole folding
          !
-         DO jf = 1, ipf
+         ij2 = 0
+         DO jf = 1, kfld
             !
             SELECT CASE ( cd_nat(jf) )     ! which grid number?
             CASE ('T','W')   ;   iig = 1   ! T-, W-point
@@ -206,76 +170,43 @@
             CASE ('F')       ;   iig = 4   ! F-point
             END SELECT
             !
-            DO jl = 1, ipl   ;   DO jk = 1, ipk
-               !
-               ! if T point with F-point pivot : must be done first
-               !    --> specific correction of 3 points near the 2 pivots (to be clean, usually masked -> so useless) 
-               IF( c_NFtype == 'F' .AND. iig == 1 ) THEN
-                  ij1 = jpj - khls     ! j-index in the receiving array
-                  ij2 = 1              ! only 1 line in the buffer
-                  DO ji = mi0(khls), mi1(khls)               ! change because of EW periodicity as we also change jpiglo-khls
-                     iib = nfd_jisnd(mi0(       khls),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0(       khls),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-                  DO ji = mi0(jpiglo/2+1), mi1(jpiglo/2+1)
-                     iib = nfd_jisnd(mi0( jpiglo/2+1),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0( jpiglo/2+1),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-                  DO ji = mi0(jpiglo-khls), mi1(jpiglo-khls)
-                     iib = nfd_jisnd(mi0(jpiglo-khls),iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(mi0(jpiglo-khls),iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = zbufr(iib,ij2,jk,jl,iin)   ! no psgn(jf)
-                  END DO
-               ENDIF
+            ihsz = ihls(jf)   ! shorter name
+            iisht = nn_hls - ihsz
+            iFT = COUNT( (/ ihsz > 0 .AND. c_NFtype == 'F' .AND. cd_nat(jf) == 'T' /) )   ! F-folding and T grid
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
                !
-               ! Apply the North pole folding.
-               DO jj = 1, ipjfld(jf)   ! for all lines to be exchanged for this field
-                  ij1 = ijrcv(jj,jf)   ! j-index in the receiving array
-                  ij2 = ijbuf(jj,jf)   ! j-index in the buffer
-                  iis = ii1st(jj,jf)   ! stating i-index in the receiving array
-                  iie = iiend(jj,jf)   !  ending i-index in the receiving array
-                  DO ji = iis, iie 
-                     iib = nfd_jisnd(ji,iig)   ! i-index in the buffer
-                     iin = nfd_rksnd(ji,iig)   ! neigbhour-index in the buffer
-                     IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(iib,ij2,jk,jl,iin)
+               DO jj = 1,ihsz                        ! NP folding for the last ihls(jf) lines of this field
+                  ij1 = ipj(jf) - jj + 1             ! j-index in the receiving array (from the top -> reverse order for jj)
+                  ij2 = ij2 + 1
+                  ij3 = ihsz+1  - jj + 1
+                  DO ji = 1, ipi(jf)
+                     ii1 = ji + iisht
+                     inei = nfd_rksnd(ii1,ij3,iig)       ! neigbhour-index in the buffer
+                     IF( nfd_rknei(inei) == -1 .AND. kfillmode == jpfillnothing )   CYCLE   ! no neighbourg and do nothing to fill
+                     ii2 = nfd_jisnd(ii1,ij3,iig)        ! i-index in the buffer, starts at 1 in the inner domain
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(ii2,ij2,inei)
                   END DO
                END DO
-               !
-               ! re-apply periodocity when we modified the eastern side of the inner domain (and not the full line)
-               IF( c_NFtype == 'T' ) THEN          ! *  North fold  T-point pivot
-                  IF(     iig <= 2 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls)   ! 'T','W','U': update west halo
-                  ELSE                      ;   iis = 1        ;   iie = 0           ! 'V','F'    : full line already exchanged
-                  ENDIF
-               ENDIF
-               IF( c_NFtype == 'F' ) THEN          ! *  North fold  F-point pivot
-                  IF(     iig <= 2 ) THEN   ;   iis = 1        ;   iie = 0           ! 'T','W','U': nothing to do
-                  ELSEIF( iig == 3 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls)   ! 'V'        : update west halo
-                  ELSEIF( khls > 1 ) THEN   ;   iis = mi0(1)   ;   iie = mi1(khls-1) ! 'F' and khls > 1
-                  ELSE                      ;   iis = 1        ;   iie = 0           ! 'F' and khls == 1 : nothing to do
-                  ENDIF
-               ENDIF
-               jj  = ipjfld(jf)     ! only for the last line of this field
-               ij1 = ijrcv(jj,jf)   ! j-index in the receiving array
-               ij2 = ijbuf(jj,jf)   ! j-index in the buffer
-               DO ji = iis, iie
-                  iib = nfd_jisnd(ji,iig)   ! i-index in the buffer
-                  iin = nfd_rksnd(ji,iig)   ! neigbhour-index in the buffer
-                  IF( nfd_rknei(iin) == -1 .AND. kfillmode == jpfillnothing )   CYCLE
-                  ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(iib,ij2,jk,jl,iin)
+               DO jj = ihsz+1, ipjfld(jf)+iFT        ! NP folding for line ipj-ihsz that can be partially modified
+                  ij1 = ipj(jf) - jj + 1             ! j-index in the receiving array (from the top -> reverse order for jj)
+                  ij2 = ij2 + 1 - iFT
+                  ij3 = 1
+                  DO ji = 1, ipi(jf)
+                     ii1 = ji + iisht
+                     IF( lnfd_same(ii1,iig) )   CYCLE    ! do nothing if should not be modified
+                     inei = nfd_rksnd(ii1,ij3,iig)       ! neigbhour-index in the buffer
+                     IF( nfd_rknei(inei) == -1 .AND. kfillmode == jpfillnothing )   CYCLE   ! no neighbourg and do nothing to fill
+                     ii2 = nfd_jisnd(ii1,ij3,iig)        ! i-index in the buffer, starts at 1 in the inner domain
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = psgn(jf) * zbufr(ii2,ij2,inei)
+                  END DO
                END DO
                !               
-            END DO   ;   END DO   ! ipl   ; ipk
+            END DO   ;   END DO   ! jk   ;   jl
             !               
-         END DO   ! ipf
-       
+         END DO   ! jf
          !
-         DEALLOCATE( zbufr, ireq_r, ijsnd, ijbuf, ijrcv, ii1st, iiend, ipjfld )
+         DEALLOCATE( zbufr, ireq_r, ipjfld )
          !
          CALL mpi_waitall(nfd_nbnei, ireq_s, MPI_STATUSES_IGNORE, ierr)   ! wait for all Isend
          !
@@ -283,114 +214,128 @@
          !
       ELSE                             !==  allgather exchanges  ==!
          !
-         ! how many lines do we exchange at max? -> ipj    (no further optimizations in this case...)
-         ipj =      khls + 2
-         ! how many lines do we     need at max? -> ipj2   (no further optimizations in this case...)
-         ipj2 = 2 * khls + 2
+         DO jf = 1, kfld
+            ! how many lines do we send for each field?
+            ipj1(jf) =     ihls(jf) + COUNT( (/ c_NFtype == 'T'  .OR. cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )  &
+               &                    + COUNT( (/ c_NFtype == 'F' .AND. cd_nat(jf) == 'T' .AND.  ihls(jf) ==  0  /) )
+            ! how many lines do we need for each field?
+            ipj2(jf) = 2 * ihls(jf) + COUNT( (/ c_NFtype == 'T' /) ) + COUNT( (/ cd_nat(jf) == 'V' .OR. cd_nat(jf) == 'F' /) )  &
+               &                    + COUNT( (/ c_NFtype == 'F' .AND. cd_nat(jf) == 'T' .AND.  ihls(jf) ==  0  /) )
+         END DO
          !
-         i0max = jpimax - 2 * khls
-         ibuffsize = i0max * ipj * ipk * ipl * ipf
-         ALLOCATE( znorthloc(i0max,ipj,ipk,ipl,ipf), znorthglo(i0max,ipj,ipk,ipl,ipf,ndim_rank_north) )
+         i0max = MAXVAL( nfni_0, mask = nfproc /= -1 )           ! largest value of Ni_0 among processors (we are not sending halos)
+         ibuffsize = i0max * SUM( ipj1(:) * ipk(:) * ipl(:) )    ! use i0max because each proc must have the same buffer size
+         ALLOCATE( znorthloc(i0max, ibuffsize/i0max), znorthall(i0max, ibuffsize/i0max, ndim_rank_north) )
          !
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk               ! put in znorthloc ipj j-lines of ptab
-            DO jj = 1, ipj
-               ij2 = jpj - ipj2 + jj                        ! the first ipj lines of the last ipj2 lines
+         ij1 = 0                                                 ! initalize line index
+         DO jf = 1, kfld   ;   DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+            DO jj = 1, ipj1(jf)                                  ! put in znorthloc ipj1(jf) j-lines of ptab
+               ij2 = ipj(jf) - ipj2(jf) + jj                     ! the first ipj1 lines of the last ipj2 lines
+               ij1 = ij1 + 1
                DO ji = 1, Ni_0
-                  ii2 = Nis0 - 1 + ji                       ! inner domain: Nis0 to Nie0
-                  znorthloc(ji,jj,jk,jl,jf) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
+                  ii2 = ihls(jf) + ji                            ! copy only the inner domain
+                  znorthloc(ji,ij1) = ptab(jf)%pt4d(ii2,ij2,jk,jl)
                END DO
-               DO ji = Ni_0+1, i0max
-                  znorthloc(ji,jj,jk,jl,jf) = HUGE(0._/**/PRECISION)   ! avoid sending uninitialized values (make sure we don't use it)
+               DO ji = Ni_0+1, i0max                             ! avoid to send uninitialized values
+                  znorthloc(ji,ij1) = zhuge                      ! and make sure we don't use it
                END DO
             END DO
          END DO   ;   END DO   ;   END DO
          !
          ! start waiting time measurement
-         IF( ln_timing ) CALL tic_tac(.TRUE.)
 #if ! defined key_mpi_off
-         CALL MPI_ALLGATHER( znorthloc, ibuffsize, MPI_TYPE, znorthglo, ibuffsize, MPI_TYPE, ncomm_north, ierr )
+         IF( ln_timing )   CALL tic_tac( .TRUE.)   ! start waiting time measurement
+         ! fill znorthall with the znorthloc of each northern process
+         CALL MPI_ALLGATHER( znorthloc, ibuffsize, MPI_TYPE, znorthall, ibuffsize, MPI_TYPE, ncomm_north, ierr )
+         IF( ln_timing )   CALL tic_tac(.FALSE.)   ! stop waiting time measurement
 #endif
-         ! stop waiting time measurement
-         IF( ln_timing ) CALL tic_tac(.FALSE.)
-         DEALLOCATE( znorthloc )
-         ALLOCATE( ztabglo(ipf) )
-         DO jf = 1, ipf
-            ALLOCATE( ztabglo(jf)%pt4d(jpiglo,ipj2,ipk,ipl) )
-         END DO
+         DEALLOCATE( znorthloc )                                 ! no more need of znorthloc
          !
-         ! need to fill only the first ipj lines of ztabglo as lbc_nfd don't use the last khls lines
-         ijnr = 0
-         DO jr = 1, jpni                                                        ! recover the global north array
-            iproc = nfproc(jr)
-            impp  = nfimpp(jr)
-            ipi   = nfjpi( jr) - 2 * khls                       ! corresponds to Ni_0 but for subdomain iproc
-            IF( iproc == -1 ) THEN   ! No neighbour (land proc that was suppressed)
-              !
-               SELECT CASE ( kfillmode )
-               CASE ( jpfillnothing )               ! no filling
-                  CALL ctl_stop( 'STOP', 'mpp_nfd_generic : cannot use jpfillnothing with ln_nnogather = F')
-               CASE ( jpfillcopy    )               ! filling with inner domain values
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipj
-                        ij2 = jpj - ipj2 + jj                    ! the first ipj lines of the last ipj2 lines
-                        DO ji = 1, ipi
-                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc
-                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(Nis0,ij2,jk,jl) ! chose to take the 1st inner domain point
+         DO jf = 1, kfld
+            !
+            ihsz = ihls(jf)   ! shorter name
+            iisht = nn_hls - ihsz
+            ALLOCATE( ztabglo(1)%pt4d(Ni0glo+2*ihsz,ipj2(jf),ipk(jf),ipl(jf)) )
+            !
+            iFU = COUNT( (/ c_NFtype == 'F' .AND. cd_nat(jf) == 'U' /) )    ! F-folding and U grid
+            IF( iFU == 0 )   ztabglo(1)%pt4d(:,ipj2(jf)-ihsz,:,:) = zhuge   ! flag off the line that is not fully modified
+            !
+            ! need to fill only the first ipj1(j) lines of ztabglo as lbc_nfd don't use the last ihsz lines
+            ijnr = 0
+            DO jr = 1, jpni                                      ! recover the global north array using each northern process
+               iproc = nfproc(jr)                                ! process number
+               impp  = nfimpp(jr) + ihsz   ! ( = +nn_hls-iisht)  ! inner domain position (without halos) of subdomain iproc 
+               ipi0  = nfni_0(jr)                                ! Ni_0 but for subdomain iproc
+               !
+               IF( iproc == -1 ) THEN                  ! No neighbour (land proc that was suppressed)
+                  !
+                  SELECT CASE ( kfillmode )
+                  CASE ( jpfillnothing )               ! no filling
+                     CALL ctl_stop( 'STOP', 'mpp_nfd_generic : cannot use jpfillnothing with ln_nnogather = F')
+                  CASE ( jpfillcopy    )               ! filling with inner domain values
+                     DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                        DO jj = 1, ipj1(jf)
+                           ij2 = ipj(jf) - ipj2(jf) + jj     ! the first ipj1(jf) lines of the last ipj2(jf) lines
+                           DO ji = 1, ipi0
+                              ii1 = impp + ji - 1            ! inner iproc-subdomain in the global domain with ihsz halos
+                              ztabglo(1)%pt4d(ii1,jj,jk,jl) = ptab(jf)%pt4d(ihsz+1,ij2,jk,jl) ! take the 1st inner domain point
+                           END DO
                         END DO
-                     END DO
-                  END DO   ;   END DO   ;   END DO
-               CASE ( jpfillcst     )               ! filling with constant value
-                  DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                     DO jj = 1, ipj
-                        DO ji = 1, ipi
-                           ii1 = impp + khls + ji - 1            ! corresponds to mig(khls + ji) but for subdomain iproc
-                           ztabglo(jf)%pt4d(ii1,jj,jk,jl) = pfillval
+                     END DO   ;   END DO
+                  CASE ( jpfillcst     )               ! filling with constant value
+                     DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                        DO jj = 1, ipj1(jf)
+                           DO ji = 1, ipi0
+                              ii1 = impp + ji - 1            ! inner iproc-subdomain in the global domain with ihsz halos
+                              ztabglo(1)%pt4d(ii1,jj,jk,jl) = pfillval
+                           END DO
+                        END DO
+                     END DO   ;   END DO
+                  END SELECT
+                  !
+               ELSE                                    ! use neighbour values
+                  ijnr = ijnr + 1
+                  ij1 = SUM( ipj1(1:jf-1) * ipk(1:jf-1) * ipl(1:jf-1) )   ! reset line offset, return 0 if jf = 1
+                  DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)
+                     DO jj = 1, ipj1(jf)
+                        ij1 = ij1 + 1
+                        DO ji = 1, ipi0
+                           ii1 = impp + ji - 1               ! inner iproc-subdomain in the global domain with ihsz halos
+                           ztabglo(1)%pt4d(ii1,jj,jk,jl) = znorthall(ji, ij1, ijnr)
                         END DO
                      END DO
-                 END DO   ;   END DO   ;   END DO
-               END SELECT
+                  END DO   ;   END DO
+               ENDIF
                !
-            ELSE
-               ijnr = ijnr + 1
-               DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk
-                  DO jj = 1, ipj
-                     DO ji = 1, ipi
-                        ii1 = impp + khls + ji - 1               ! corresponds to mig(khls + ji) but for subdomain iproc
-                        ztabglo(jf)%pt4d(ii1,jj,jk,jl) = znorthglo(ji,jj,jk,jl,jf,ijnr)
-                     END DO
-                  END DO
-               END DO   ;   END DO   ;   END DO
-            ENDIF
+            END DO   ! jpni
             !
-         END DO   ! jpni
-         DEALLOCATE( znorthglo )
-         !
-         DO jf = 1, ipf
-            CALL lbc_nfd( ztabglo(jf:jf), cd_nat(jf:jf), psgn(jf:jf), khls, 1 )   ! North fold boundary condition
-            DO jl = 1, ipl   ;   DO jk = 1, ipk                  ! e-w periodicity
-               DO jj = 1, khls + 1
-                  ij1 = ipj2 - (khls + 1) + jj                   ! need only the last khls + 1 lines until ipj2
-                  ztabglo(jf)%pt4d(            1:  khls,ij1,jk,jl) = ztabglo(jf)%pt4d(jpiglo-2*khls+1:jpiglo-khls,ij1,jk,jl)
-                  ztabglo(jf)%pt4d(jpiglo-khls+1:jpiglo,ij1,jk,jl) = ztabglo(jf)%pt4d(         khls+1:     2*khls,ij1,jk,jl)
+            CALL lbc_nfd( ztabglo, cd_nat(jf:jf), psgn(jf:jf), 1 )   ! North fold boundary condition
+            !
+            DO jl = 1, ipl(jf)   ;   DO jk = 1, ipk(jf)               ! Scatter back to ARRAY_IN
+               DO jj = 0, ihsz-1
+                  ij1 = ipj( jf) - jj   ! last ihsz lines
+                  ij2 = ipj2(jf) - jj   ! last ihsz lines
+                  DO ji= 1, ipi(jf)
+                     ii2 = mig(ji+iisht,ihsz)            ! warning, mig is expecting local domain indices related to nn_hls
+                     ptab(jf)%pt4d(ji,ij1,jk,jl) = ztabglo(1)%pt4d(ii2,ij2,jk,jl)
+                  END DO
                END DO
-            END DO   ;   END DO
-         END DO     
-         !
-         DO jf = 1, ipf   ;   DO jl = 1, ipl   ;   DO jk = 1, ipk               ! Scatter back to ARRAY_IN
-            DO jj = 1, khls + 1
-               ij1 = jpj  - (khls + 1) + jj   ! last khls + 1 lines until jpj
-               ij2 = ipj2 - (khls + 1) + jj   ! last khls + 1 lines until ipj2
-               DO ji= 1, jpi
-                  ii2 = mig(ji)
-                  ptab(jf)%pt4d(ji,ij1,jk,jl) = ztabglo(jf)%pt4d(ii2,ij2,jk,jl)
+               DO jj = ihsz, ihsz - iFU
+                  ij1 = ipj( jf) - jj   ! last ihsz+1 line
+                  ij2 = ipj2(jf) - jj   ! last ihsz+1 line
+                  DO ji= 1, ipi(jf)
+                     ii2 = mig(ji+iisht,ihsz)            ! warning, mig is expecting local domain indices related to nn_hls
+                     zztmp = ztabglo(1)%pt4d(ii2,ij2,jk,jl)
+                     IF( zztmp /= zhuge )   ptab(jf)%pt4d(ji,ij1,jk,jl) = zztmp   ! apply it only if it was modified by lbc_nfd
+                  END DO
                END DO
-            END DO
-         END DO   ;   END DO   ;   END DO
+            END DO   ;   END DO
+            !
+            DEALLOCATE( ztabglo(1)%pt4d )
+            !
+         END DO   ! jf
          !
-         DO jf = 1, ipf
-            DEALLOCATE( ztabglo(jf)%pt4d )
-         END DO
-         DEALLOCATE( ztabglo )
+         DEALLOCATE( znorthall )
          !
       ENDIF   ! ln_nnogather
       !
diff --git a/src/OCE/LBC/mppini.F90 b/src/OCE/LBC/mppini.F90
index b59af288e..99df2fa79 100644
--- a/src/OCE/LBC/mppini.F90
+++ b/src/OCE/LBC/mppini.F90
@@ -165,6 +165,10 @@ CONTAINS
 902   IF( ios >  0 )   CALL ctl_nam ( ios , 'nammpp in configuration namelist' )
       !
       nn_hls = MAX(1, nn_hls)   ! nn_hls must be > 0
+# if defined key_mpi2
+      WRITE(numout,*) '   use key_mpi2, we force nn_comm = 1'
+      nn_comm = 1
+# endif
       IF(lwp) THEN
             WRITE(numout,*) '   Namelist nammpp'
          IF( jpni < 1 .OR. jpnj < 1 ) THEN
@@ -303,7 +307,7 @@ CONTAINS
 9002  FORMAT (a, i4, a)
 9003  FORMAT (a, i5)
 
-      ALLOCATE( nfimpp(jpni), nfproc(jpni), nfjpi(jpni),   &
+      ALLOCATE( nfimpp(jpni), nfproc(jpni), nfjpi(jpni), nfni_0(jpni),   &
          &      iin(jpnij), ijn(jpnij),   &
          &      iimppt(jpni,jpnj), ijmppt(jpni,jpnj), ijpi(jpni,jpnj), ijpj(jpni,jpnj), ipproc(jpni,jpnj),   &
          &      inei(8,jpni,jpnj), llnei(8,jpni,jpnj),   &
@@ -375,7 +379,8 @@ CONTAINS
       ! Store informations for the north pole folding communications
       nfproc(:) = ipproc(:,jpnj)
       nfimpp(:) = iimppt(:,jpnj)
-      nfjpi (:) =   ijpi(:,jpnj)
+      nfjpi (:) =   ijpi(:,jpnj)   ! needed only for mpp_lbc_north_icb_generic.h90
+      nfni_0(:) =   ijpi(:,jpnj) - 2 * nn_hls
       !
       ! 3. Define Western, Eastern, Southern and Northern neighbors + corners in the subdomain grid reference
       ! ------------------------------------------------------------------------------------------------------
@@ -490,7 +495,7 @@ CONTAINS
       !
       ! set default neighbours
       mpinei(:) = impi(:,narea)   ! should be just local but is still used in icblbc and mpp_lnk_icb_generic.h90...
-      mpiSnei(0,:) = -1  ! no comm if no halo (but need it for NP Folding
+      mpiSnei(0,:) = -1           ! no comm if no halo (but still need to call the NP Folding that may modify the last line)
       mpiRnei(0,:) = -1 
       DO jh = 1, n_hlsmax
          mpiSnei(jh,:) = impi(:,narea)   ! default definition
@@ -518,6 +523,7 @@ CONTAINS
       !
       !                          ! Prepare mpp north fold
       !
+      l_NFold = l_NFold .AND. ANY( nfproc /= -1 )             ! make sure that we kept at least 1 proc along the last line
       llmpiNFold =          jpni  > 1 .AND. l_NFold           ! is the North fold done with an MPI communication?
       l_IdoNFold = ijn(narea) == jpnj .AND. l_NFold           ! is this process doing North fold?
       !
@@ -1181,7 +1187,7 @@ CONTAINS
          !
          ALLOCATE( zmsk0(ipi,ipj), zmsk(ipi,ipj) )
          zmsk0(jh+1:jh+Ni_0,jh+1:jh+Nj_0) = REAL(COUNT(lloce, dim = 3), wp)   ! define inner domain -> need REAL to use lbclnk
-         CALL lbc_lnk('mppini', zmsk0, 'T', 1._wp, khls = jh)                 ! fill halos
+         CALL lbc_lnk( ' mppini', zmsk0, 'T', 1._wp )                         ! fill halos
          ! Beware about the mask we must use here :
          DO jj = jh+1, jh+Nj_0
             DO ji = jh+1, jh+Ni_0
@@ -1194,7 +1200,7 @@ CONTAINS
                   &        + zmsk0(ji+1,jj) + zmsk0(ji,jj+1) + zmsk0(ji+1,jj+1)
             END DO
          END DO
-         CALL lbc_lnk('mppini', zmsk, 'T', 1._wp, khls = jh)                 ! fill halos again!
+         CALL lbc_lnk( 'mppini', zmsk, 'T', 1._wp )                           ! fill halos again!
          !        
          iiwe = jh   ;   iiea = Ni_0   ! bottom-left corner - 1 of the sent data
          ijso = jh   ;   ijno = Nj_0
@@ -1267,7 +1273,7 @@ ENDIF
       ! used in IOM. This works even if jpnij .ne. jpni*jpnj.
       iglo( :) = (/ Ni0glo, Nj0glo /)
       iloc( :) = (/ Ni_0  , Nj_0   /)
-      iabsf(:) = (/ Nis0  , Njs0   /) + (/ nimpp, njmpp /) - 1 - nn_hls   ! corresponds to mig0(Nis0) but mig0 is not yet defined!
+      iabsf(:) = (/ Nis0  , Njs0   /) + (/ nimpp, njmpp /) - 1 - nn_hls   ! corresponds to mig(Nis0,0) but mig is not yet defined!
       iabsl(:) = iabsf(:) + iloc(:) - 1
       ihals(:) = (/ 0     , 0      /)
       ihale(:) = (/ 0     , 0      /)
@@ -1302,10 +1308,10 @@ ENDIF
       INTEGER, INTENT(in   ) ::   knum       ! layout.dat unit
       !
       REAL(wp), DIMENSION(jpi,jpj,2,4) ::   zinfo
-      INTEGER , DIMENSION(10) ::   irknei ! too many elements but safe...
+      INTEGER , DIMENSION(0:10) ::   irknei ! too many elements but safe...
       INTEGER                 ::   ji, jj, jg, jn   ! dummy loop indices
       INTEGER                 ::   iitmp
-      LOGICAL                 ::   lnew
+      LOGICAL                 ::   llnew
       !!----------------------------------------------------------------------
       !
       IF (lwp) THEN
@@ -1319,29 +1325,28 @@ ENDIF
          WRITE(knum,*)
          WRITE(knum,*)
          WRITE(knum,*) 'Number of subdomains located along the north fold : ', ndim_rank_north
-         WRITE(knum,*) 'Rank of the subdomains located along the north fold : ', ndim_rank_north
+         WRITE(knum,*) 'Rank of the subdomains located along the north fold : '
          DO jn = 1, ndim_rank_north, 5
             WRITE(knum,*) nrank_north( jn:MINVAL( (/jn+4,ndim_rank_north/) ) )
          END DO
       ENDIF
       
-      nfd_nbnei = 0   ! defaul def (useless?)
+      nfd_nbnei = 0   ! default def (useless?)
       IF( ln_nnogather ) THEN
          !
          ! Use the "gather nfd" to know how to do the nfd: for ji point, which process send data from which of its ji-index?
          ! Note that nfd is perfectly symetric: I receive data from X <=> I send data to X  (-> no deadlock)
          !
-         zinfo(:,:,:,:) = HUGE(0._wp)   ! default def to make sure we don't use the halos
-         DO jg = 1, 4   ! grid type: T, U, V, F
+         DO jg = 1, 4                                   ! grid type: T, U, V, F
             DO jj = nn_hls+1, jpj-nn_hls                ! inner domain (warning do_loop_substitute not yet defined)
                DO ji = nn_hls+1, jpi-nn_hls             ! inner domain (warning do_loop_substitute not yet defined)
-                  zinfo(ji,jj,1,jg) = REAL(narea, wp)   ! mpi_rank + 1 (as default lbc_lnk fill is 0
+                  zinfo(ji,jj,1,jg) = REAL(narea, wp)   ! mpi_rank + 1 (note: lbc_lnk will put 0 if no neighbour)
                   zinfo(ji,jj,2,jg) = REAL(ji, wp)      ! ji of this proc
                END DO
             END DO
          END DO
          !
-         ln_nnogather = .FALSE.   ! force "classical" North pole folding to fill all halos -> should be no more HUGE values...
+         ln_nnogather = .FALSE.   ! force "classical" North pole folding to fill all halos
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,1), 'T', 1._wp )   ! Do 4 calls instead of 1 to save memory as the nogather version
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,2), 'U', 1._wp )   ! creates buffer arrays with jpiglo as the first dimension
          CALL lbc_lnk( 'mppini', zinfo(:,:,:,3), 'V', 1._wp )   ! 
@@ -1350,24 +1355,52 @@ ENDIF
          
          IF( l_IdoNFold ) THEN   ! only the procs involed in the NFD must take care of this
             
-            ALLOCATE( nfd_rksnd(jpi,4), nfd_jisnd(jpi,4) )          ! neighbour rand and remote ji-index for each grid (T, U, V, F)
-            nfd_rksnd(:,:) = NINT( zinfo(:, jpj, 1, :) ) - 1        ! neighbour MPI rank
-            nfd_jisnd(:,:) = NINT( zinfo(:, jpj, 2, :) ) - nn_hls   ! neighbour ji index (shifted as we don't send the halos)
-            WHERE( nfd_rksnd == -1 )   nfd_jisnd = 1                ! use ji=1 if no neighbour, see mpp_nfd_generic.h90
-            
-            nfd_nbnei = 1                ! Number of neighbour sending data for the nfd. We have at least 1 neighbour!
-            irknei(1) = nfd_rksnd(1,1)   ! which is the 1st one (I can be neighbour of myself, exclude land-proc are also ok)
+            ALLOCATE( nfd_rksnd(jpi,nn_hls+1,4), nfd_jisnd(jpi,nn_hls+1,4), lnfd_same(jpi,4) )
+            nfd_rksnd(:,:,:) = NINT( zinfo(:,jpj-nn_hls:jpj,1,:) ) - 1        ! neighbour MPI rank (-1 means no neighbour)
+            ! Use some tricks for mpp_nfd_generic.h90:
+            !    1) neighbour ji index (shifted as we don't send the halos)
+            nfd_jisnd(:,:,:) = NINT( zinfo(:,jpj-nn_hls:jpj,2,:) ) - nn_hls
+            !    2) use ji=1 if no neighbour
+            WHERE( nfd_rksnd == -1 )   nfd_jisnd = 1
+            !    3) control which points must be modified by the NP folding on line jpjglo-nn_hls
+            lnfd_same(:,:) = .TRUE.
+            IF(     c_NFtype == 'T' ) THEN
+               lnfd_same(mi0(jpiglo/2+2,nn_hls):mi1(jpiglo-nn_hls,nn_hls),  1) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1,nn_hls):mi1(jpiglo-nn_hls,nn_hls),  2) = .FALSE.
+               lnfd_same(mi0(  nn_hls+1,nn_hls):mi1(jpiglo-nn_hls,nn_hls),3:4) = .FALSE.
+               IF( l_Iperio ) THEN   ! in case the ew-periodicity was done before calling the NP folding
+                  lnfd_same(mi0(              1,nn_hls):mi1(nn_hls,nn_hls),1:4) = .FALSE.
+                  lnfd_same(mi0(jpiglo-nn_hls+1,nn_hls):mi1(jpiglo,nn_hls),3:4) = .FALSE.
+               ENDIF
+            ELSEIF( c_NFtype == 'F' ) THEN
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo/2+1     ,nn_hls),1) = .FALSE.
+               lnfd_same(mi0(jpiglo-nn_hls,nn_hls):mi1(jpiglo-nn_hls  ,nn_hls),1) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo-nn_hls  ,nn_hls),3) = .FALSE.
+               lnfd_same(mi0(jpiglo/2+1   ,nn_hls):mi1(jpiglo-nn_hls-1,nn_hls),4) = .FALSE.
+               IF( l_Iperio ) THEN   ! in case the ew-periodicity was done before calling the NP folding
+                  lnfd_same(mi0(nn_hls,nn_hls):mi1(nn_hls  ,nn_hls),1) = .FALSE.
+                  lnfd_same(mi0(     1,nn_hls):mi1(nn_hls  ,nn_hls),3) = .FALSE.
+                  IF( nn_hls > 1 ) lnfd_same(mi0(     1,nn_hls):mi1(nn_hls-1,nn_hls),4) = .FALSE.
+               ENDIF
+            ENDIF
+            WHERE( lnfd_same )   nfd_jisnd(:,1,:) = HUGE(0)   ! make sure we dont use it
+               
+            nfd_nbnei = 0
+            irknei(0) = HUGE(0)
             DO jg = 1, 4
-               DO ji = 1, jpi     ! we must be able to fill the full line including halos
-                  lnew = .TRUE.   ! new neighbour?
-                  DO jn = 1, nfd_nbnei
-                     IF( irknei(jn) == nfd_rksnd(ji,jg) )   lnew = .FALSE.   ! already found
+               DO jj = 1, nn_hls+1
+                  DO ji = 1, jpi     ! we must be able to fill the full line including halos
+                     IF( jj == 1 .AND. lnfd_same(ji,jg) )   CYCLE
+                     llnew = .TRUE.   ! new neighbour?
+                     DO jn = 0, nfd_nbnei
+                        IF( irknei(jn) == nfd_rksnd(ji,jj,jg) )   llnew = .FALSE.   ! already found
+                     END DO
+                     IF( llnew ) THEN
+                        jn = nfd_nbnei + 1
+                        nfd_nbnei = jn
+                        irknei(jn) = nfd_rksnd(ji,jj,jg)
+                     ENDIF
                   END DO
-                  IF( lnew ) THEN
-                     jn = nfd_nbnei + 1
-                     nfd_nbnei = jn
-                     irknei(jn) = nfd_rksnd(ji,jg)
-                  ENDIF
                END DO
             END DO
             
@@ -1375,14 +1408,20 @@ ENDIF
             nfd_rknei(:) = irknei(1:nfd_nbnei)
             ! re-number nfd_rksnd according to the indexes of nfd_rknei
             DO jg = 1, 4
-               DO ji = 1, jpi
-                  iitmp = nfd_rksnd(ji,jg)   ! must store a copy of nfd_rksnd(ji,jg) to make sure we don't change it twice
-                  DO jn = 1, nfd_nbnei
-                     IF( iitmp == nfd_rknei(jn) )   nfd_rksnd(ji,jg) = jn
+               DO jj = 1, nn_hls+1
+                  DO ji = 1, jpi
+                     IF( jj == 1 .AND. lnfd_same(ji,jg) ) THEN
+                        nfd_rksnd(ji,jj,jg) = HUGE(0)   ! make sure we don't use it
+                     ELSE
+                        iitmp = nfd_rksnd(ji,jj,jg)     ! must store a copy of nfd_rksnd(ji,jj,jg) so we don't change it twice
+                        DO jn = 1, nfd_nbnei
+                           IF( iitmp == nfd_rknei(jn) )   nfd_rksnd(ji,jj,jg) = jn
+                        END DO
+                     ENDIF
                   END DO
                END DO
             END DO
-            
+
             IF( ldwrtlay ) THEN
                WRITE(knum,*)
                WRITE(knum,*) 'north fold exchanges with explicit point-to-point messaging :'
@@ -1437,38 +1476,74 @@ ENDIF
       !!
       !! ** Method  :
       !!
-      !! ** Action  : - mig , mjg : local  domain indices ==> global domain, including halos, indices
-      !!              - mig0, mjg0: local  domain indices ==> global domain, excluding halos, indices
+      !!              Local domain indices: Same values for the same point, different upper/lower bounds 
+      !!              e.g. with nn_hls = 2
+      !!                    jh = 0   x,x,3,...,jpi-2,    x,  x
+      !!                    jh = 1   x,2,3,...,jpi-2,jpi-1,  x
+      !!                    jh = 2   1,2,3,...,jpi-2,jpi-1,jpi
+      !!       
+      !!                 or jh = 0   x,x,3,...,Ni_0+2,     x,     x
+      !!                    jh = 1   x,2,3,...,Ni_0+2,Ni_0+3,     x
+      !!                    jh = 2   1,2,3,...,Ni_0+2,Ni_0+3,Ni_0+4
+      !!              
+      !!              Global domain indices: different values for the same point, all starts at 1
+      !!              e.g. with nn_hls = 2
+      !!                    jh = 0       1,2,3,              ...,jpiglo-4,       x,     x,x,x
+      !!                    jh = 1     1,2,3,       ...,jpiglo-4,jpiglo-3,jpiglo-2,     x,x
+      !!                    jh = 2   1,2,3,...,jpiglo-4,jpiglo-3,jpiglo-2,jpiglo-1,jpiglo
+      !!       
+      !!                 or jh = 0       1,2,3,            ...,Ni0glo  ,       x,       x,x,x
+      !!                    jh = 1     1,2,3,     ...,Ni0glo  ,Ni0glo+1,Ni0glo+2,       x,x
+      !!                    jh = 2   1,2,3,...,Ni0glo,Ni0glo+1,Ni0glo+2,Ni0glo+3,Ni0glo+4
+      !!                                 ^
+      !!                                 |
+      !!                                 |
+      !!                               iimpp
+      !!
+      !! ** Action  : - mig , mjg : local  domain indices ==> global domain indices
       !!              - mi0 , mi1 : global domain indices ==> local  domain indices
       !!              - mj0 , mj1   (if global point not in the local domain ==> mi0>mi1 and/or mj0>mj1)
       !!----------------------------------------------------------------------
-      INTEGER ::   ji, jj   ! dummy loop argument
+      INTEGER ::   ji, jj, jh   ! dummy loop argument
+      INTEGER ::   ipi, ipj, ipiglo, ipjglo, iimpp, ijmpp, ishft
       !!----------------------------------------------------------------------
       !
-      ALLOCATE( mig(jpi), mjg(jpj), mig0(jpi), mjg0(jpj) )
-      ALLOCATE( mi0(jpiglo), mi1(jpiglo), mj0(jpjglo), mj1(jpjglo) )
+      ALLOCATE( mig(jpi   , 0:nn_hls), mjg(jpj   , 0:nn_hls) )
+      ALLOCATE( mi0(jpiglo, 0:nn_hls), mi1(jpiglo, 0:nn_hls), mj0(jpjglo, 0:nn_hls), mj1(jpjglo, 0:nn_hls) )
       !
-      DO ji = 1, jpi                 ! local domain indices ==> global domain indices, including halos
-        mig(ji) = ji + nimpp - 1
-      END DO
-      DO jj = 1, jpj
-        mjg(jj) = jj + njmpp - 1
-      END DO
-      !                              ! local domain indices ==> global domain indices, excluding halos
-      !
-      mig0(:) = mig(:) - nn_hls
-      mjg0(:) = mjg(:) - nn_hls
-      !                              ! global domain, including halos, indices ==> local domain indices
-      !                                   ! (return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
-      !                                   ! local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
-      DO ji = 1, jpiglo
-        mi0(ji) = MAX( 1 , MIN( ji - nimpp + 1, jpi+1 ) )
-        mi1(ji) = MAX( 0 , MIN( ji - nimpp + 1, jpi   ) )
-      END DO
-      DO jj = 1, jpjglo
-        mj0(jj) = MAX( 1 , MIN( jj - njmpp + 1, jpj+1 ) )
-        mj1(jj) = MAX( 0 , MIN( jj - njmpp + 1, jpj   ) )
-      END DO
+      DO jh = 0, nn_hls
+         !
+         ishft  = nn_hls - jh
+         !
+         ipi    = Ni_0   + 2*jh   ;   ipj    = Nj_0   + 2*jh
+         ipiglo = Ni0glo + 2*jh   ;   ipjglo = Nj0glo + 2*jh
+         iimpp  = nimpp - ishft   ;   ijmpp  = njmpp - ishft
+         !
+         ! local domain indices ==> global domain indices, including jh halos
+         !
+         DO ji = ishft + 1, ishft + ipi
+            mig(ji,jh) = ji + iimpp - 1
+         END DO
+         !
+         DO jj = ishft + 1, ishft + ipj
+            mjg(jj,jh) = jj + ijmpp - 1
+         END DO
+         !
+         ! global domain, including jh halos, indices ==> local domain indices
+         !    return (m.0,m.1)=(1,0) if data domain gridpoint is to the west/south of the
+         !    local domain, or (m.0,m.1)=(jp.+1,jp.) to the east/north of local domain.
+         !
+         DO ji = 1, ipiglo
+            mi0(ji,jh) = MAX( 1 , MIN( ji - iimpp + 1, ipi+ishft+1 ) )
+            mi1(ji,jh) = MAX( 0 , MIN( ji - iimpp + 1, ipi+ishft   ) )
+         END DO
+         !
+         DO jj = 1, ipjglo
+            mj0(jj,jh) = MAX( 1 , MIN( jj - ijmpp + 1, ipj+ishft+1 ) )
+            mj1(jj,jh) = MAX( 0 , MIN( jj - ijmpp + 1, ipj+ishft   ) )
+         END DO
+         !
+      END DO   ! jh
       !
    END SUBROUTINE init_locglo
    
diff --git a/src/OCE/OBS/mpp_map.F90 b/src/OCE/OBS/mpp_map.F90
index 5a4007df1..553a36446 100644
--- a/src/OCE/OBS/mpp_map.F90
+++ b/src/OCE/OBS/mpp_map.F90
@@ -10,8 +10,8 @@ MODULE mpp_map
    !!  mppmap_init : Initialize mppmap.
    !!----------------------------------------------------------------------
    USE par_kind, ONLY :   wp            ! Precision variables
-   USE par_oce , ONLY :   jpi, jpj, Nis0, Nie0, Njs0, Nje0   ! Ocean parameters
-   USE dom_oce , ONLY :   mig, mjg, narea                    ! Ocean space and time domain variables
+   USE par_oce , ONLY :   jpi, jpj, Nis0, Nie0, Njs0, Nje0, nn_hls   ! Ocean parameters
+   USE dom_oce , ONLY :   mig, mjg, narea                            ! Ocean space and time domain variables
 #if ! defined key_mpi_off
    USE lib_mpp , ONLY :   mpi_comm_oce   ! MPP library
 #endif
@@ -64,7 +64,7 @@ INCLUDE 'mpif.h'
       imppmap(:,:) = 0
 
 !      ! Setup local grid points
-      imppmap(mig(1):mig(jpi),mjg(1):mjg(jpj)) = narea
+      imppmap(mig(1,nn_hls):mig(jpi,nn_hls),mjg(1,nn_hls):mjg(jpj,nn_hls)) = narea
       
       ! Get global data
 
diff --git a/src/OCE/OBS/obs_grd_bruteforce.h90 b/src/OCE/OBS/obs_grd_bruteforce.h90
index 5a41fa312..5df8b26c7 100644
--- a/src/OCE/OBS/obs_grd_bruteforce.h90
+++ b/src/OCE/OBS/obs_grd_bruteforce.h90
@@ -111,9 +111,9 @@
          zmskg(:,:) = -1.e+10
          DO jj = kldj, klej
             DO ji = kldi, klei
-               zlamg(mig(ji),mjg(jj)) = pglam(ji,jj)
-               zphig(mig(ji),mjg(jj)) = pgphi(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = pmask(ji,jj)
+               zlamg(mig(ji,nn_hls),mjg(jj,nn_hls)) = pglam(ji,jj)
+               zphig(mig(ji,nn_hls),mjg(jj,nn_hls)) = pgphi(ji,jj)
+               zmskg(mig(ji,nn_hls),mjg(jj,nn_hls)) = pmask(ji,jj)
             END DO
          END DO
          CALL mpp_global_max( zlamg )
diff --git a/src/OCE/OBS/obs_grid.F90 b/src/OCE/OBS/obs_grid.F90
index 715741623..b9c7554c4 100644
--- a/src/OCE/OBS/obs_grid.F90
+++ b/src/OCE/OBS/obs_grid.F90
@@ -280,9 +280,9 @@ CONTAINS
          ! Add various grids here.
          DO jj = 1, jpj
             DO ji = 1, jpi
-               zlamg(mig(ji),mjg(jj)) = glamt(ji,jj)
-               zphig(mig(ji),mjg(jj)) = gphit(ji,jj)
-               zmskg(mig(ji),mjg(jj)) = tmask(ji,jj,1)
+               zlamg(mig(ji,nn_hls),mjg(jj,nn_hls)) = glamt(ji,jj)
+               zphig(mig(ji,nn_hls),mjg(jj,nn_hls)) = gphit(ji,jj)
+               zmskg(mig(ji,nn_hls),mjg(jj,nn_hls)) = tmask(ji,jj,1)
             END DO
          END DO
          CALL mpp_global_max( zlamg )
diff --git a/src/OCE/OBS/obs_inter_sup.F90 b/src/OCE/OBS/obs_inter_sup.F90
index d8116276d..084830e1d 100644
--- a/src/OCE/OBS/obs_inter_sup.F90
+++ b/src/OCE/OBS/obs_inter_sup.F90
@@ -279,8 +279,8 @@ CONTAINS
       ! Pack interpolation data to be sent
 
       DO ji = 1, itot
-         ii = mi1(igrdij_recv(2*ji-1))
-         ij = mj1(igrdij_recv(2*ji))
+         ii = mi1(igrdij_recv(2*ji-1),nn_hls)
+         ij = mj1(igrdij_recv(2*ji  ),nn_hls)
          DO jk = 1, kpk
             zsend(jk,ji) = pval(ii,ij,jk)
          END DO
diff --git a/src/OCE/OBS/obs_write.F90 b/src/OCE/OBS/obs_write.F90
index 1b44338d0..d0c0eda8c 100644
--- a/src/OCE/OBS/obs_write.F90
+++ b/src/OCE/OBS/obs_write.F90
@@ -245,8 +245,8 @@ CONTAINS
                fbdata%iobsi(jo,jvar) = profdata%mi(jo,jvar)
                fbdata%iobsj(jo,jvar) = profdata%mj(jo,jvar)
             ELSE
-               fbdata%iobsi(jo,jvar) = mig(profdata%mi(jo,jvar))
-               fbdata%iobsj(jo,jvar) = mjg(profdata%mj(jo,jvar))
+               fbdata%iobsi(jo,jvar) = mig(profdata%mi(jo,jvar),nn_hls)
+               fbdata%iobsj(jo,jvar) = mjg(profdata%mj(jo,jvar),nn_hls)
             ENDIF
          END DO
          CALL greg2jul( 0, &
@@ -511,8 +511,8 @@ CONTAINS
             fbdata%iobsi(jo,1) = surfdata%mi(jo)
             fbdata%iobsj(jo,1) = surfdata%mj(jo)
          ELSE
-            fbdata%iobsi(jo,1) = mig(surfdata%mi(jo))
-            fbdata%iobsj(jo,1) = mjg(surfdata%mj(jo))
+            fbdata%iobsi(jo,1) = mig(surfdata%mi(jo),nn_hls)
+            fbdata%iobsj(jo,1) = mjg(surfdata%mj(jo),nn_hls)
          ENDIF
          CALL greg2jul( 0, &
             &           surfdata%nmin(jo), &
diff --git a/src/OCE/SBC/cpl_oasis3.F90 b/src/OCE/SBC/cpl_oasis3.F90
index 091ce6873..b86deba54 100644
--- a/src/OCE/SBC/cpl_oasis3.F90
+++ b/src/OCE/SBC/cpl_oasis3.F90
@@ -171,11 +171,11 @@ CONTAINS
       ! ... Define the partition, excluding halos as we don't want them to be "seen" by oasis
       ! -----------------------------------------------------------------
 
-      paral(1) = 2                                      ! box partitioning
-      paral(2) = Ni0glo * mjg0(nn_hls) + mig0(nn_hls)   ! NEMO lower left corner global offset, without halos
-      paral(3) = Ni_0                                   ! local extent in i, excluding halos
-      paral(4) = Nj_0                                   ! local extent in j, excluding halos
-      paral(5) = Ni0glo                                 ! global extent in x, excluding halos
+      paral(1) = 2                                        ! box partitioning
+      paral(2) = Ni0glo * mjg(nn_hls,0) + mig(nn_hls,0)   ! NEMO lower left corner global offset, without halos
+      paral(3) = Ni_0                                     ! local extent in i, excluding halos
+      paral(4) = Nj_0                                     ! local extent in j, excluding halos
+      paral(5) = Ni0glo                                   ! global extent in x, excluding halos
 
       IF( sn_cfctl%l_oasout ) THEN
          WRITE(numout,*) ' multiexchg: paral (1:5)', paral
diff --git a/src/OCE/SBC/sbccpl.F90 b/src/OCE/SBC/sbccpl.F90
index dc41fe2a8..64d77b504 100644
--- a/src/OCE/SBC/sbccpl.F90
+++ b/src/OCE/SBC/sbccpl.F90
@@ -1052,7 +1052,7 @@ CONTAINS
          xcplmask(:,:,:) = 0.
          CALL iom_open( 'cplmask', inum )
          CALL iom_get( inum, jpdom_unknown, 'cplmask', xcplmask(1:jpi,1:jpj,1:nn_cplmodel),   &
-            &          kstart = (/ mig(1),mjg(1),1 /), kcount = (/ jpi,jpj,nn_cplmodel /) )
+            &          kstart = (/ mig(1,nn_hls),mjg(1,nn_hls),1 /), kcount = (/ jpi,jpj,nn_cplmodel /) )
          CALL iom_close( inum )
       ELSE
          xcplmask(:,:,:) = 1.
diff --git a/src/OCE/USR/usrdef_fmask.F90 b/src/OCE/USR/usrdef_fmask.F90
index bc97a2edf..d1e0d4825 100644
--- a/src/OCE/USR/usrdef_fmask.F90
+++ b/src/OCE/USR/usrdef_fmask.F90
@@ -69,25 +69,25 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ij0 = 101 + nn_hls       ;   ij1 = 101 + nn_hls           ! Gibraltar strait  : partial slip (pfmsk=0.5)
             ii0 = 139 + nn_hls - 1   ;   ii1 = 140 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             ij0 = 102 + nn_hls       ;   ij1 = 102 + nn_hls
             ii0 = 139 + nn_hls - 1   ;   ii1 = 140 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             !
             IF(lwp) WRITE(numout,*) '      Bab el Mandeb '
             ij0 =  87 + nn_hls       ;   ij1 = 88  + nn_hls          ! Bab el Mandeb : partial slip (pfmsk=1)
             ii0 = 160 + nn_hls - 1   ;   ii1 = 160 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             ij0 =  88 + nn_hls       ;   ij1 =  88 + nn_hls
             ii0 = 159 + nn_hls - 1   ;   ii1 = 159 + nn_hls - 1
-            pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             !
             ! We keep this as an example but it is instable in this case 
             !IF(lwp) WRITE(numout,*) '      Danish straits '
             !         ij0 = 115   ;   ij1 = 115 ! Danish straits  : strong slip (pfmsk > 2)
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !         ij0 = 116   ;   ij1 = 116
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !
          CASE( 1 )                           ! R1 case
             IF(lwp) WRITE(numout,*)
@@ -104,42 +104,42 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ii0 = 282 + nn_hls - 1       ;   ii1 = 283 + nn_hls - 1        ! Gibraltar Strait 
             ij0 = 241 + nn_hls - isrow   ;   ij1 = 241 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Bhosporus '
             ii0 = 314 + nn_hls - 1       ;   ii1 = 315 + nn_hls - 1        ! Bhosporus Strait 
             ij0 = 248 + nn_hls - isrow   ;   ij1 = 248 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Makassar (Top) '
             ii0 =  48 + nn_hls - 1       ;   ii1 =  48 + nn_hls - 1        ! Makassar Strait (Top) 
             ij0 = 189 + nn_hls - isrow   ;   ij1 = 190 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      Lombok '
             ii0 =  44 + nn_hls - 1       ;   ii1 =  44 + nn_hls - 1        ! Lombok Strait 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Ombai '
             ii0 =  53 + nn_hls - 1       ;   ii1 =  53 + nn_hls - 1        ! Ombai Strait 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Timor Passage '
             ii0 =  56 + nn_hls - 1       ;   ii1 =  56 + nn_hls - 1        ! Timor Passage 
             ij0 = 164 + nn_hls - isrow   ;   ij1 = 165 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      West Halmahera '
             ii0 =  58 + nn_hls - 1       ;   ii1 =  58 + nn_hls - 1        ! West Halmahera Strait 
             ij0 = 181 + nn_hls - isrow   ;   ij1 = 182 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      East Halmahera '
             ii0 =  55 + nn_hls - 1       ;   ii1 =  55 + nn_hls - 1        ! East Halmahera Strait 
             ij0 = 181 + nn_hls - isrow   ;   ij1 = 182 + nn_hls - isrow
-            pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
          CASE DEFAULT
             IF(lwp) WRITE(numout,*)
diff --git a/src/OCE/USR/usrdef_hgr.F90 b/src/OCE/USR/usrdef_hgr.F90
index 2f617b552..cbcb3ff8e 100644
--- a/src/OCE/USR/usrdef_hgr.F90
+++ b/src/OCE/USR/usrdef_hgr.F90
@@ -115,8 +115,8 @@ CONTAINS
       ENDIF
       !   
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zim1 = REAL( mig0(ji), wp ) - 1.   ;   zim05 = REAL( mig0(ji), wp ) - 1.5
-         zjm1 = REAL( mjg0(jj), wp ) - 1.   ;   zjm05 = REAL( mjg0(jj), wp ) - 1.5
+         zim1 = REAL( mig(ji,0), wp ) - 1.   ;   zim05 = REAL( mig(ji,0), wp ) - 1.5
+         zjm1 = REAL( mjg(jj,0), wp ) - 1.   ;   zjm05 = REAL( mjg(jj,0), wp ) - 1.5
          !   
          !glamt(i,j) longitude at T-point
          !gphit(i,j) latitude at T-point  
diff --git a/src/OCE/lib_fortran.F90 b/src/OCE/lib_fortran.F90
index b621373e6..2a0e1eeda 100644
--- a/src/OCE/lib_fortran.F90
+++ b/src/OCE/lib_fortran.F90
@@ -191,11 +191,11 @@ CONTAINS
       ! work over the whole domain (guarantees all internal cells are set when nn_hls=2)
       !
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         IF( MOD(mig(ji), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
-           & MOD(mjg(jj), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
-            ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
-            jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
-            IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
+         IF( MOD(mig(ji,nn_hls), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
+           & MOD(mjg(jj,nn_hls), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
+            ji2 = MIN(mig(ji,nn_hls)+2, jpiglo) - nimpp + 1                  ! right position of the box
+            jj2 = MIN(mjg(jj,nn_hls)+2, jpjglo) - njmpp + 1                  ! upper position of the box
+            IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                           ! the box is fully included in the local mpi domain
                p2d(ji:ji2,jj:jj2) = SUM(p2d(ji:ji2,jj:jj2))
             ENDIF
          ENDIF
@@ -203,23 +203,23 @@ CONTAINS
       CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1.0_wp )
       ! no need for 2nd exchange when nn_hls > 1
       IF( nn_hls == 1 ) THEN
-         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN   ! 1st column was changed during the previous call to lbc_lnk
-            IF( MOD(mig(    1), 3) == 1 )   &   ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
-               p2d(    1,:) = p2d(    2,:)      ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
-            IF( MOD(mig(    1), 3) == 2 )   &   ! 1st box start at i=3 -> column 1 and 2 correctly computed on west neighbourh
-               p2d(    2,:) = p2d(    1,:)      !  previous lbc_lnk fix column 1 -> copy it to column 2 
+         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN          ! 1st column was changed during the previous call to lbc_lnk
+            IF( MOD(mig(    1,nn_hls), 3) == 1 )   &   ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
+               p2d(    1,:) = p2d(    2,:)             ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
+            IF( MOD(mig(    1,nn_hls), 3) == 2 )   &   ! 1st box start at i=3 -> column 1 and 2 correctly computed on w-neighbourh
+               p2d(    2,:) = p2d(    1,:)             !  previous lbc_lnk fix column 1 -> copy it to column 2 
          ENDIF
          IF( mpiRnei(nn_hls,jpea) > -1 ) THEN
-            IF( MOD(mig(jpi-2), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:)
-            IF( MOD(mig(jpi-2), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 1 )   p2d(  jpi,:) = p2d(jpi-1,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 0 )   p2d(jpi-1,:) = p2d(  jpi,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpso) > -1 ) THEN
-            IF( MOD(mjg(    1), 3) == 1 )   p2d(:,    1) = p2d(:,    2)
-            IF( MOD(mjg(    1), 3) == 2 )   p2d(:,    2) = p2d(:,    1)
+            IF( MOD(mjg(    1,nn_hls), 3) == 1 )   p2d(:,    1) = p2d(:,    2)
+            IF( MOD(mjg(    1,nn_hls), 3) == 2 )   p2d(:,    2) = p2d(:,    1)
          ENDIF
          IF( mpiRnei(nn_hls,jpno) > -1 ) THEN
-            IF( MOD(mjg(jpj-2), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1)
-            IF( MOD(mjg(jpj-2), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 1 )   p2d(:,  jpj) = p2d(:,jpj-1)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 0 )   p2d(:,jpj-1) = p2d(:,  jpj)
          ENDIF
          CALL lbc_lnk( 'lib_fortran', p2d, 'T', 1.0_wp )
       ENDIF
@@ -247,11 +247,11 @@ CONTAINS
          ! work over the whole domain (guarantees all internal cells are set when nn_hls=2)
          !
          DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-            IF( MOD(mig(ji), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
-              & MOD(mjg(jj), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
-               ji2 = MIN(mig(ji)+2, jpiglo) - nimpp + 1                  ! right position of the box
-               jj2 = MIN(mjg(jj)+2, jpjglo) - njmpp + 1                  ! upper position of the box
-               IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                    ! the box is fully included in the local mpi domain
+            IF( MOD(mig(ji,nn_hls), 3) == MOD(nn_hls, 3) .AND.   &              ! 1st bottom left corner always at (Nis0-1, Njs0-1)
+              & MOD(mjg(jj,nn_hls), 3) == MOD(nn_hls, 3)         ) THEN         ! bottom left corner of a 3x3 box
+               ji2 = MIN(mig(ji,nn_hls)+2, jpiglo) - nimpp + 1                  ! right position of the box
+               jj2 = MIN(mjg(jj,nn_hls)+2, jpjglo) - njmpp + 1                  ! upper position of the box
+               IF( ji2 <= jpi .AND. jj2 <= jpj ) THEN                           ! the box is fully included in the local mpi domain
                   p3d(ji:ji2,jj:jj2,jn) = SUM(p3d(ji:ji2,jj:jj2,jn))
                ENDIF
             ENDIF
@@ -260,23 +260,23 @@ CONTAINS
       CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1.0_wp )
       ! no need for 2nd exchange when nn_hls > 1
       IF( nn_hls == 1 ) THEN
-         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN    ! 1st column was changed during the previous call to lbc_lnk
-            IF( MOD(mig(    1), 3) == 1 )   &    ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
-               p3d(    1,:,:) = p3d(    2,:,:)   ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
-            IF( MOD(mig(    1), 3) == 2 )   &    ! 1st box start at i=3 -> column 1 and 2 correctly computed on west neighbourh
-               p3d(    2,:,:) = p3d(    1,:,:)   !  previous lbc_lnk fix column 1 -> copy it to column 2 
+         IF( mpiRnei(nn_hls,jpwe) > -1 ) THEN           ! 1st column was changed during the previous call to lbc_lnk
+            IF( MOD(mig(    1,nn_hls), 3) == 1 )   &    ! 1st box start at i=1 -> column 1 to 3 correctly computed locally
+               p3d(    1,:,:) = p3d(    2,:,:)          ! previous lbc_lnk corrupted column 1 -> put it back using column 2 
+            IF( MOD(mig(    1,nn_hls), 3) == 2 )   &    ! 1st box start at i=3 -> column 1 and 2 correctly computed on w-neighbourh
+               p3d(    2,:,:) = p3d(    1,:,:)          !  previous lbc_lnk fix column 1 -> copy it to column 2 
          ENDIF
          IF( mpiRnei(nn_hls,jpea) > -1 ) THEN
-            IF( MOD(mig(jpi-2), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:)
-            IF( MOD(mig(jpi-2), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 1 )   p3d(  jpi,:,:) = p3d(jpi-1,:,:)
+            IF( MOD(mig(jpi-2,nn_hls), 3) == 0 )   p3d(jpi-1,:,:) = p3d(  jpi,:,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpso) > -1 ) THEN
-            IF( MOD(mjg(    1), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:)
-            IF( MOD(mjg(    1), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:)
+            IF( MOD(mjg(    1,nn_hls), 3) == 1 )   p3d(:,    1,:) = p3d(:,    2,:)
+            IF( MOD(mjg(    1,nn_hls), 3) == 2 )   p3d(:,    2,:) = p3d(:,    1,:)
          ENDIF
          IF( mpiRnei(nn_hls,jpno) > -1 ) THEN
-            IF( MOD(mjg(jpj-2), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:)
-            IF( MOD(mjg(jpj-2), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 1 )   p3d(:,  jpj,:) = p3d(:,jpj-1,:)
+            IF( MOD(mjg(jpj-2,nn_hls), 3) == 0 )   p3d(:,jpj-1,:) = p3d(:,  jpj,:)
          ENDIF
          CALL lbc_lnk( 'lib_fortran', p3d, 'T', 1.0_wp )
       ENDIF
diff --git a/src/OCE/stpctl.F90 b/src/OCE/stpctl.F90
index 96358bf94..b8cc8aaa1 100644
--- a/src/OCE/stpctl.F90
+++ b/src/OCE/stpctl.F90
@@ -231,7 +231,7 @@ CONTAINS
             iloc(1:3,3) = MINLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             iloc(1:3,4) = MAXLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/src/SAS/stpctl.F90 b/src/SAS/stpctl.F90
index 6de0e1dbf..e5c9a573b 100644
--- a/src/SAS/stpctl.F90
+++ b/src/SAS/stpctl.F90
@@ -191,7 +191,7 @@ CONTAINS
             iloc(1:2,2) = MAXLOC( ABS( u_ice(:,:) )    , mask = llmsk )
             iloc(1:2,3) = MINLOC(       tm_i(:,:) - rt0, mask = llmsk )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/src/SWE/stpctl.F90 b/src/SWE/stpctl.F90
index 74def0eef..24e3bef8d 100644
--- a/src/SWE/stpctl.F90
+++ b/src/SWE/stpctl.F90
@@ -185,7 +185,7 @@ CONTAINS
             llmsk(Nis0:Nie0,Njs0:Nje0,:) = umask(Nis0:Nie0,Njs0:Nje0,:) == 1._wp        ! define only the inner domain
             iloc(1:3,2) = MAXLOC( ABS(  uu(:,:,:,       Kmm)), mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/src/TOP/TRP/trcdmp.F90 b/src/TOP/TRP/trcdmp.F90
index 8b2be2d95..2b11fd629 100644
--- a/src/TOP/TRP/trcdmp.F90
+++ b/src/TOP/TRP/trcdmp.F90
@@ -329,11 +329,11 @@ CONTAINS
          ! convert the position in local domain indices
          ! --------------------------------------------
          DO jc = 1, npncts
-            nctsi1(jc)   = mi0( nctsi1(jc) )
-            nctsj1(jc)   = mj0( nctsj1(jc) )
+            nctsi1(jc)   = mi0( nctsi1(jc), nn_hls )
+            nctsj1(jc)   = mj0( nctsj1(jc), nn_hls )
             !
-            nctsi2(jc)   = mi1( nctsi2(jc) )
-            nctsj2(jc)   = mj1( nctsj2(jc) )
+            nctsi2(jc)   = mi1( nctsi2(jc), nn_hls )
+            nctsj2(jc)   = mj1( nctsj2(jc), nn_hls )
          END DO
          !
       ENDIF
diff --git a/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90 b/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
index 12f778f5c..ac53839aa 100644
--- a/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/usrdef_hgr.F90
@@ -80,14 +80,14 @@ CONTAINS
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
 !      DO_2D( 1, 1, 1, 1 )
          !                       ! longitude
-         plamt(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
-         plamu(ji,jj) = zfact * (    0.5 + REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
+         plamu(ji,jj) = zfact * (    0.5 + REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude
-         pphit(ji,jj) = zfact2 * (          REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact2 * (          REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact2 * (    0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact2 * (    0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90 b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
index 5c7fac838..ed83f79c1 100644
--- a/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
+++ b/tests/ADIAB_WAVE/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1   ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -105,10 +104,10 @@ CONTAINS
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
+      DO ji = mi0(1,nn_hls), mi1(1,nn_hls)              ! first row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
+       DO ji = mi0(jpiglo,nn_hls), mi1(jpiglo,nn_hls)   ! last  row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
       zhu(:,1) = zhu(:,2)
diff --git a/tests/BENCH/MY_SRC/usrdef_hgr.F90 b/tests/BENCH/MY_SRC/usrdef_hgr.F90
index bc6b282ce..ec715f295 100644
--- a/tests/BENCH/MY_SRC/usrdef_hgr.F90
+++ b/tests/BENCH/MY_SRC/usrdef_hgr.F90
@@ -75,15 +75,15 @@ CONTAINS
       ! define unique value on each point of the inner global domain. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )   !  +/- 0.5
-         z2d(ji,jj) = 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp )
+         z2d(ji,jj) = 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp )
       END_2D
       !
       ! Position coordinates (in grid points)
       !                          ==========
       DO_2D( 0, 0, 0, 0 )
          
-         zti = REAL( mig0(ji), wp ) - 0.5_wp   ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp   ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp   ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp   ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) =   zti            * (1. + 1.0e-5 * z2d(ji,jj) )
          plamu(ji,jj) = ( zti + 0.5_wp ) * (1. + 2.0e-5 * z2d(ji,jj) )
diff --git a/tests/BENCH/MY_SRC/usrdef_istate.F90 b/tests/BENCH/MY_SRC/usrdef_istate.F90
index 69da90f1b..bb35d7849 100644
--- a/tests/BENCH/MY_SRC/usrdef_istate.F90
+++ b/tests/BENCH/MY_SRC/usrdef_istate.F90
@@ -65,7 +65,7 @@ CONTAINS
       ! define unique value on each point of the inner global domain. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )   !  +/- 0.05
-         z2d(ji,jj) = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         z2d(ji,jj) = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
       END_2D
       !
       DO_3D( 0, 0, 0, 0, 1, jpkm1 )
@@ -108,7 +108,7 @@ CONTAINS
       IF(lwp) WRITE(numout,*) 'usr_def_istate_ssh : BENCH configuration, analytical definition of initial ssh'
       !
       DO_2D( 0, 0, 0, 0 )                              ! sea level:  +/- 0.05 m
-         pssh(ji,jj) = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         pssh(ji,jj) = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
       END_2D
       !
       CALL lbc_lnk('usrdef_istate', pssh, 'T',  1. )   ! apply boundary conditions
diff --git a/tests/BENCH/MY_SRC/usrdef_sbc.F90 b/tests/BENCH/MY_SRC/usrdef_sbc.F90
index 4bd129228..ee91c35e0 100644
--- a/tests/BENCH/MY_SRC/usrdef_sbc.F90
+++ b/tests/BENCH/MY_SRC/usrdef_sbc.F90
@@ -104,7 +104,7 @@ CONTAINS
       ! define unique value on each point. z2d ranging from 0.05 to -0.05
       !
       DO_2D( 0, 0, 0, 0 )
-         zztmp = 0.1 * ( 0.5 - REAL( mig0(ji) + (mjg0(jj)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
+         zztmp = 0.1 * ( 0.5 - REAL( mig(ji,0) + (mjg(jj,0)-1) * Ni0glo, wp ) / REAL( Ni0glo * Nj0glo, wp ) )
          utau_ice(ji,jj) = 0.1_wp + zztmp
          vtau_ice(ji,jj) = 0.1_wp + zztmp
       END_2D
diff --git a/tests/BENCH/MY_SRC/usrdef_zgr.F90 b/tests/BENCH/MY_SRC/usrdef_zgr.F90
index b54748001..fe5d7de80 100644
--- a/tests/BENCH/MY_SRC/usrdef_zgr.F90
+++ b/tests/BENCH/MY_SRC/usrdef_zgr.F90
@@ -197,14 +197,14 @@ CONTAINS
       !
       
 !!$      IF( c_NFtype == 'T' ) THEN   ! add a small island in the upper corners to avoid model instabilities...
-!!$         z2d(mi0(       nn_hls):mi1(                  nn_hls+2 ),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
-!!$         z2d(mi0(jpiglo-nn_hls):mi1(MIN(jpiglo,jpiglo-nn_hls+2)),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
-!!$         z2d(mi0(jpiglo/2     ):mi1(           jpiglo/2     +2 ),mj0(jpjglo-nn_hls-1):mj1(jpjglo-nn_hls+1)) = 0._wp
+!!$         z2d(mi0(       nn_hls,nn_hls):mi1(                  nn_hls+2 ,nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
+!!$         z2d(mi0(jpiglo-nn_hls,nn_hls):mi1(MIN(jpiglo,jpiglo-nn_hls+2),nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
+!!$         z2d(mi0(jpiglo/2     ,nn_hls):mi1(           jpiglo/2     +2 ,nn_hls),mj0(jpjglo-nn_hls-1,nn_hls):mj1(jpjglo-nn_hls+1,nn_hls)) = 0._wp
 !!$      ENDIF
 !!$      !
       IF( c_NFtype == 'F' ) THEN   ! Must mask the 2 pivot-points 
-         z2d(mi0(nn_hls+1):mi1(nn_hls+1),mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)) = 0._wp
-         z2d(mi0(jpiglo/2):mi1(jpiglo/2),mj0(jpjglo-nn_hls):mj1(jpjglo-nn_hls)) = 0._wp
+         z2d(mi0(nn_hls+1,nn_hls):mi1(nn_hls+1,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
+         z2d(mi0(jpiglo/2,nn_hls):mi1(jpiglo/2,nn_hls),mj0(jpjglo-nn_hls,nn_hls):mj1(jpjglo-nn_hls,nn_hls)) = 0._wp
       ENDIF
       !
       CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1._wp )           ! set surrounding land to zero (closed boundaries)
diff --git a/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90 b/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
index 538d753ce..c1d0b9765 100644
--- a/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
+++ b/tests/C1D_ASICS/MY_SRC/usrdef_nam.F90
@@ -13,7 +13,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp             ! ocean space and time domain
    USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/CANAL/MY_SRC/usrdef_hgr.F90 b/tests/CANAL/MY_SRC/usrdef_hgr.F90
index 8cb9d5bdd..c7b469cf8 100644
--- a/tests/CANAL/MY_SRC/usrdef_hgr.F90
+++ b/tests/CANAL/MY_SRC/usrdef_hgr.F90
@@ -88,8 +88,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )         
-         zti = REAL( mig0(ji)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
+         zti = REAL( mig(ji,0)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
          
          plamt(ji,jj) = rn_dx *   zti
          plamu(ji,jj) = rn_dx * ( zti + 0.5_wp ) 
diff --git a/tests/DIA_GPU/MY_SRC/stpctl.F90 b/tests/DIA_GPU/MY_SRC/stpctl.F90
index acf186402..cf7cd09c9 100644
--- a/tests/DIA_GPU/MY_SRC/stpctl.F90
+++ b/tests/DIA_GPU/MY_SRC/stpctl.F90
@@ -232,7 +232,7 @@ CONTAINS
             iloc(1:3,3) = MINLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             iloc(1:3,4) = MAXLOC(       ts(:,:,:,jp_sal,Kmm) , mask = llmsk(:,:,:) )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/tests/DOME/MY_SRC/usrdef_hgr.F90 b/tests/DOME/MY_SRC/usrdef_hgr.F90
index e135d867a..3717ef1cc 100644
--- a/tests/DOME/MY_SRC/usrdef_hgr.F90
+++ b/tests/DOME/MY_SRC/usrdef_hgr.F90
@@ -93,8 +93,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji) - 1, wp )   ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj) - 1, wp )   ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0) - 1, wp )   ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0) - 1, wp )   ! start at j=0 in the global grid without halos
          
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti 
diff --git a/tests/DOME/MY_SRC/usrdef_istate.F90 b/tests/DOME/MY_SRC/usrdef_istate.F90
index e41bad22d..782e164e3 100644
--- a/tests/DOME/MY_SRC/usrdef_istate.F90
+++ b/tests/DOME/MY_SRC/usrdef_istate.F90
@@ -105,10 +105,10 @@ CONTAINS
 !            ztd = 15._wp*gdepw_0(ji,jj,jk+1)-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk+1)**2
 !            ztu = 15._wp*gdepw_0(ji,jj,jk  )-0.5*rho0*zn2/(rn_a0*grav)*gdepw_0(ji,jj,jk  )**2
 !            pts(ji,jj,jk,jp_tem) = (ztd - ztu)/e3t_0(ji,jj,jk) * ptmask(ji,jj,jk)
-            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-2 ) )  THEN
+            IF (Agrif_root().AND.(  mjg(jj,0) == Nj0glo-2 ) )  THEN
                pv(ji,jj,jk) = -sqrt(zdb*zh0)*exp(-zxw/zro)*(1._wp-zf) * ptmask(ji,jj,jk)
             ENDIF
-            IF (Agrif_root().AND.(  mjg0(jj) == Nj0glo-1 ) )  THEN
+            IF (Agrif_root().AND.(  mjg(jj,0) == Nj0glo-1 ) )  THEN
                pts(ji,jj,jk,jp_tem) = MIN(pts(ji,jj,jk,jp_tem), 15._wp - zdb*rho0/grav/rn_a0*(1._wp-zf)) * ptmask(ji,jj,jk) 
                pts(ji,jj,jk,jp_sal) = 1._wp * ptmask(ji,jj,jk) 
             ENDIF
diff --git a/tests/DOME/MY_SRC/usrdef_zgr.F90 b/tests/DOME/MY_SRC/usrdef_zgr.F90
index 797006a77..0fb7ecd0c 100644
--- a/tests/DOME/MY_SRC/usrdef_zgr.F90
+++ b/tests/DOME/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1          ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt, gphit      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
diff --git a/tests/ICB/MY_SRC/usrdef_nam.F90 b/tests/ICB/MY_SRC/usrdef_nam.F90
index e850ce892..a9e540109 100644
--- a/tests/ICB/MY_SRC/usrdef_nam.F90
+++ b/tests/ICB/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp , njmpp            ! i- & j-indices of the local domain
    USE dom_oce  , ONLY: ln_zco, ln_zps, ln_sco   ! flag of type of coordinate
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90 b/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
index 507212b66..92abf49f0 100644
--- a/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_ADV1D/MY_SRC/usrdef_hgr.F90
@@ -78,8 +78,8 @@ CONTAINS
       zphi0 = -REAL(Nj0glo, wp) * 0.5 * 1.e-3 * rn_dy
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) = zlam0 + rn_dx * 1.e-3 *   zti
          plamu(ji,jj) = zlam0 + rn_dx * 1.e-3 * ( zti + 0.5_wp )
diff --git a/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90 b/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
index b2b645b8b..0c554f80d 100644
--- a/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_ADV2D/MY_SRC/usrdef_hgr.F90
@@ -90,8 +90,8 @@ CONTAINS
 #endif         
 
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
-         ztj = REAL( mjg0(jj), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
+         zti = REAL( mig(ji,0), wp ) - 0.5_wp  ! start at i=0.5 in the global grid without halos
+         ztj = REAL( mjg(jj,0), wp ) - 0.5_wp  ! start at j=0.5 in the global grid without halos
          
          plamt(ji,jj) = zlam0 + rn_dx * 1.e-3 *   zti
          plamu(ji,jj) = zlam0 + rn_dx * 1.e-3 * ( zti + 0.5_wp )
@@ -110,19 +110,19 @@ CONTAINS
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO jj = 1, jpj
 !!            DO ji = 1, jpi
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!            END DO
 !!         END DO
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO jj = 1, jpj
 !!               DO ji = 1, jpi
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!               END DO
 !!            END DO
diff --git a/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90 b/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
index 9ac18267b..c087ceeb0 100644
--- a/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_AGRIF/MY_SRC/usrdef_hgr.F90
@@ -96,8 +96,8 @@ CONTAINS
       ENDIF
 #endif
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji)-1, wp )  ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-1, wp )  ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0)-1, wp )  ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-1, wp )  ! start at j=0 in the global grid without halos
 
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti
@@ -116,19 +116,19 @@ CONTAINS
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO jj = 1, jpj
 !!            DO ji = 1, jpi
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!            END DO
 !!         END DO
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO jj = 1, jpj
 !!               DO ji = 1, jpi
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!               END DO
 !!            END DO
diff --git a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90 b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
index 2c5e43487..6db0b1114 100644
--- a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
+++ b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_eap.F90
@@ -573,7 +573,7 @@ CONTAINS
                      &            )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
 
@@ -630,7 +630,7 @@ CONTAINS
                      &            )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
 
@@ -689,7 +689,7 @@ CONTAINS
                      &            )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -745,7 +745,7 @@ CONTAINS
                      &            )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -1048,7 +1048,7 @@ CONTAINS
          zresm = 0._wp
          DO_2D( 0, 0, 0, 0 )
             ! cut of the boundary of the box (forced velocities)
-            IF (mjg0(jj)>30 .AND. mjg0(jj)<=970 .AND. mig0(ji)>30 .AND. mig0(ji)<=970) THEN
+            IF (mjg(jj,0)>30 .AND. mjg(jj,0)<=970 .AND. mig(ji,0)>30 .AND. mig(ji,0)<=970) THEN
                zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
                   &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
             ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90 b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
index e2df97c76..8f691d6ca 100644
--- a/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
+++ b/tests/ICE_RHEO/MY_SRC/icedyn_rhg_evp.F90
@@ -525,7 +525,7 @@ CONTAINS
                      &            )  * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -581,7 +581,7 @@ CONTAINS
                      &           )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -639,7 +639,7 @@ CONTAINS
                      &           )   * zmsk00x(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   u_ice(ji,jj) = zinvw*(ztaux_ai(ji,jj) + zCorU(ji,jj) + zspgU(ji,jj) + ztaux_oi(ji,jj))
                END IF
             END_2D
@@ -695,7 +695,7 @@ CONTAINS
                      &           )   * zmsk00y(ji,jj)
                ENDIF
 !extra code for test case boundary conditions
-               IF (mjg(jj)<25 .or. mjg(jj)>975 .or. mig(ji)<25 .or. mig(ji)>975) THEN
+               IF (mjg(jj,nn_hls)<25 .or. mjg(jj,nn_hls)>975 .or. mig(ji,nn_hls)<25 .or. mig(ji,nn_hls)>975) THEN
                   v_ice(ji,jj) = zinvw*(ztauy_ai(ji,jj) + zCorV(ji,jj) + zspgV(ji,jj) + ztauy_oi(ji,jj))
                END IF
             END_2D
@@ -978,7 +978,7 @@ CONTAINS
          zresm = 0._wp
          DO_2D( 0, 0, 0, 0 )
             ! cut of the boundary of the box (forced velocities)
-            IF (mjg0(jj)>30 .AND. mjg0(jj)<=970 .AND. mig0(ji)>30 .AND. mig0(ji)<=970) THEN
+            IF (mjg(jj,0)>30 .AND. mjg(jj,0)<=970 .AND. mig(ji,0)>30 .AND. mig(ji,0)<=970) THEN
                zresm = MAX( zresm, MAX( ABS( pu(ji,jj) - pub(ji,jj) ) * umask(ji,jj,1), &
                   &                     ABS( pv(ji,jj) - pvb(ji,jj) ) * vmask(ji,jj,1) ) * pmsk15(ji,jj) )
             ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
index e585820e8..679c21533 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_hgr.F90
@@ -98,17 +98,17 @@ CONTAINS
 !! ==> EITHER 1) variable scale factors
 !! clem: This can be used with a 1proc simulation but I think it breaks repro when >1procs are used      
 !!         DO_2D( 1, 1, 1, 1 )
-!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
-!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
-!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
-!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
+!!               !!pe1t(ji,jj) = rn_dx * EXP( -0.8/REAL(jpiglo**2) * (mi0(ji,nn_hls)-REAL(jpiglo+1)*0.5)**2 )  ! gaussian shape
+!!               !!pe2t(ji,jj) = rn_dy * EXP( -0.8/REAL(jpjglo**2) * (mj0(jj,nn_hls)-REAL(jpjglo+1)*0.5)**2 )  ! gaussian shape
+!!               pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5) ) ! linear shape
+!!               pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5) ) ! linear shape
 !!         END_2D
 !!#if defined key_agrif 
 !!         IF( .NOT. Agrif_Root() ) THEN ! only works if the zoom is positioned at the center of the parent grid
 !!            DO_2D( 1, 1, 1, 1 )
-!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
+!!                  pe1t(ji,jj) = rn_dx * ( 1. -0.1 * ABS(REAL(mi0(ji,nn_hls))-REAL(jpiglo+1)*0.5) / (1.-REAL(jpiglo+1)*0.5)  &
 !!                     &                            * REAL(jpiglo) / REAL(Agrif_Parent(jpiglo) * Agrif_Rhox()) )       ! factor to match parent grid
-!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
+!!                  pe2t(ji,jj) = rn_dy * ( 1. -0.1 * ABS(REAL(mj0(jj,nn_hls))-REAL(jpjglo+1)*0.5) / (1.-REAL(jpjglo+1)*0.5)  &
 !!                     &                            * REAL(jpjglo) / REAL(Agrif_Parent(jpjglo) * Agrif_Rhoy()) )       ! factor to match parent grid
 !!            END_2D
 !!         ENDIF
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
index 0f92fbee5..df8898d92 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_nam.F90
@@ -13,7 +13,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp , njmpp , Agrif_Root           ! i- & j-indices of the local domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90 b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
index 2a22cfc80..0d9d07e01 100644
--- a/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
+++ b/tests/ICE_RHEO/MY_SRC/usrdef_sbc.F90
@@ -71,8 +71,8 @@ CONTAINS
 
          !ij0 = 1   ;   ij1 = 25                       ! set boundary condition
          !ii0 = 975   ;   ii1 = 1000
-         !DO jj = mj0(ij0), mj1(ij1)
-         !   DO ji = mi0(ii0), mi1(ii1)
+         !DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
+         !   DO ji = mi0(ii0,nn_hls), mi1(ii1,nn_hls)
          !      utau(ji,jj) = -utau_ice(ji,jj) 
          !      vtau(ji,jj) = -vtau_ice(ji,jj)
          !   END DO
@@ -122,8 +122,10 @@ CONTAINS
 
       DO_2D( 0, 0, 0, 0 )
          ! wind spins up over 6 hours, factor 1000 to balance the units
-         windu(ji,jj) = Umax/sqrt(d*1000)*(d-2*mig(ji)*res)/((d-2*mig(ji)*res)**2+(d-2*mjg(jj)*res)**2*Rwind**2)**(1/4)*min(kt*30./21600,1.)
-         windv(ji,jj) = Umax/sqrt(d*1000)*(d-2*mjg(jj)*res)/((d-2*mig(ji)*res)**2+(d-2*mjg(jj)*res)**2*Rwind**2)**(1/4)*Rwind*min(kt*30./21600,1.)
+         windu(ji,jj) = Umax/SQRT(d*1000)*(d-2*mig(ji,nn_hls)*res) /   &
+            &           ((d-2*mig(ji,nn_hls)*res)**2+(d-2*mjg(jj,nn_hls)*res)**2*Rwind**2)**(1/4)*MIN(kt*30./21600,1.)
+         windv(ji,jj) = Umax/SQRT(d*1000)*(d-2*mjg(jj,nn_hls)*res) /   &
+            &           ((d-2*mig(ji,nn_hls)*res)**2+(d-2*mjg(jj,nn_hls)*res)**2*Rwind**2)**(1/4)*Rwind*MIN(kt*30./21600,1.)
       END_2D
 
       ! ------------------------------------------------------------ !
diff --git a/tests/ISOMIP/MY_SRC/usrdef_hgr.F90 b/tests/ISOMIP/MY_SRC/usrdef_hgr.F90
index 95bdd75af..bda6366cb 100644
--- a/tests/ISOMIP/MY_SRC/usrdef_hgr.F90
+++ b/tests/ISOMIP/MY_SRC/usrdef_hgr.F90
@@ -78,14 +78,14 @@ CONTAINS
       !                       !==  grid point position  ==!   (in degrees)
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = rn_e1deg * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = rn_e1deg * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = rn_e1deg * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = rn_e1deg * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat=-80°)
-         pphit(ji,jj) = rn_e2deg * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  ) - 80._wp
+         pphit(ji,jj) = rn_e2deg * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  ) - 80._wp
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = rn_e2deg * (          REAL( mjg0(jj)-1 , wp )  ) - 80._wp
+         pphiv(ji,jj) = rn_e2deg * (          REAL( mjg(jj,0)-1 , wp )  ) - 80._wp
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/ISOMIP/MY_SRC/usrdef_zgr.F90 b/tests/ISOMIP/MY_SRC/usrdef_zgr.F90
index 225e1ca0f..60e89b6fc 100644
--- a/tests/ISOMIP/MY_SRC/usrdef_zgr.F90
+++ b/tests/ISOMIP/MY_SRC/usrdef_zgr.F90
@@ -15,8 +15,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mj0   , mj1    ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt , gphit  ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -87,7 +86,7 @@ CONTAINS
       zht  (:,:) = rbathy 
       zhisf(:,:) = 200._wp
       ij0 = 1   ;   ij1 = 40+nn_hls
-      DO jj = mj0(ij0), mj1(ij1)
+      DO jj = mj0(ij0,nn_hls), mj1(ij1,nn_hls)
          zhisf(:,jj)=700.0_wp-(gphit(:,jj)+80.0_wp)*125.0_wp
       END DO
       !
diff --git a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90 b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
index 62a161477..b4cac5c17 100644
--- a/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
+++ b/tests/LOCK_EXCHANGE/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90 b/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
index 0abf8552b..55d8d2a61 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90 b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
index b39e22ab1..d0d126ed5 100644
--- a/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
+++ b/tests/OVERFLOW/MY_SRC/usrdef_zgr.F90
@@ -14,8 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z1d   : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: mi0, mi1   ! ocean space and time domain
-   USE dom_oce ,  ONLY: glamt      ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    !
    USE in_out_manager ! I/O manager
@@ -94,10 +93,10 @@ CONTAINS
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrouding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
+      DO ji = mi0(1,nn_hls), mi1(1,nn_hls)              ! first row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
+       DO ji = mi0(jpiglo,nn_hls), mi1(jpiglo,nn_hls)   ! last  row of global domain only
          zhu(ji,2) = zht(ji,2)
       END DO
       zhu(:,1) = zhu(:,2)
diff --git a/tests/STATION_ASF/MY_SRC/icesbc.F90 b/tests/STATION_ASF/MY_SRC/icesbc.F90
index 644ad0cfb..a03ed99fd 100644
--- a/tests/STATION_ASF/MY_SRC/icesbc.F90
+++ b/tests/STATION_ASF/MY_SRC/icesbc.F90
@@ -152,13 +152,13 @@ CONTAINS
             &                sf(jp_slp)%fnow(:,:,1), sf(jp_qlw)%fnow(:,:,1), &
             &                sf(jp_prec)%fnow(:,:,1), sf(jp_snow)%fnow(:,:,1) )
          !
-         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
+         IF( ln_mixcpl        )   CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
          IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
          !                        !    compute conduction flux and surface temperature (as in Jules surface module)
          IF( ln_cndflx .AND. .NOT.ln_cndemulate ) &
             &                     CALL blk_ice_qcn    ( ln_virtual_itd, t_su, t_bo, h_s, h_i )
       CASE ( jp_purecpl )         !--- coupled formulation
-         CALL sbc_cpl_ice_flx( picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
+         CALL sbc_cpl_ice_flx( kt, picefr=at_i_b, palbi=alb_ice, psst=sst_m, pist=t_su, phs=h_s, phi=h_i )
          IF( nn_flxdist /= -1 )   CALL ice_flx_dist   ( t_su, alb_ice, qns_ice, qsr_ice, dqns_ice, evap_ice, devap_ice, nn_flxdist )
       END SELECT
 
diff --git a/tests/STATION_ASF/MY_SRC/stpctl.F90 b/tests/STATION_ASF/MY_SRC/stpctl.F90
index c51b35041..fd5a92146 100644
--- a/tests/STATION_ASF/MY_SRC/stpctl.F90
+++ b/tests/STATION_ASF/MY_SRC/stpctl.F90
@@ -178,7 +178,7 @@ CONTAINS
             iloc(1:2,2) = MAXLOC( ABS( qns(:,:) ), mask = llmsk )
             iloc(1:2,3) = MINLOC( ABS( emp(:,:) ), mask = llmsk )
             DO ji = 1, jptst   ! local domain indices ==> global domain indices, excluding halos
-               iloc(1:2,ji) = (/ mig0(iloc(1,ji)), mjg0(iloc(2,ji)) /)
+               iloc(1:2,ji) = (/ mig(iloc(1,ji),0), mjg(iloc(2,ji),0) /)
             END DO
             iareamin(:) = narea   ;   iareamax(:) = narea   ;   iareasum(:) = 1         ! this is local information
          ENDIF
diff --git a/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90 b/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
index 65d186a5b..199dce11f 100644
--- a/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
+++ b/tests/STATION_ASF/MY_SRC/usrdef_hgr.F90
@@ -13,7 +13,6 @@ MODULE usrdef_hgr
    !!----------------------------------------------------------------------
    !!   usr_def_hgr   : initialize the horizontal mesh
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE c1d      ,  ONLY: rn_lon1d, rn_lat1d ! ocean lon/lat define by namelist
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
diff --git a/tests/STATION_ASF/MY_SRC/usrdef_nam.F90 b/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
index fda9175c2..b16e92850 100644
--- a/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
+++ b/tests/STATION_ASF/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/SWG/MY_SRC/usrdef_fmask.F90 b/tests/SWG/MY_SRC/usrdef_fmask.F90
index 014180924..6ad45ee16 100644
--- a/tests/SWG/MY_SRC/usrdef_fmask.F90
+++ b/tests/SWG/MY_SRC/usrdef_fmask.F90
@@ -68,22 +68,22 @@ CONTAINS
             !
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ij0 = 101   ;   ij1 = 101           ! Gibraltar strait  : partial slip (pfmsk=0.5)
-            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             ij0 = 102   ;   ij1 = 102
-            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  0.5_wp
+            ii0 = 139   ;   ii1 = 140   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  0.5_wp
             !
             IF(lwp) WRITE(numout,*) '      Bab el Mandeb '
             ij0 =  87   ;   ij1 =  88           ! Bab el Mandeb : partial slip (pfmsk=1)
-            ii0 = 160   ;   ii1 = 160   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            ii0 = 160   ;   ii1 = 160   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             ij0 =  88   ;   ij1 =  88
-            ii0 = 159   ;   ii1 = 159   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) =  1._wp
+            ii0 = 159   ;   ii1 = 159   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) =  1._wp
             !
             ! We keep this as an example but it is instable in this case 
             !IF(lwp) WRITE(numout,*) '      Danish straits '
             !         ij0 = 115   ;   ij1 = 115 ! Danish straits  : strong slip (pfmsk > 2)
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !         ij0 = 116   ;   ij1 = 116
-            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0):mi1(ii1) , mj0(ij0):mj1(ij1) , 1:jpk ) = 4._wp
+            !         ii0 = 145   ;   ii1 = 146   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls) , mj0(ij0,nn_hls):mj1(ij1,nn_hls) , 1:jpk ) = 4._wp
             !
          CASE( 1 )                           ! R1 case
             IF(lwp) WRITE(numout,*)
@@ -99,35 +99,35 @@ CONTAINS
             IF(lwp) WRITE(numout,*) '   orca_r1: increase friction near the following straits : '
             IF(lwp) WRITE(numout,*) '      Gibraltar '
             ii0 = 282           ;   ii1 = 283        ! Gibraltar Strait 
-            ij0 = 241 - isrow   ;   ij1 = 241 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 241 - isrow   ;   ij1 = 241 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Bhosporus '
             ii0 = 314           ;   ii1 = 315        ! Bhosporus Strait 
-            ij0 = 248 - isrow   ;   ij1 = 248 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 248 - isrow   ;   ij1 = 248 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Makassar (Top) '
             ii0 =  48           ;   ii1 =  48        ! Makassar Strait (Top) 
-            ij0 = 189 - isrow   ;   ij1 = 190 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 189 - isrow   ;   ij1 = 190 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      Lombok '
             ii0 =  44           ;   ii1 =  44        ! Lombok Strait 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Ombai '
             ii0 =  53           ;   ii1 =  53        ! Ombai Strait 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      Timor Passage '
             ii0 =  56           ;   ii1 =  56        ! Timor Passage 
-            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 2._wp  
+            ij0 = 164 - isrow   ;   ij1 = 165 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 2._wp  
             !
             IF(lwp) WRITE(numout,*) '      West Halmahera '
             ii0 =  58           ;   ii1 =  58        ! West Halmahera Strait 
-            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
             IF(lwp) WRITE(numout,*) '      East Halmahera '
             ii0 =  55           ;   ii1 =  55        ! East Halmahera Strait 
-            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0):mi1(ii1),mj0(ij0):mj1(ij1),1:jpk ) = 3._wp  
+            ij0 = 181 - isrow   ;   ij1 = 182 - isrow   ;   pfmsk( mi0(ii0,nn_hls):mi1(ii1,nn_hls),mj0(ij0,nn_hls):mj1(ij1,nn_hls),1:jpk ) = 3._wp  
             !
          CASE DEFAULT
             IF(lwp) WRITE(numout,*)
diff --git a/tests/SWG/MY_SRC/usrdef_nam.F90 b/tests/SWG/MY_SRC/usrdef_nam.F90
index 37742d765..fb95a32ef 100644
--- a/tests/SWG/MY_SRC/usrdef_nam.F90
+++ b/tests/SWG/MY_SRC/usrdef_nam.F90
@@ -14,7 +14,6 @@ MODULE usrdef_nam
    !!   usr_def_nam   : read user defined namelist and set global domain size
    !!   usr_def_hgr   : initialize the horizontal mesh 
    !!----------------------------------------------------------------------
-   USE dom_oce  , ONLY: nimpp, njmpp       ! ocean space and time domain
    USE par_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    !
diff --git a/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90 b/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
index 5c9921e47..d8a5d6d84 100644
--- a/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
+++ b/tests/TSUNAMI/MY_SRC/usrdef_hgr.F90
@@ -88,8 +88,8 @@ CONTAINS
 #endif
          
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )         
-         zti = REAL( mig0(ji)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
+         zti = REAL( mig(ji,0)-ii0, wp )   ! =0 at i=ii0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-ij0, wp )   ! =0 at i=ij0 in the global grid without halos
          
          plamt(ji,jj) = rn_dx *   zti
          plamu(ji,jj) = rn_dx * ( zti + 0.5_wp ) 
diff --git a/tests/VORTEX/MY_SRC/usrdef_hgr.F90 b/tests/VORTEX/MY_SRC/usrdef_hgr.F90
index 7721821ba..c6d0003e8 100644
--- a/tests/VORTEX/MY_SRC/usrdef_hgr.F90
+++ b/tests/VORTEX/MY_SRC/usrdef_hgr.F90
@@ -93,8 +93,8 @@ CONTAINS
       ENDIF
 #endif         
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
-         zti = REAL( mig0(ji)-1, wp )  ! start at i=0 in the global grid without halos
-         ztj = REAL( mjg0(jj)-1, wp )  ! start at j=0 in the global grid without halos
+         zti = REAL( mig(ji,0)-1, wp )  ! start at i=0 in the global grid without halos
+         ztj = REAL( mjg(jj,0)-1, wp )  ! start at j=0 in the global grid without halos
          
          plamt(ji,jj) = roffsetx + rn_dx * 1.e-3 * ( zti - 0.5_wp )
          plamu(ji,jj) = roffsetx + rn_dx * 1.e-3 *   zti 
diff --git a/tests/WAD/MY_SRC/usrdef_hgr.F90 b/tests/WAD/MY_SRC/usrdef_hgr.F90
index 38cec157e..459c26dc3 100644
--- a/tests/WAD/MY_SRC/usrdef_hgr.F90
+++ b/tests/WAD/MY_SRC/usrdef_hgr.F90
@@ -75,14 +75,14 @@ CONTAINS
       zfact = rn_dx * 1.e-3         ! conversion in km
       DO_2D( nn_hls, nn_hls, nn_hls, nn_hls )
          !                       ! longitude   (west coast at lon=0°)
-         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig0(ji)-1 , wp )  )  
-         plamu(ji,jj) = zfact * (          REAL( mig0(ji)-1 , wp )  )
+         plamt(ji,jj) = zfact * (  - 0.5 + REAL( mig(ji,0)-1 , wp )  )  
+         plamu(ji,jj) = zfact * (          REAL( mig(ji,0)-1 , wp )  )
          plamv(ji,jj) = plamt(ji,jj)
          plamf(ji,jj) = plamu(ji,jj)
          !                       ! latitude   (south coast at lat= 0°)
-         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg0(jj)-1 , wp )  )
+         pphit(ji,jj) = zfact * (  - 0.5 + REAL( mjg(jj,0)-1 , wp )  )
          pphiu(ji,jj) = pphit(ji,jj)
-         pphiv(ji,jj) = zfact * (          REAL( mjg0(jj)-1 , wp )  )
+         pphiv(ji,jj) = zfact * (          REAL( mjg(jj,0)-1 , wp )  )
          pphif(ji,jj) = pphiv(ji,jj)
       END_2D
       !
diff --git a/tests/WAD/MY_SRC/usrdef_istate.F90 b/tests/WAD/MY_SRC/usrdef_istate.F90
index b34b77c77..36896424d 100644
--- a/tests/WAD/MY_SRC/usrdef_istate.F90
+++ b/tests/WAD/MY_SRC/usrdef_istate.F90
@@ -13,8 +13,7 @@ MODULE usrdef_istate
    !!----------------------------------------------------------------------
    !!  usr_def_istate : initial state in Temperature and salinity
    !!----------------------------------------------------------------------
-   USE par_oce        ! ocean space and time domain
-   USE dom_oce , ONLY : mi0, mig, mjg, glamt, gphit, ht_0
+   USE dom_oce        ! ocean space and time domain
    USE phycst         ! physical constants
    USE wet_dry        ! Wetting and drying
    !
@@ -44,7 +43,7 @@ CONTAINS
       !! ** Purpose :   Initialization of the dynamics and tracers
       !!                Here WAD_TEST_CASES configuration 
       !!
-q      !! ** Method  : - set temprature field
+      !! ** Method  : - set temprature field
       !!              - set salinity   field
       !!----------------------------------------------------------------------
       REAL(wp), DIMENSION(jpi,jpj,jpk)     , INTENT(in   ) ::   pdept   ! depth of t-point               [m]
@@ -116,7 +115,7 @@ q      !! ** Method  : - set temprature field
             IF(lwp) WRITE(numout,*) 'usr_def_istate : WAD Parobolic EW channel with gaussian ridge' 
             IF(lwp) WRITE(numout,*) '~~~~~~~~~~'
             !
-            DO ji = mi0(jpiglo/2), mi0(jpiglo)
+            DO ji = mi0(jpiglo/2,nn_hls), mi1(jpiglo,nn_hls)
                pts(ji,:,:,jp_sal) = 30._wp
             END DO
             !
@@ -230,7 +229,7 @@ q      !! ** Method  : - set temprature field
                pssh(ji,:) = ( -2.5_wp + 5.5_wp*(50._wp-glamt(ji,1))/50._wp)*ptmask(ji,:,1)
             END DO
             !
-            DO ji = mi0(jpiglo/2), mi0(jpiglo)
+            DO ji = mi0(jpiglo/2,nn_hls), mi1(jpiglo,nn_hls)
                pssh(ji,:) = -0.1*ptmask(ji,:,1)
             END DO
             !
diff --git a/tests/WAD/MY_SRC/usrdef_zgr.F90 b/tests/WAD/MY_SRC/usrdef_zgr.F90
index eab2b9a32..df9970a0b 100644
--- a/tests/WAD/MY_SRC/usrdef_zgr.F90
+++ b/tests/WAD/MY_SRC/usrdef_zgr.F90
@@ -14,7 +14,7 @@ MODULE usrdef_zgr
    !!       zgr_z     : reference 1D z-coordinate 
    !!---------------------------------------------------------------------
    USE oce            ! ocean variables
-   USE dom_oce ,  ONLY: ht_0, mi0, mi1, mj0, mj1, glamt, gphit         ! ocean space and time domain
+   USE dom_oce        ! ocean space and time domain
    USE usrdef_nam     ! User defined : namelist variables
    USE wet_dry ,  ONLY: rn_wdmin1, rn_wdmin2, rn_wdld  ! Wetting and drying
    !
@@ -101,10 +101,10 @@ CONTAINS
                  zi = MIN((glamt(ji,1) - 10.0)/40.0, 1.0 )
                  zht(ji,:) = MAX(zbathy*zi, -2.0) 
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                     ! ====================
             CASE ( 2, 3, 8 )                         ! WAD 2 or 3  configuration
                !                                     ! ====================
@@ -117,11 +117,11 @@ CONTAINS
                  zi = MAX(1.0-((glamt(ji,1)-25.0)**2)/484.0, -0.3 )
                  zht(ji,:) = MAX(zbathy*zi, -2.0)
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
                IF( nn_cfg /= 8 ) THEN
-                  zht(:,mj0(1):mj1(1)) = -4._wp
-                  zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+                  zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+                  zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                ENDIF
                !                                     ! ====================
             CASE ( 4 )                               ! WAD 4 configuration
@@ -138,10 +138,10 @@ CONTAINS
                  zht(ji,jj) = MAX(zbathy*zi*zj, -2.0)
                END DO
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(1     ,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 5 )                              ! WAD 5 configuration
                !                                    ! ====================
@@ -168,10 +168,10 @@ CONTAINS
                  ENDIF
                END DO
                !                                    ! ===========================
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 6 )                              ! WAD 6 configuration
                !                                    ! ====================
@@ -185,10 +185,10 @@ CONTAINS
                  zj = 1.075*MAX(EXP(-1.0*((glamt(ji,1)-25.0)**2)/32.0) , 0.0 )
                  zht(ji,:) = MAX(zbathy*(zi-zj), -2.0)
                END DO
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(mi0(jpiglo):mi1(jpiglo),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
                !                                    ! ===========================
             CASE ( 7 )                              ! WAD 7 configuration
                !                                    ! ====================
@@ -215,9 +215,9 @@ CONTAINS
                  ENDIF
                END DO
                !                                    ! ===========================
-               zht(mi0(1):mi1(1),:) = -4._wp
-               zht(:,mj0(1):mj1(1)) = -4._wp
-               zht(:,mj0(jpjglo):mj1(jpjglo)) = -4._wp
+               zht(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = -4._wp
+               zht(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = -4._wp
+               zht(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = -4._wp
             CASE DEFAULT
                !                                    ! ===========================
                WRITE(ctmp1,*) 'WAD test with a ', nn_cfg,' option is not coded'
@@ -234,10 +234,10 @@ CONTAINS
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhu, 'U', 1. )     ! boundary condition: this mask the surrounding grid-points
       !                                ! ==>>>  set by hand non-zero value on first/last columns & rows 
-      DO ji = mi0(1), mi1(1)              ! first row of global domain only
+      DO ji = mi0(     1,nn_hls), mi1(     1,nn_hls)              ! first row of global domain only
          zhu(ji,:) = zht(1,:)
       END DO
-       DO ji = mi0(jpiglo), mi1(jpiglo)   ! last  row of global domain only
+       DO ji = mi0(jpiglo,nn_hls), mi1(jpiglo,nn_hls)   ! last  row of global domain only
          zhu(ji,:) = zht(jpi,:)
       END DO
       ! at v-point: averaging zht
@@ -246,10 +246,10 @@ CONTAINS
          zhv(ji,jj) = 0.5_wp * ( zht(ji,jj) + zht(ji,jj+1) )
       END_2D
       CALL lbc_lnk( 'usrdef_zgr', zhv, 'V', 1. )     ! boundary condition: this mask the surrounding grid-points
-      DO jj = mj0(1), mj1(1)   ! first  row of global domain only
+      DO jj = mj0(     1,nn_hls), mj1(     1,nn_hls)   ! first  row of global domain only
          zhv(:,jj) = zht(:,jj)
       END DO
-      DO jj = mj0(jpjglo), mj1(jpjglo)   ! last  row of global domain only
+      DO jj = mj0(jpjglo,nn_hls), mj1(jpjglo,nn_hls)   ! last  row of global domain only
          zhv(:,jj) = zht(:,jj)
       END DO
       !     
@@ -261,10 +261,10 @@ CONTAINS
       ! no ocean cavities : top ocean level is ONE, except over land
       ! the ocean basin surrounnded by land (1+nn_hls grid-points) set through lbc_lnk call
       z2d(:,:) = 1._wp                    ! surface ocean is the 1st level
-      z2d(mi0(1):mi1(1),:) = 0._wp
-      z2d(mi0(jpiglo):mi1(jpiglo),:) = 0._wp
-      z2d(:,mj0(1):mj1(1)) = 0._wp
-      z2d(:,mj0(jpjglo):mj1(jpjglo)) = 0._wp
+      z2d(mi0(     1,nn_hls):mi1(     1,nn_hls),:) = 0._wp
+      z2d(mi0(jpiglo,nn_hls):mi1(jpiglo,nn_hls),:) = 0._wp
+      z2d(:,mj0(     1,nn_hls):mj1(     1,nn_hls)) = 0._wp
+      z2d(:,mj0(jpjglo,nn_hls):mj1(jpjglo,nn_hls)) = 0._wp
 
       CALL lbc_lnk( 'usrdef_zgr', z2d, 'T', 1. )        ! closed basin, see userdef_nam.F90
       k_top(:,:) = NINT( z2d(:,:) )
-- 
GitLab