diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
index e423bf89c443643fd1b8df0eb51abfabdabf6fd6..ac0992cf311a2087f0f924b9ee230a474e1b6cee 100644
--- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90
+++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
@@ -278,6 +278,7 @@ INTERFACE IO_WRITE_FIELD_LFI
                     IO_WRITE_FIELD_LFI_X6,                       &
                     IO_WRITE_FIELD_LFI_N0,IO_WRITE_FIELD_LFI_N1, &
                     IO_WRITE_FIELD_LFI_N2,IO_WRITE_FIELD_LFI_N3, &
+                    IO_WRITE_FIELD_LFI_L0,IO_WRITE_FIELD_LFI_L1, &
                     IO_WRITE_FIELD_LFI_C0,                       &
                     IO_WRITE_FIELD_LFI_T0
 END INTERFACE IO_WRITE_FIELD_LFI
@@ -724,6 +725,100 @@ IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
 !
 END SUBROUTINE IO_WRITE_FIELD_LFI_N3
 !
+SUBROUTINE IO_WRITE_FIELD_LFI_L0(TPFIELD,KFLU,OFIELD,KRESP)
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+INTEGER,                 INTENT(IN) :: KFLU   ! Fortran Logical Unit
+LOGICAL,                 INTENT(IN) :: OFIELD ! array containing the data field
+INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER                                  :: IFIELD
+INTEGER                                  :: ILENG
+INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+CHARACTER(LEN=16)                        :: YRECFM
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_LFI_L0','writing '//TRIM(TPFIELD%CMNHNAME))
+!
+ILENG = 1
+!
+!Convert LOGICAL to INTEGER (LOGICAL format not supported by LFI files)
+IF (OFIELD) THEN
+  IFIELD = 1
+ELSE
+  IFIELD = 0
+END IF
+!
+CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP)
+!
+IF (IRESP==0) THEN
+  IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3)=IFIELD
+  YRECFM=TRIM(TPFIELD%CMNHNAME)
+  IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) &
+    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_L0','field name was truncated to '&
+                   //YRECFM//' for '//TRIM(TPFIELD%CMNHNAME))
+  CALL LFIECR(IRESP,KFLU,YRECFM,IWORK,ITOTAL)
+ENDIF
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_WRITE_FIELD_LFI_L0
+!
+SUBROUTINE IO_WRITE_FIELD_LFI_L1(TPFIELD,KFLU,OFIELD,KRESP)
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+INTEGER,                 INTENT(IN) :: KFLU   ! Fortran Logical Unit
+LOGICAL,DIMENSION(:),    INTENT(IN) :: OFIELD ! array containing the data field
+INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER, DIMENSION(SIZE(OFIELD))         :: IFIELD
+INTEGER                                  :: ILENG
+INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+CHARACTER(LEN=16)                        :: YRECFM
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_LFI_L1','writing '//TRIM(TPFIELD%CMNHNAME))
+!
+ILENG = SIZE(OFIELD)
+!
+!Convert LOGICAL to INTEGER (LOGICAL format not supported by LFI files)
+WHERE (OFIELD)
+  IFIELD = 1
+ELSEWHERE
+  IFIELD = 0
+END WHERE
+!
+CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP)
+!
+IF (IRESP==0) THEN
+  IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3:) = IFIELD(:)
+  YRECFM=TRIM(TPFIELD%CMNHNAME)
+  IF( LEN_TRIM(TPFIELD%CMNHNAME) > LEN(YRECFM) ) &
+    CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_LFI_L1','field name was truncated to '&
+                   //YRECFM//' for '//TRIM(TPFIELD%CMNHNAME))
+  CALL LFIECR(IRESP,KFLU,YRECFM,IWORK,ITOTAL)
+ENDIF
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_WRITE_FIELD_LFI_L1
+!
 SUBROUTINE IO_WRITE_FIELD_LFI_C0(TPFIELD,KFLU,HFIELD,KRESP)
 !
 IMPLICIT NONE
diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index e8ec742ef31312c486cb505cee4e216f7de1079e..81e95d60ace139656f5f3a5f59d1aa91b1edecb8 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -3298,6 +3298,9 @@ CONTAINS
 
   SUBROUTINE IO_WRITE_FIELD_BYFIELD_L0(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD)
     USE MODD_IO_ll
+    USE MODD_FM
+    USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
+    USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
     !*      0.    DECLARATIONS
     !             ------------
     !
@@ -3312,21 +3315,67 @@ CONTAINS
     !
     !*      0.2   Declarations of local variables
     !
-    INTEGER :: IFIELD
+    INTEGER                      :: IERR
+    TYPE(FD_ll), POINTER         :: TZFD
+    INTEGER                      :: IRESP
+    !JUANZIO
+    INTEGER                                  :: IK_FILE,IK_RANK
+    CHARACTER(len=5)                         :: YK_FILE
+    CHARACTER(len=128)                       :: YFILE_IOZ
+    TYPE(FD_ll), POINTER                     :: TZFD_IOZ
+    TYPE(TFILEDATA),POINTER                  :: TZFILE
     !
     CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L0','writing '//TRIM(TPFIELD%CMNHNAME))
     !
     !
-    IF (OFIELD) THEN
-      IFIELD = 1
+    IRESP = 0
+    !------------------------------------------------------------------
+    TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
+    IF (ASSOCIATED(TZFD)) THEN
+       IF (GSMONOPROC) THEN ! sequential execution
+          IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,OFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
+       ELSE
+          IF (ISP == TZFD%OWNER)  THEN
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,OFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
+          END IF
+          !
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+       END IF ! multiprocessor execution
+       IF (TZFD%nb_procio.gt.1) THEN
+          ! write the data in all Z files
+          DO IK_FILE=1,TZFD%nb_procio
+             write(YK_FILE ,'(".Z",i3.3)')  IK_FILE
+             YFILE_IOZ =  TRIM(TPFILE%CNAME)//YK_FILE//".lfi"
+             TZFD_IOZ => GETFD(YFILE_IOZ)
+             IK_RANK = TZFD_IOZ%OWNER
+             IF ( ISP == IK_RANK )  THEN
+                IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,OFIELD,IRESP)
+                IF (LIOCDF4) THEN
+                  CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME)//YK_FILE,TZFILE,IRESP)
+                  IF (IRESP/=0) THEN
+                    CALL PRINT_MSG(NVERB_FATAL,'IO','IO_WRITE_FIELD_BYFIELD_L0','file '//TRIM(TRIM(TPFILE%CNAME)//YK_FILE)//&
+                                   ' not found in list')
+                  END IF
+                  CALL IO_WRITE_FIELD_NC4(TZFILE,TPFIELD,TZFD_IOZ%CDF,OFIELD,IRESP)
+                END IF
+             END IF
+          END DO
+       ENDIF
     ELSE
-      IFIELD = 0
+       IRESP = -61
     END IF
-    !
-    CALL IO_WRITE_FIELD(TPFILE,TPFIELD,HFIPRI,KRESP,IFIELD)
-    !
+    !----------------------------------------------------------------
+    IF (IRESP.NE.0) THEN
+       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_L0",TPFILE%CNAME,HFIPRI,TPFIELD%CMNHNAME,TPFIELD%CDIR,TPFIELD%NGRID,&
+                        LEN(TPFIELD%CCOMMENT) ,IRESP)
+    END IF
+    KRESP = IRESP
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L0
 
+
+
   SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
     USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
@@ -3356,9 +3405,9 @@ CONTAINS
     TYPE(FD_ll), POINTER             :: TZFD
     INTEGER                          :: IRESP
     TYPE(FMHEADER)                   :: TZFMH
-
     !
     CALL PRINT_MSG(NVERB_DEBUG,'IO','FMWRITL1_ll','writing '//TRIM(HRECFM))
+    !
     !----------------------------------------------------------------
     !
     !*      1.1   THE NAME OF LFIFM
@@ -3402,59 +3451,109 @@ CONTAINS
     KRESP = IRESP
   END SUBROUTINE FMWRITL1_ll
 
-  SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD)
-    USE MODD_IO_ll
-    !*      0.    DECLARATIONS
-    !             ------------
+  SUBROUTINE IO_WRITE_FIELD_BYNAME_L1(TPFILE,HNAME,HFIPRI,KRESP,OFIELD)
     !
