diff --git a/src/LIB/SURCOUCHE/src/fmreadwrit.f90 b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
index 83e6aa08584320e541e584c9fc82f43bca87b7ee..994a8c6d2644abac35253cf0f74d3cc49ac83ae7 100644
--- a/src/LIB/SURCOUCHE/src/fmreadwrit.f90
+++ b/src/LIB/SURCOUCHE/src/fmreadwrit.f90
@@ -13,6 +13,7 @@
 !-----------------------------------------------------------------
 
 MODULE MODD_FM
+USE MODD_IO_ll, ONLY : TFIELDDATA
 IMPLICIT NONE 
 
 INTEGER, PARAMETER :: JPXKRK = 100
@@ -251,3 +252,177 @@ KDEST(:) = KSOURCE(:)
 
 END SUBROUTINE TRANSFW
 
+
+MODULE MODE_READWRITE_LFI
+!
+USE MODD_FM
+USE MODD_IO_ll, ONLY : TFIELDDATA
+!
+IMPLICIT NONE
+!
+PRIVATE
+!
+INTERFACE IO_WRITE_FIELD_LFI
+   MODULE PROCEDURE IO_WRITE_FIELD_LFI_X2,IO_WRITE_FIELD_LFI_X3, &
+                    IO_WRITE_FIELD_LFI_N0
+END INTERFACE IO_WRITE_FIELD_LFI
+!
+PUBLIC IO_WRITE_FIELD_LFI
+!
+CONTAINS
+!
+SUBROUTINE IO_WRITE_FIELD_LFI_X2(TPFIELD,KFLU,PFIELD,KRESP,KVERTLEVEL)
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+INTEGER,               INTENT(IN) :: KFLU   ! Fortran Logical Unit
+REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD ! array containing the data field
+INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
+INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level splitted files)
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER                                  :: ILENG
+INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+CHARACTER(LEN=4)                         :: YSUFFIX
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4)   :: YVARNAME
+!
+ILENG = SIZE(PFIELD)
+IF (PRESENT(KVERTLEVEL)) THEN
+  WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
+  YVARNAME = TRIM(TPFIELD%CMNHNAME)//YSUFFIX
+ELSE
+  YVARNAME = TRIM(TPFIELD%CMNHNAME)
+ENDIF
+!
+CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP)
+!
+IF (IRESP==0) THEN
+  CALL TRANSFW(IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3),PFIELD,ILENG)
+  CALL LFIECR(IRESP,KFLU,YVARNAME,IWORK,ITOTAL)
+ENDIF
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_WRITE_FIELD_LFI_X2
+!
+SUBROUTINE IO_WRITE_FIELD_LFI_X3(TPFIELD,KFLU,PFIELD,KRESP)
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+INTEGER,                 INTENT(IN) :: KFLU   ! Fortran Logical Unit
+REAL,DIMENSION(:,:,:),   INTENT(IN) :: PFIELD ! array containing the data field
+INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER                                  :: ILENG
+INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+!
+ILENG = SIZE(PFIELD)
+!
+CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP)
+!
+IF (IRESP==0) THEN
+  CALL TRANSFW(IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3),PFIELD,ILENG)
+  CALL LFIECR(IRESP,KFLU,TPFIELD%CMNHNAME,IWORK,ITOTAL)
+ENDIF
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_WRITE_FIELD_LFI_X3
+!
+SUBROUTINE IO_WRITE_FIELD_LFI_N0(TPFIELD,KFLU,KFIELD,KRESP)
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+INTEGER,                 INTENT(IN) :: KFLU   ! Fortran Logical Unit
+INTEGER,                 INTENT(IN) :: KFIELD ! array containing the data field
+INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
+!
+!*      0.2   Declarations of local variables
+!
+INTEGER                                  :: ILENG
+INTEGER(kind=LFI_INT)                    :: IRESP, ITOTAL
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: IWORK
+!
+ILENG = 1
+!
+CALL WRITE_PREPARE(TPFIELD,ILENG,IWORK,ITOTAL,IRESP)
+!
+IF (IRESP==0) THEN
+  IWORK(LEN_TRIM(TPFIELD%CCOMMENT)+3)=KFIELD
+  CALL LFIECR(IRESP,KFLU,TPFIELD%CMNHNAME,IWORK,ITOTAL)
+ENDIF
+!
+KRESP=IRESP
+!
+IF (ALLOCATED(IWORK)) DEALLOCATE(IWORK)
+!
+END SUBROUTINE IO_WRITE_FIELD_LFI_N0
+!
+SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP)
+!
+TYPE(TFIELDDATA),                        INTENT(IN)    :: TPFIELD
+INTEGER,                                 INTENT(IN)    :: KLENG
+INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK
+INTEGER(kind=LFI_INT),                   INTENT(OUT)   :: KTOTAL
+INTEGER(kind=LFI_INT),                   INTENT(OUT)   :: KRESP
+!
+INTEGER                   :: ICOMLEN
+INTEGER                   :: J
+INTEGER,DIMENSION(JPXKRK) :: ICOMMENT
+!
+ICOMLEN = LEN_TRIM(TPFIELD%CCOMMENT)
+KRESP = 0
+!
+IF (KLENG.LE.0) THEN
+  KRESP=-40
+  RETURN
+ELSEIF (KLENG.GT.JPXFIE) THEN
+  KRESP=-43
+  RETURN
+ELSEIF ((TPFIELD%NGRID.LT.0).OR.(TPFIELD%NGRID.GT.8)) THEN
+  KRESP=-46
+  RETURN
+ENDIF
+!
+KTOTAL=KLENG+1+ICOMLEN+1
+ALLOCATE(KWORK(KTOTAL))
+!
+KWORK(1)=TPFIELD%NGRID
+!
+SELECT CASE (ICOMLEN)
+CASE(:-1)
+  KRESP=-55
+CASE(0)
+  KWORK(2)=ICOMLEN
+CASE(1:JPXKRK)
+  DO J=1,ICOMLEN
+    ICOMMENT(J)=ICHAR(TPFIELD%CCOMMENT(J:J))
+  ENDDO
+  KWORK(2)=ICOMLEN
+  KWORK(3:ICOMLEN+2)=ICOMMENT(1:ICOMLEN)
+CASE(JPXKRK+1:)
+  PRINT *,'ERROR: WRITE_PREPARE: comment is too long'
+  KRESP = -9999
+END SELECT
+!
+END SUBROUTINE WRITE_PREPARE
+!
+END MODULE MODE_READWRITE_LFI
diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 82aadc18a06658bd46838eeeb68104dc4567e061..19abe35f8240fc4a3545ff19ce2cbdeadf0050e3 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -171,6 +171,7 @@ MODULE MODE_FMWRIT
 #if defined(MNH_IOCDF4)
   USE MODE_NETCDF
 #endif
