diff --git a/src/LIB/SURCOUCHE/src/mode_gather.f90 b/src/LIB/SURCOUCHE/src/mode_gather.f90
index b2d3e89a57cc7efed21882a6f1639bbddd132ccd..d57d47cf8566544bc2be3aa09a15c6ff9b65670e 100644
--- a/src/LIB/SURCOUCHE/src/mode_gather.f90
+++ b/src/LIB/SURCOUCHE/src/mode_gather.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2021 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -8,7 +8,7 @@
 !  J. Escobar  22/05/2012: bug in ISEND with non-contiguous buffer: reintroduce intermediate buffer
 !  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 26/04/2019: use modd_precision parameters for datatypes of MPI communications
-!
+!  P. Wautelet 14/01/2021: add GATHERXX_N4, GATHERXX_L3, GATHERXY_N4 and GATHERXY_L3 subroutines
 !-----------------------------------------------------------------
 
 MODULE MODE_GATHER_ll
@@ -22,18 +22,27 @@ IMPLICIT NONE
 PRIVATE
 
 INTERFACE GATHERALL_FIELD_ll
-  MODULE PROCEDURE GATHERALL_X1, GATHERALL_X2, GATHERALL_X3,&
-       & GATHERALL_N1, GATHERALL_N2
+  MODULE PROCEDURE                               &
+       GATHERALL_X1, GATHERALL_X2, GATHERALL_X3, &
+       GATHERALL_N1, GATHERALL_N2,               &
+       GATHERALL_L3
 END INTERFACE
 
 INTERFACE GATHER_XXFIELD
-  MODULE PROCEDURE GATHERXX_X1,GATHERXX_X2,GATHERXX_X3,GATHERXX_X4,GATHERXX_X5,&
-       & GATHERXX_X6,GATHERXX_N1,GATHERXX_N2,GATHERXX_N3,GATHERXX_L1
+  MODULE PROCEDURE                            &
+       GATHERXX_X1, GATHERXX_X2, GATHERXX_X3, &
+       GATHERXX_X4, GATHERXX_X5, GATHERXX_X6, &
+       GATHERXX_N1, GATHERXX_N2, GATHERXX_N3, &
+       GATHERXX_N4,                           &
+       GATHERXX_L1, GATHERXX_L3
 END INTERFACE
 
 INTERFACE GATHER_XYFIELD
-  MODULE PROCEDURE GATHERXY_X2,GATHERXY_X3,GATHERXY_X4,GATHERXY_X5,GATHERXY_X6,&
-       & GATHERXY_N2,GATHERXY_N3
+  MODULE PROCEDURE                            &
+       GATHERXY_X2, GATHERXY_X3, GATHERXY_X4, &
+       GATHERXY_X5, GATHERXY_X6,              &
+       GATHERXY_N2, GATHERXY_N3, GATHERXY_N4, &
+       GATHERXY_L3
 END INTERFACE
 
 PUBLIC GATHER_XXFIELD,GATHER_XYFIELD,GATHERALL_FIELD_ll,GATHERALL_X1,&
@@ -62,7 +71,7 @@ ELSE
   KRESP =-1
   PRINT *,'Error GATHERALL_X1'
 END IF