+    USE MODD_IO_ll, ONLY : TFILEDATA
     !
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CHARACTER(LEN=*),            INTENT(IN) :: HNAME    ! name of the field to write
     CHARACTER(LEN=*),            INTENT(IN) :: HFIPRI   ! output file for error messages
     INTEGER,                     INTENT(OUT):: KRESP    ! return-code 
     LOGICAL,DIMENSION(:),        INTENT(IN) :: OFIELD   ! array containing the data field
     !
     !*      0.2   Declarations of local variables
     !
-    INTEGER, DIMENSION(SIZE(OFIELD)) :: IFIELD
+    INTEGER :: ID ! Index of the field
     !
-    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L1','writing '//TRIM(TPFIELD%CMNHNAME))
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_L1','writing '//TRIM(HNAME))
     !
-    WHERE (OFIELD)
-      IFIELD = 1
-    ELSEWHERE
-      IFIELD = 0
-    END WHERE
+    CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP)
     !
-    CALL IO_WRITE_FIELD(TPFILE,TPFIELD,HFIPRI,KRESP,IFIELD)
+    IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,OFIELD)
     !
-  END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1
+  END SUBROUTINE IO_WRITE_FIELD_BYNAME_L1
 
-  SUBROUTINE IO_WRITE_FIELD_BYNAME_L1(TPFILE,HNAME,HFIPRI,KRESP,OFIELD)
+  SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1(TPFILE,TPFIELD,HFIPRI,KRESP,OFIELD)
     !
-    USE MODD_IO_ll, ONLY : TFILEDATA
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,TFILEDATA
+    USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
+    USE MODE_ALLOCBUFFER_ll
+    USE MODE_GATHER_ll
+    !
+    IMPLICIT NONE
     !
     !*      0.1   Declarations of arguments
     !
-    TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    CHARACTER(LEN=*),            INTENT(IN) :: HNAME    ! name of the field to write
-    CHARACTER(LEN=*),            INTENT(IN) :: HFIPRI   ! output file for error messages
-    INTEGER,                     INTENT(OUT):: KRESP    ! return-code 
-    LOGICAL,DIMENSION(:),        INTENT(IN) :: OFIELD   ! array containing the data field
+    TYPE(TFILEDATA),              INTENT(IN) :: TPFILE
+    TYPE(TFIELDDATA),             INTENT(IN) :: TPFIELD
+    CHARACTER(LEN=*),             INTENT(IN) :: HFIPRI   ! output file for error messages
+    INTEGER,                      INTENT(OUT):: KRESP    ! return-code 
+    LOGICAL,DIMENSION(:),TARGET,  INTENT(IN) :: OFIELD   ! array containing the data field
     !
     !*      0.2   Declarations of local variables
     !
-    INTEGER :: ID ! Index of the field
+    CHARACTER(LEN=28)                        :: YFILEM   ! FM-file name
+    CHARACTER(LEN=NMNHNAMELGTMAX)            :: YRECFM   ! name of the article to write
+    CHARACTER(LEN=2)                         :: YDIR     ! field form
+    CHARACTER(LEN=JPFINL)                    :: YFNLFI
+    INTEGER                                  :: IERR
+    TYPE(FD_ll), POINTER                     :: TZFD
+    INTEGER                                  :: IRESP
+    LOGICAL,DIMENSION(:),POINTER             :: GFIELDP
+    LOGICAL                                  :: GALLOC
     !
-    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYNAME_L1','writing '//TRIM(HNAME))
+    YFILEM   = TPFILE%CNAME
+    YRECFM   = TPFIELD%CMNHNAME
+    YDIR     = TPFIELD%CDIR
     !
-    CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,KRESP)
+    CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_BYFIELD_L1','writing '//TRIM(YRECFM))
     !
-    IF(KRESP==0) CALL IO_WRITE_FIELD(TPFILE,TFIELDLIST(ID),HFIPRI,KRESP,OFIELD)
     !