+  USE MODE_READWRITE_LFI
 
   IMPLICIT NONE 
 
@@ -969,7 +970,6 @@ CONTAINS
   SUBROUTINE IO_WRITE_FIELD_BYFIELD_X3(TPFILE,TPFIELD,HFIPRI,KRESP,PFIELD)
     USE MODD_IO_ll
     USE MODD_PARAMETERS_ll,ONLY : JPHEXT
-    USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
     USE MODE_GATHER_ll
@@ -999,17 +999,13 @@ CONTAINS
     CHARACTER(LEN=16)                        :: YRECFM   ! name of the article to write
     CHARACTER(LEN=2)                         :: YDIR     ! field form
     CHARACTER(LEN=JPFINL)                    :: YFNLFI
-    CHARACTER(LEN=100)                       :: YCOMMENT ! comment string
-    INTEGER                                  :: IGRID    ! C-grid indicator (u,v,w,T)
     INTEGER                                  :: IERR
     TYPE(FD_ll), POINTER                     :: TZFD
     INTEGER                                  :: IRESP
     REAL,DIMENSION(:,:,:),POINTER            :: ZFIELDP
-    TYPE(FMHEADER)                           :: TZFMH
     LOGICAL                                  :: GALLOC
     !JUAN
     INTEGER                                  :: JK,JKK