-! PRECV variable of IROOT processor contains the global field
+! PRECV variable of IROOT process contains the global field
 CALL MPI_BCAST(PRECV,SIZE(PRECV),MNHREAL_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
 
 END SUBROUTINE GATHERALL_X1
@@ -85,7 +94,7 @@ ELSE IF (HDIR == 'XY') THEN
 ELSE
   PRINT *,'Error GATHERALL_X2'
 END IF
-! PRECV variable of IROOT processor contains the global field
+! PRECV variable of IROOT process contains the global field
 CALL MPI_BCAST(PRECV,SIZE(PRECV),MNHREAL_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
 
 END SUBROUTINE GATHERALL_X2
@@ -109,7 +118,7 @@ ELSE
   PRINT *,'Error GATHERALL_X3'
   KRESP = -1
 END IF
-! PRECV variable of IROOT processor contains the global field
+! PRECV variable of IROOT process contains the global field
 CALL MPI_BCAST(PRECV,SIZE(PRECV),MNHREAL_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
 
 END SUBROUTINE GATHERALL_X3
@@ -131,7 +140,7 @@ IF (HDIR == 'XX' .OR. HDIR == 'YY') THEN
 ELSE 
   PRINT *,'Error GATHERALL_N1'
 END IF
-! KRECV variable of IROOT processor contains the global field
+! KRECV variable of IROOT process contains the global field
 CALL MPI_BCAST(KRECV,SIZE(KRECV),MNHINT_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
 
 END SUBROUTINE GATHERALL_N1
@@ -154,11 +163,34 @@ ELSE IF (HDIR == 'XY') THEN
 ELSE
   PRINT *,'Error GATHERALL_N2'
 END IF
-! KRECV variable of IROOT processor contains the global field
+! KRECV variable of IROOT process contains the global field
 CALL MPI_BCAST(KRECV,SIZE(KRECV),MNHINT_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
 
 END SUBROUTINE GATHERALL_N2
 
+SUBROUTINE GATHERALL_L3(HDIR,OSEND,ORECV,KRESP)
+CHARACTER(LEN=*),         INTENT(IN)    :: HDIR
+LOGICAL,DIMENSION(:,:,:), INTENT(IN)    :: OSEND
+LOGICAL,DIMENSION(:,:,:), INTENT(INOUT) :: ORECV
+INTEGER,                  INTENT(INOUT) :: KRESP
+
+INTEGER :: IROOT
+
+KRESP = 0
+IROOT = 1
+
+IF (HDIR == 'XX' .OR. HDIR == 'YY') THEN
+  CALL GATHER_XXFIELD(HDIR,OSEND,ORECV,IROOT,NMNH_COMM_WORLD)
+ELSE IF (HDIR == 'XY') THEN
+  CALL GATHER_XYFIELD(OSEND,ORECV,IROOT,NMNH_COMM_WORLD)
+ELSE
+  PRINT *,'Error GATHERALL_L3'
+  KRESP = -1
+END IF
+! ORECV variable of IROOT process contains the global field
+CALL MPI_BCAST(ORECV,SIZE(ORECV),MNHLOG_MPI,IROOT-1,NMNH_COMM_WORLD,KRESP)
+
+END SUBROUTINE GATHERALL_L3
 
 !
 ! Gather des champs XX (ou YY)
@@ -213,7 +245,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -281,7 +313,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -342,7 +374,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -403,7 +435,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -464,7 +496,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -525,7 +557,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -587,7 +619,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -650,7 +682,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   
@@ -711,7 +743,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
 
@@ -726,6 +758,68 @@ END IF
 
 END SUBROUTINE GATHERXX_N3
 
+
+SUBROUTINE GATHERXX_N4(HDIR,KSEND,KRECV,KROOT,KCOMM)
+USE MODD_IO, ONLY: ISP, ISNPROC
+
+CHARACTER(LEN=*),                    INTENT(IN)    :: HDIR
+INTEGER, DIMENSION(:,:,:,:), TARGET, INTENT(IN)    :: KSEND
+INTEGER, DIMENSION(:,:,:,:), TARGET, INTENT(INOUT) :: KRECV
+INTEGER,                             INTENT(IN)    :: KROOT
+INTEGER,                             INTENT(IN)    :: KCOMM
+
+INTEGER                     :: JI
+INTEGER                     :: IXO,IXE,IYO,IYE
+INTEGER                     :: IGXO,IGXE,IGYO,IGYE
+INTEGER                     :: IERR
+INTEGER                     :: IXM, IYM
+INTEGER, DIMENSION(:,:,:,:), POINTER :: IP
+
+CALL GET_DOMWRITE_ll(KROOT,'global',IGXO,IGXE,IGYO,IGYE)
+IXM = (IGXE+IGXO)/2
+IYM = (IGYE+IGYO)/2
+
+IF (ISP == KROOT)  THEN
+  ! I/O proc case
+  DO JI=1,ISNPROC
+    CALL GET_DOMWRITE_ll(JI,'global',IGXO,IGXE,IGYO,IGYE)
+    CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE)
+
+    IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
+      IP=>KRECV(IGXO:IGXE,:,:,:)
+      IF (JI == KROOT) THEN
+        IP = KSEND(IXO:IXE,:,:,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+
+    ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+      IP=>KRECV(IGYO:IGYE,:,:,:)
+      IF (JI==KROOT) THEN
+        IP = KSEND(IYO:IYE,:,:,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+    END IF
+  END DO
+
+ELSE
+  ! Other processes
+  CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
+  CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
+
+  IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
+    IP=>KSEND(IXO:IXE,:,:,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+    IP=>KSEND(IYO:IYE,:,:,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  END IF
+END IF
+
+END SUBROUTINE GATHERXX_N4
+
+
 SUBROUTINE GATHERXX_L1(HDIR,OSEND,ORECV,KROOT,KCOMM)
 USE MODD_IO, ONLY: ISP, ISNPROC
 
@@ -773,7 +867,7 @@ IF (ISP == KROOT)  THEN
   END DO
 
 ELSE
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
 
@@ -788,6 +882,67 @@ END IF
 
 END SUBROUTINE GATHERXX_L1
 
+SUBROUTINE GATHERXX_L3(HDIR,OSEND,ORECV,KROOT,KCOMM)
+USE MODD_IO, ONLY : ISP, ISNPROC
+
+CHARACTER(LEN=*),               INTENT(IN)   :: HDIR
+LOGICAL,DIMENSION(:,:,:),TARGET,INTENT(IN)   :: OSEND
+LOGICAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT):: ORECV
+INTEGER,                        INTENT(IN)   :: KROOT
+INTEGER,                        INTENT(IN)   :: KCOMM
+
+INTEGER                     :: JI
+INTEGER                     :: IXO,IXE,IYO,IYE
+INTEGER                     :: IGXO,IGXE,IGYO,IGYE
+LOGICAL, DIMENSION(:,:,:), POINTER :: IP
+INTEGER                     :: IERR
+INTEGER                     :: IXM, IYM
+!INTEGER, DIMENSION(MPI_STATUS_SIZE)   :: STATUS
+
+CALL GET_DOMWRITE_ll(KROOT,'global',IGXO,IGXE,IGYO,IGYE)
+IXM = (IGXE+IGXO)/2
+IYM = (IGYE+IGYO)/2
+
+IF (ISP == KROOT)  THEN
+  ! I/O proc case
+  DO JI=1,ISNPROC
+    CALL GET_DOMWRITE_ll(JI,'global',IGXO,IGXE,IGYO,IGYE)
+    CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE)
+
+    IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
+      IP=>ORECV(IGXO:IGXE,:,:)
+      IF (JI == KROOT) THEN
+        IP = OSEND(IXO:IXE,:,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHLOG_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+
+    ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+      IP=>ORECV(IGYO:IGYE,:,:)
+      IF (JI==KROOT) THEN
+        IP = OSEND(IYO:IYE,:,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHLOG_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+    END IF
+  END DO
+
+ELSE
+  ! Other processes
+  CALL GET_DOMWRITE_ll(ISP,'global',IGXO,IGXE,IGYO,IGYE)
+  CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
+
+  IF (HDIR == 'XX' .AND. IYM <= IGYE .AND. IYM >= IGYO) THEN
+    IP=>OSEND(IXO:IXE,:,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHLOG_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+    IP=>OSEND(IYO:IYE,:,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHLOG_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  END IF
+END IF
+
+END SUBROUTINE GATHERXX_L3
+
 !
 ! Gather des champs XY
 !
@@ -828,7 +983,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE)
@@ -875,7 +1030,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE,:)
@@ -916,7 +1071,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE,:,:)
@@ -957,7 +1112,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE,:,:,:)
@@ -998,7 +1153,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE,:,:,:,:)
@@ -1035,7 +1190,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE)
   ITP=>KSEND(IXO:IXE,IYO:IYE)
   CALL MPI_BSEND(ITP,SIZE(ITP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
@@ -1074,7 +1229,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
   IF (IXO /= 0) THEN ! intersection is not empty
     IP=>KSEND(IXO:IXE,IYO:IYE,:)
@@ -1084,6 +1239,89 @@ END IF
 
 END SUBROUTINE GATHERXY_N3
 
+
+SUBROUTINE GATHERXY_N4(KSEND,KRECV,KROOT,KCOMM,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+USE MODD_IO, ONLY: ISP, ISNPROC
+
+INTEGER, DIMENSION(:,:,:,:), TARGET,           INTENT(IN)    :: KSEND
+INTEGER, DIMENSION(:,:,:,:), TARGET,           INTENT(INOUT) :: KRECV
+INTEGER,                                       INTENT(IN)    :: KROOT
+INTEGER,                                       INTENT(IN)    :: KCOMM
+INTEGER,                             OPTIONAL, INTENT(IN)    :: KXOBOX,KXEBOX,KYOBOX,KYEBOX
+CHARACTER(LEN=*),                    OPTIONAL, INTENT(IN)    :: HINTER
+
+INTEGER                         :: JI
+INTEGER                         :: IXO,IXE,IYO,IYE
+INTEGER                         :: IERR
+INTEGER, DIMENSION(:,:,:,:), POINTER :: IP
+
+IF (ISP == KROOT)  THEN
+  ! I/O proc case
+  DO JI=1,ISNPROC
+    CALL GET_DOMWRITE_ll(JI,'global',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+    IF (IXO /= 0) THEN ! intersection is not empty
+      IP=>KRECV(IXO:IXE,IYO:IYE,:,:)
+      IF (ISP == JI) THEN
+        CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+        IP = KSEND(IXO:IXE,IYO:IYE,:,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHINT_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+    END IF
+  END DO
+ELSE
+  ! Other processes
+  CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+  IF (IXO /= 0) THEN ! intersection is not empty
+    IP=>KSEND(IXO:IXE,IYO:IYE,:,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHINT_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  END IF
+END IF
+
+END SUBROUTINE GATHERXY_N4
+
+
+SUBROUTINE GATHERXY_L3(OSEND,ORECV,KROOT,KCOMM,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+USE MODD_IO, ONLY : ISP, ISNPROC
+
+LOGICAL,DIMENSION(:,:,:),TARGET,INTENT(IN)   :: OSEND
+LOGICAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT):: ORECV
+INTEGER,                     INTENT(IN) :: KROOT
+INTEGER,                     INTENT(IN) :: KCOMM
+INTEGER,            OPTIONAL,INTENT(IN) :: KXOBOX,KXEBOX,KYOBOX,KYEBOX
+CHARACTER(LEN=*),   OPTIONAL,INTENT(IN) :: HINTER
+
+INTEGER                       :: JI
+INTEGER                       :: IXO,IXE,IYO,IYE
+LOGICAL, DIMENSION(:,:,:),POINTER:: IP
+INTEGER                       :: IERR
+!INTEGER, DIMENSION(MPI_STATUS_SIZE)   :: STATUS
+
+IF (ISP == KROOT)  THEN
+  ! I/O proc case
+  DO JI=1,ISNPROC
+    CALL GET_DOMWRITE_ll(JI,'global',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+    IF (IXO /= 0) THEN ! intersection is not empty
+      IP=>ORECV(IXO:IXE,IYO:IYE,:)
+      IF (ISP == JI) THEN
+        CALL GET_DOMWRITE_ll(JI,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+        IP = OSEND(IXO:IXE,IYO:IYE,:)
+      ELSE
+        CALL MPI_RECV(IP,SIZE(IP),MNHLOG_MPI,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+    END IF
+  END DO
+ELSE
+  ! Other processes
+  CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX,HINTER)
+  IF (IXO /= 0) THEN ! intersection is not empty
+    IP=>OSEND(IXO:IXE,IYO:IYE,:)
+    CALL MPI_BSEND(IP,SIZE(IP),MNHLOG_MPI,KROOT-1,99+KROOT,KCOMM,IERR)
+  END IF
+END IF
+
+END SUBROUTINE GATHERXY_L3
+
 SUBROUTINE GATHERBOX_X2(PSEND,PRECV,KROOT,KCOMM,KXOBOX,KXEBOX,KYOBOX,KYEBOX)
 USE MODD_IO, ONLY: ISP, ISNPROC
 
@@ -1114,7 +1352,7 @@ IF (ISP == KROOT)  THEN
     END IF
   END DO
 ELSE 
-  ! Other processors
+  ! Other processes
   CALL GET_DOMWRITE_ll(ISP,'local',IXO,IXE,IYO,IYE,KXOBOX,KXEBOX,KYOBOX,KYEBOX)
   IF (IXO /= 0) THEN ! intersection is not empty
     XP=>PSEND(IXO:IXE,IYO:IYE)