-  END SUBROUTINE IO_WRITE_FIELD_BYNAME_L1
+    !*      1.1   THE NAME OF LFIFM
+    !
+    IRESP = 0
+    GALLOC = .FALSE.
+    YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi'
+    !------------------------------------------------------------------
+    TZFD=>GETFD(YFNLFI)
+    IF (ASSOCIATED(TZFD)) THEN
+       IF (GSMONOPROC) THEN ! sequential execution
+          IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,OFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,OFIELD,IRESP)
+       ELSE ! multiprocessor execution
+          IF (ISP == TZFD%OWNER)  THEN
+             CALL ALLOCBUFFER_ll(GFIELDP,OFIELD,YDIR,GALLOC)
+          ELSE
+             ALLOCATE(GFIELDP(0))
+             GALLOC = .TRUE.
+          END IF
+          !
+          IF (YDIR == 'XX' .OR. YDIR =='YY') THEN
+             CALL GATHER_XXFIELD(YDIR,OFIELD,GFIELDP,TZFD%OWNER,TZFD%COMM)
+          END IF
+          !
+          IF (ISP == TZFD%OWNER)  THEN
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,GFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFILE,TPFIELD,TZFD%CDF,GFIELDP,IRESP)
+          END IF
+          !
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+       END IF
+    ELSE
+       IRESP = -61
+    END IF
+    !----------------------------------------------------------------
+    IF (IRESP.NE.0) THEN
+       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_L1",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP)
+    END IF
+    IF (GALLOC) DEALLOCATE(GFIELDP)
+    KRESP = IRESP
+    IF (ASSOCIATED(TZFD)) CALL MPI_BARRIER(TZFD%COMM,IERR)
+    !
+  END SUBROUTINE IO_WRITE_FIELD_BYFIELD_L1
+
 
   SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
diff --git a/src/LIB/SURCOUCHE/src/mode_allocbuff.f90 b/src/LIB/SURCOUCHE/src/mode_allocbuff.f90
index 0268af27c3136ca2b0e7de2c161fd580a0abf16e..995ecc320e4667503a6865a179462a3a3119d5d0 100644
--- a/src/LIB/SURCOUCHE/src/mode_allocbuff.f90
+++ b/src/LIB/SURCOUCHE/src/mode_allocbuff.f90
@@ -23,7 +23,8 @@ PRIVATE
 INTERFACE ALLOCBUFFER_ll
   MODULE PROCEDURE ALLOCBUFFER_X1,ALLOCBUFFER_X2,ALLOCBUFFER_X3,&
        & ALLOCBUFFER_X4,ALLOCBUFFER_X5,ALLOCBUFFER_X6,&
-       & ALLOCBUFFER_N1,ALLOCBUFFER_N2,ALLOCBUFFER_N3
+       & ALLOCBUFFER_N1,ALLOCBUFFER_N2,ALLOCBUFFER_N3,&
+       & ALLOCBUFFER_L1
 END INTERFACE
 
 PUBLIC ALLOCBUFFER_ll
@@ -122,6 +123,30 @@ CASE default
 END SELECT
 END SUBROUTINE ALLOCBUFFER_N3
 
+SUBROUTINE ALLOCBUFFER_L1(LTAB_P,LTAB,HDIR,OALLOC)
+!
+LOGICAL,DIMENSION(:),POINTER           :: LTAB_P
+LOGICAL,DIMENSION(:),TARGET,INTENT(IN) :: LTAB
+CHARACTER(LEN=*),           INTENT(IN) :: HDIR
+LOGICAL,                    INTENT(OUT):: OALLOC
+
+INTEGER                   :: IIMAX,IJMAX
+
+SELECT CASE(HDIR)
+CASE('XX')
+  CALL GET_GLOBALDIMS_ll(IIMAX,IJMAX)
+  ALLOCATE(LTAB_P(IIMAX+2*JPHEXT))
+  OALLOC = .TRUE.
+CASE('YY')
+  CALL GET_GLOBALDIMS_ll(IIMAX,IJMAX)
+  ALLOCATE(LTAB_P(IJMAX+2*JPHEXT))
+  OALLOC = .TRUE.
+CASE default
+  LTAB_P=>LTAB
+  OALLOC = .FALSE.
+END SELECT
+END SUBROUTINE ALLOCBUFFER_L1
+
 SUBROUTINE ALLOCBUFFER_X1(PTAB_P,PTAB,HDIR,OALLOC, KIMAX_ll, KJMAX_ll)
 !
 REAL,DIMENSION(:),POINTER           :: PTAB_P