-    CHARACTER(LEN=LEN(YRECFM))               :: YK,YRECZSLIDE
     REAL,DIMENSION(:,:),POINTER              :: ZSLIDE_ll,ZSLIDE
     INTEGER                                  :: IK_FILE,IK_rank,inb_proc_real,JK_MAX
     CHARACTER(len=5)                         :: YK_FILE  
@@ -1040,8 +1036,6 @@ CONTAINS
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
     YDIR     = TPFIELD%CDIR
-    YCOMMENT = TPFIELD%CCOMMENT
-    IGRID    = TPFIELD%NGRID
     !
     !*      1.1   THE NAME OF LFIFM
     !
@@ -1056,22 +1050,19 @@ CONTAINS
     TZFD=>GETFD(YFNLFI)
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC .AND.  (TZFD%nb_procio.eq.1) ) THEN ! sequential execution
-          TZFMH%GRID=IGRID
-          TZFMH%COMLEN=LEN(YCOMMENT)
-          TZFMH%COMMENT=YCOMMENT
           !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN 
           IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN 
              ZFIELDP=>PFIELD(JPHEXT+1:JPHEXT+1,JPHEXT+1:JPHEXT+1,:)
-             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
-             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
              ZFIELDP=>PFIELD(:,JPHEXT+1:JPHEXT+1,:)
-             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
-             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
           ELSE
-             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
-             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,IRESP,PFIELD)
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,PFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,PFIELD,IRESP)
           END IF
        ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( YDIR == '--' ) ) THEN  ! multiprocessor execution & 1 proc IO
           ! write 3D field in 1 time = output for graphique
@@ -1093,13 +1084,9 @@ CONTAINS
           END IF
           !
           IF (ISP == TZFD%OWNER)  THEN
-             TZFMH%GRID=IGRID
-             TZFMH%COMLEN=LEN(YCOMMENT)
-             TZFMH%COMMENT=YCOMMENT
-             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
-                  & ,IRESP)
-             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,ZFIELDP,TZFMH,IRESP)
-       END IF
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,ZFIELDP,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,ZFIELDP,IRESP)
+          END IF
           !
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD&
                & %COMM,IERR)
@@ -1145,11 +1132,6 @@ CONTAINS
             !
             IF (ISP == IK_RANK )  THEN 
                CALL SECOND_MNH2(T0)
-               TZFMH%GRID=IGRID
-               TZFMH%COMLEN=LEN(YCOMMENT)
-               TZFMH%COMMENT=YCOMMENT
-               WRITE(YK,'(I4.4)')  JKK
-               YRECZSLIDE = TRIM(YRECFM)//YK
                !
                IF ( SIZE(ZSLIDE_ll) .EQ. 0 ) THEN
                   DEALLOCATE(ZSLIDE_ll)
@@ -1164,9 +1146,8 @@ CONTAINS
                CALL SECOND_MNH2(T1)
                TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0
                !
-               IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),&
-                    &ZSLIDE_ll,TZFMH,IRESP)
-               IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,YDIR,ZSLIDE_ll,TZFMH,IRESP)
+               IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK)
+               IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK)
                CALL SECOND_MNH2(T2)
                TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
             END IF
@@ -1284,14 +1265,8 @@ CONTAINS
                    CALL SECOND_MNH2(T1)
                    TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0
                    !JUANIOZ 