diff --git a/src/LIB/SURCOUCHE/src/mode_gather.f90 b/src/LIB/SURCOUCHE/src/mode_gather.f90
index 9be905a4c873bb6206afccbf13db322ae65a96ea..e8afb0c5c0b7aaa67d63112153eb83a8895d7b2d 100644
--- a/src/LIB/SURCOUCHE/src/mode_gather.f90
+++ b/src/LIB/SURCOUCHE/src/mode_gather.f90
@@ -44,7 +44,7 @@ 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_X6,GATHERXX_N1,GATHERXX_N2,GATHERXX_N3,GATHERXX_L1
 END INTERFACE
 
 INTERFACE GATHER_XYFIELD
@@ -768,6 +768,70 @@ END IF
 
 END SUBROUTINE GATHERXX_N3
 
+SUBROUTINE GATHERXX_L1(HDIR,OSEND,ORECV,KROOT,KCOMM)
+USE MODD_IO_ll, 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
+
+!INCLUDE 'mpif.h'
+
+INTEGER                         :: JI
+INTEGER                         :: IXO,IXE,IYO,IYE
+INTEGER                         :: IGXO,IGXE,IGYO,IGYE
+LOGICAL, DIMENSION(:), POINTER  :: GTP
+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
+      GTP=>ORECV(IGXO:IGXE)
+      IF (JI == KROOT) THEN
+        GTP = OSEND(IXO:IXE)
+      ELSE
+        CALL MPI_RECV(GTP,SIZE(GTP),MPI_LOGICAL,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+
+    ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+      GTP=>ORECV(IGYO:IGYE)
+      IF (JI==KROOT) THEN
+        GTP = OSEND(IYO:IYE)
+      ELSE
+        CALL MPI_RECV(GTP,SIZE(GTP),MPI_LOGICAL,JI-1,99+KROOT,KCOMM,MPI_STATUS_IGNORE,IERR)
+      END IF
+    END IF
+  END DO
+
+ELSE
+  ! Other processors
+  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
+    GTP=>OSEND(IXO:IXE)
+    CALL MPI_BSEND(GTP,SIZE(GTP),MPI_LOGICAL,KROOT-1,99+KROOT,KCOMM,IERR)
+  ELSE IF (HDIR == 'YY' .AND. IXM <= IGXE .AND. IXM >= IGXO) THEN
+    GTP=>OSEND(IYO:IYE)
+    CALL MPI_BSEND(GTP,SIZE(GTP),MPI_LOGICAL,KROOT-1,99+KROOT,KCOMM,IERR)
+  END IF
+END IF
+
+END SUBROUTINE GATHERXX_L1
+
 !
 ! Gather des champs XY
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 8e327759721b03048c82b5b5e20f7c3472d99609..33cfd1c96b5229859a79fbfd5e7cadbcf9b9cc93 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -28,6 +28,7 @@ INTERFACE IO_WRITE_FIELD_NC4
                     IO_WRITE_FIELD_NC4_X4,IO_WRITE_FIELD_NC4_X5, &
                     IO_WRITE_FIELD_NC4_X6,                       &
                     IO_WRITE_FIELD_NC4_N0,IO_WRITE_FIELD_NC4_N1, &
+                    IO_WRITE_FIELD_NC4_L0,IO_WRITE_FIELD_NC4_L1, &
                     IO_WRITE_FIELD_NC4_N2,IO_WRITE_FIELD_NC4_N3, &
                     IO_WRITE_FIELD_NC4_C0,IO_WRITE_FIELD_NC4_C1, &
                     IO_WRITE_FIELD_NC4_T0
@@ -1570,6 +1571,117 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_N3
 KRESP = IRESP
 END SUBROUTINE IO_WRITE_FIELD_NC4_N3
 
+SUBROUTINE IO_WRITE_FIELD_NC4_L0(TPFILE,TPFIELD,PZCDF,OFIELD,KRESP)
+!
+USE MODD_PARAMETERS_ll,  ONLY : JPVEXT
+!
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
+TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+TYPE(IOCDF), POINTER              :: PZCDF
+LOGICAL,               INTENT(IN) :: OFIELD
+INTEGER,               INTENT(OUT):: KRESP
+!
+INTEGER                  :: IFIELD
+INTEGER(KIND=IDCDF_KIND) :: STATUS
+INTEGER(KIND=IDCDF_KIND) :: INCID
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
+INTEGER(KIND=IDCDF_KIND) :: IVARID
+INTEGER                  :: IRESP
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L0','writing '//TRIM(TPFIELD%CMNHNAME))
+!
+IRESP = 0
+! Get the Netcdf file ID
+INCID = TPFILE%NNCID
+
+CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
+
+! The variable should not already exist but who knows ?
+STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF90_NOERR) THEN
+   ! Define the scalar variable 
+   ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
+   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVARID)
+   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_DEF_VAR]')
+   CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID)
+ELSE
+   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L0',TRIM(YVARNAME)//' already defined')
+END IF
+
+!Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files)
+IF (OFIELD) THEN
+  IFIELD = 1
+ELSE
+  IFIELD = 0
+END IF
+
+! Write the data
+STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
+IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L0[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+
+KRESP = IRESP
+END SUBROUTINE IO_WRITE_FIELD_NC4_L0
+
+SUBROUTINE IO_WRITE_FIELD_NC4_L1(TPFILE,TPFIELD,PZCDF,OFIELD,KRESP)
+!
+USE MODD_PARAMETERS_ll,  ONLY : JPVEXT
+!
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
+TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+TYPE(IOCDF), POINTER              :: PZCDF
+LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD
+INTEGER,               INTENT(OUT):: KRESP
+!
+INTEGER, DIMENSION(SIZE(OFIELD))                         :: IFIELD
+INTEGER(KIND=IDCDF_KIND)                                 :: STATUS
+INTEGER(KIND=IDCDF_KIND)                                 :: INCID
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME))                     :: YVARNAME
+INTEGER(KIND=IDCDF_KIND)                                 :: IVARID
+INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(OFIELD))) :: IVDIMS
+INTEGER                                                  :: IRESP
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_WRITE_FIELD_NC4_L1','writing '//TRIM(TPFIELD%CMNHNAME))
+!
+IRESP = 0
+! Get the Netcdf file ID
+INCID = TPFILE%NNCID
+
+CALL CLEANMNHNAME(TPFIELD%CMNHNAME,YVARNAME)
+
+! The variable should not already exist but who knows ?
+STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF90_NOERR) THEN
+   IF (SIZE(OFIELD)==0) THEN
+     CALL PRINT_MSG(NVERB_INFO,'IO','IO_WRITE_FIELD_NC4_L1','ignoring variable with a zero size ('//TRIM(YVARNAME)//')')
+     RETURN
+   END IF
+
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, INT(SHAPE(OFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS)
+
+   ! Define the variable 
+   ! Use of NF90_INT1 datatype (=NF90_BYTE) that is enough to store a boolean
+   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_INT1, IVDIMS, IVARID)
+   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_DEF_VAR]')
+   CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID)
+ELSE
+   CALL PRINT_MSG(NVERB_WARNING,'IO','IO_WRITE_FIELD_NC4_L1',TRIM(YVARNAME)//' already defined')
+END IF
+
+!Convert LOGICAL to INTEGER (LOGICAL format not supported by netCDF files)
+WHERE (OFIELD)
+  IFIELD = 1
+ELSEWHERE
+  IFIELD = 0
+END WHERE
+
+! Write the data
+STATUS = NF90_PUT_VAR(INCID, IVARID, IFIELD)
+IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_L1[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE IO_WRITE_FIELD_NC4_L1
+
 SUBROUTINE NCWRITC0(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP)
 USE MODD_FM, ONLY : FMHEADER
 TYPE(IOCDF), POINTER              :: PZCDF