-                   TZFMH%GRID=IGRID
-                   TZFMH%COMLEN=LEN(YCOMMENT)
-                   TZFMH%COMMENT=YCOMMENT
-                   WRITE(YK,'(I4.4)')  JKK
-                   YRECZSLIDE = TRIM(YRECFM)//YK
-                   IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
-                        & ,IRESP)
-                   IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,YDIR,ZSLIDE_ll,TZFMH,IRESP)
+                   IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK)
+                   IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,ZSLIDE_ll,IRESP,KVERTLEVEL=JKK)
                    CALL SECOND_MNH2(T2)
                    TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
                 END IF
@@ -1322,7 +1297,7 @@ CONTAINS
     END IF
     !----------------------------------------------------------------
     IF (IRESP.NE.0) THEN
-       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X3",YFILEM,HFIPRI,YRECFM,YDIR,IGRID,LEN(YCOMMENT),IRESP)
+       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_X3",YFILEM,HFIPRI,YRECFM,YDIR,TPFIELD%NGRID,LEN(TPFIELD%CCOMMENT),IRESP)
     END IF
     IF (GALLOC) DEALLOCATE(ZFIELDP)
     IF (GALLOC_ll) DEALLOCATE(ZSLIDE_ll)
@@ -1747,29 +1722,16 @@ CONTAINS
     !
     !*      0.2   Declarations of local variables
     !
-    CHARACTER(LEN=28)                        :: YFILEM   ! FM-file name
-    CHARACTER(LEN=16)                        :: YRECFM   ! name of the article to write
-    CHARACTER(LEN=2)                         :: YDIR     ! field form
-    CHARACTER(LEN=JPFINL)                    :: YFNLFI
-    CHARACTER(LEN=100)                       :: YCOMMENT ! comment string
-    INTEGER                                  :: IGRID    ! C-grid indicator (u,v,w,T)
     INTEGER                      :: IERR
     TYPE(FD_ll), POINTER         :: TZFD
     INTEGER                      :: IRESP
-    TYPE(FMHEADER)               :: TZFMH
     !JUANZIO
-    INTEGER                                  :: IK_FILE,IK_rank
+    INTEGER                                  :: IK_FILE,IK_RANK
     CHARACTER(len=5)                         :: YK_FILE  
     CHARACTER(len=128)                       :: YFILE_IOZ  
     TYPE(FD_ll), POINTER                     :: TZFD_IOZ 
     INTEGER,DIMENSION(1) :: IDIMS
     !
-    YFILEM   = TPFILE%CNAME
-    YRECFM   = TPFIELD%CMNHNAME
-    YDIR     = TPFIELD%CDIR
-    YCOMMENT = TPFIELD%CCOMMENT
-    IGRID    = TPFIELD%NGRID
-    !
     IDIMS(1) = 0
     !
     !JUANZIO
@@ -1778,42 +1740,30 @@ CONTAINS
     !*      1.1   THE NAME OF LFIFM
     !
     IRESP = 0
-    YFNLFI=TRIM(ADJUSTL(YFILEM))//'.lfi'
-    !print * , ' Writing Article N0 ' , YRECFM
     !------------------------------------------------------------------
-    TZFD=>GETFD(YFNLFI)
+    TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
     IF (ASSOCIATED(TZFD)) THEN
        IF (GSMONOPROC) THEN ! sequential execution
-          TZFMH%GRID=IGRID
-          TZFMH%COMLEN=LEN(YCOMMENT)
-          TZFMH%COMMENT=YCOMMENT
-          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
-          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,IRESP,KFIELD)
+          IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,KFIELD,IRESP)
+          IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,KFIELD,IRESP)
        ELSE 
           IF (ISP == TZFD%OWNER)  THEN
-             TZFMH%GRID=IGRID
-             TZFMH%COMLEN=LEN(YCOMMENT)
-             TZFMH%COMMENT=YCOMMENT
-             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
-             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,YRECFM,YDIR,KFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD%FLU,KFIELD,IRESP)
+             IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD%CDF,KFIELD,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(YFILEM)//YK_FILE//".lfi"
+             YFILE_IOZ =  TRIM(TPFILE%CNAME)//YK_FILE//".lfi"
              TZFD_IOZ => GETFD(YFILE_IOZ)   
              IK_RANK = TZFD_IOZ%OWNER
              IF ( ISP == IK_RANK )  THEN
-                TZFMH%GRID=IGRID
-                TZFMH%COMLEN=LEN(YCOMMENT)
-                TZFMH%COMMENT=YCOMMENT
-                IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
-                IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECFM,YDIR,KFIELD,TZFMH,IRESP)
+                IF (LLFIOUT) CALL IO_WRITE_FIELD_LFI(TPFIELD,TZFD_IOZ%FLU,KFIELD,IRESP)
+                IF (LIOCDF4) CALL IO_WRITE_FIELD_NC4(TPFIELD,TZFD_IOZ%CDF,KFIELD,IRESP)
              END IF
           END DO
        ENDIF
@@ -1822,8 +1772,8 @@ CONTAINS
     END IF
     !----------------------------------------------------------------
     IF (IRESP.NE.0) THEN
-       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_N0",YFILEM,HFIPRI,YRECFM,YDIR,IGRID,LEN(YCOMMENT)&
-            & ,IRESP)
+       CALL FM_WRIT_ERR("IO_WRITE_FIELD_BYFIELD_N0",TPFILE%CNAME,HFIPRI,TPFIELD%CMNHNAME,TPFIELD%CDIR,TPFIELD%NGRID,&
+                        LEN(TPFIELD%CCOMMENT) ,IRESP)
     END IF
     KRESP = IRESP
   END SUBROUTINE IO_WRITE_FIELD_BYFIELD_N0
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 8b175f8de40d76fbb913d60375865fc3ff9c8d22..2598b7f305d83576f9c23f8b3d0a201b99091181 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -17,7 +17,8 @@ IMPLICIT NONE
 PRIVATE
 
 INTERFACE IO_WRITE_FIELD_NC4
-   MODULE PROCEDURE IO_WRITE_FIELD_NC4_X3, IO_WRITE_FIELD_NC4_N0
+   MODULE PROCEDURE IO_WRITE_FIELD_NC4_X2,IO_WRITE_FIELD_NC4_X3, &
+                    IO_WRITE_FIELD_NC4_N0
 END INTERFACE IO_WRITE_FIELD_NC4
 
 INTERFACE NCWRIT
@@ -139,7 +140,7 @@ END FUNCTION str_replace
 
 SUBROUTINE IO_WRITE_HEADER_NC4(TPFILE,HFIPRI)
 !
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: ISP,TFILEDATA
 !
 USE MODE_FD_ll
 !
@@ -153,8 +154,9 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR
 !
 TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
 !
-ISTATUS = NF90_PUT_ATT(TZFD%CDF%NCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
-IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
+IF (ISP == TZFD%OWNER)  THEN
+  ISTATUS = NF90_PUT_ATT(TZFD%CDF%NCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
+  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
 
 !title
 
@@ -167,7 +169,8 @@ IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADE
 !comment
 
 !references
-
+END IF
+!
 END SUBROUTINE IO_WRITE_HEADER_NC4
 
 SUBROUTINE WRITATTR(KNCID, KVARID, TPFMH)
@@ -544,6 +547,62 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF90_PUT_VAR
 KRESP = IRESP
 END SUBROUTINE NCWRITX2
 
+SUBROUTINE IO_WRITE_FIELD_NC4_X2(TPFIELD,PZCDF,PFIELD,KRESP,KVERTLEVEL)
+!
+USE MODD_FM, ONLY : FMHEADER
+USE MODD_IO_ll, ONLY : TFIELDDATA
+!
+TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+TYPE(IOCDF), POINTER              :: PZCDF
+REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
+INTEGER,               INTENT(OUT):: KRESP
+INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level splitted files)
+!
+INTEGER(KIND=IDCDF_KIND) :: STATUS
+INTEGER(KIND=IDCDF_KIND) :: INCID
+CHARACTER(LEN=4)         :: YSUFFIX
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)+4) :: YVARNAME
+INTEGER(KIND=IDCDF_KIND) :: IVARID
+INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER                  :: IRESP
+!
+IRESP = 0
+
+IF (PRESENT(KVERTLEVEL)) THEN
+  WRITE(YSUFFIX,'(I4.4)') KVERTLEVEL
+  YVARNAME = TRIM(TPFIELD%CMNHNAME)//YSUFFIX
+ELSE
+  YVARNAME = TRIM(TPFIELD%CMNHNAME)
+ENDIF
+
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(YVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF90_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, INT(SHAPE(PFIELD),KIND=IDCDF_KIND), TPFIELD%CDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF90_DEF_VAR(INCID, YVARNAME, NF90_DOUBLE, IVDIMS, IVARID)
+   IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_DEF_VAR]')
+   CALL IO_WRITE_FIELD_ATTR_NC4(TPFIELD,INCID,IVARID)
+ELSE
+   PRINT *,'IO_WRITE_FIELD_NC4_X2: ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF90_PUT_VAR(INCID, IVARID, PFIELD)
+IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'IO_WRITE_FIELD_NC4_X2[NF90_PUT_VAR] '//TRIM(TPFIELD%CMNHNAME),IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE IO_WRITE_FIELD_NC4_X2
+
 SUBROUTINE NCWRITX3(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
 USE MODD_FM, ONLY : FMHEADER
 TYPE(IOCDF), POINTER              :: PZCDF
@@ -555,7 +614,7 @@ INTEGER,               INTENT(OUT):: KRESP
 
 INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
-CHARACTER(LEN=30)     :: YVARNAME
+CHARACTER(LEN=30)        :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
 INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
 INTEGER               :: IRESP
@@ -589,21 +648,21 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF90_PUT_VAR
 KRESP = IRESP
 END SUBROUTINE NCWRITX3
 
-SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFIELD,PZCDF,KRESP,PFIELD)
+SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFIELD,PZCDF,PFIELD,KRESP)
 !
 USE MODD_FM, ONLY : FMHEADER
 USE MODD_IO_ll, ONLY : TFIELDDATA
 !
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
-INTEGER,               INTENT(OUT):: KRESP
 REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
+INTEGER,               INTENT(OUT):: KRESP
 !
 INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
-CHARACTER(LEN=30)        :: YVARNAME
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
-INTEGER(KIND=IDCDF_KIND), DIMENSION(3) :: IVDIMS
+INTEGER(KIND=IDCDF_KIND), DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
 INTEGER                  :: IRESP
 !
 IRESP = 0
@@ -832,7 +891,7 @@ IF (YVARNAME == 'KMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMZ)) PZCDF%DIMZ=>GETDIMCDF
 KRESP = IRESP
 END SUBROUTINE NCWRITN0
 
-SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFIELD,PZCDF,KRESP,KFIELD)
+SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFIELD,PZCDF,KFIELD,KRESP)
 !
 USE MODD_FM, ONLY : FMHEADER
 USE MODD_IO_ll, ONLY : TFIELDDATA
@@ -844,12 +903,12 @@ USE MODD_IO_ll, ONLY : LPACK,L1D,L2D
 !
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
-INTEGER,               INTENT(OUT):: KRESP
 INTEGER,               INTENT(IN) :: KFIELD
+INTEGER,               INTENT(OUT):: KRESP
 !
 INTEGER(KIND=IDCDF_KIND) :: STATUS
 INTEGER(KIND=IDCDF_KIND) :: INCID
-CHARACTER(LEN=30)        :: YVARNAME
+CHARACTER(LEN=LEN(TPFIELD%CMNHNAME)) :: YVARNAME
 INTEGER(KIND=IDCDF_KIND) :: IVARID
 INTEGER                  :: IRESP
 !