diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 4d4fd98dcf7090b79279cb4f7c555fadaeaf3033..cd955daff69b2bd550d9396392a93cb12d1af373 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -13,6 +13,9 @@
 !-----------------------------------------------------------------
 
 MODULE MODD_IO_ll
+!
+USE MODD_NETCDF, ONLY: IDCDF_KIND
+!
 IMPLICIT NONE 
 !
 !
@@ -61,6 +64,12 @@ TYPE TFILEDATA
   INTEGER :: NLFINPRAR = 0  !Number of predicted articles of the LFI file (non crucial)
   INTEGER :: NLFITYPE  = -1 !Type of the file (used to generate list of files to transfers)
   INTEGER :: NLFIVERB  = 1  !LFI verbosity level
+  INTEGER :: NLFIFLU   = -1 !File identifier
+  !
+  ! Fields for netCDF files
+  INTEGER(KIND=IDCDF_KIND) :: NNCID = -1 !File identifier
+  LOGICAL                  :: LNCREDUCE_FLOAT_PRECISION = .FALSE. ! Reduce the precision of floats to single precision
+                                                                  ! instead of double precision (for netCDF)
   !
   TYPE(TFILEDATA),POINTER :: TFILE_PREV => NULL()
   TYPE(TFILEDATA),POINTER :: TFILE_NEXT => NULL()
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 7158dbefd36ab276706857bdbb27c6dac6e8afaa..a04d04e3f33451ed30fb78b2f974391f535e8a66 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -132,13 +132,15 @@ END SUBROUTINE FMLOOK_ll
 
 SUBROUTINE IO_FILE_OPEN_ll(TPFILE,HFIPRI,KRESP)
 !
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: LIOCDF4,TFILEDATA
+USE MODE_FD_ll, ONLY: FD_ll,GETFD
 !
 TYPE(TFILEDATA),  INTENT(INOUT) :: TPFILE ! File structure
 CHARACTER(LEN=*), INTENT(IN)    :: HFIPRI ! File for prints in FM
 INTEGER,          INTENT(OUT)   :: KRESP  ! Return code
 !
 INTEGER :: ININAR ! Number of articles present in LFI file (unused here)
+TYPE(FD_ll), POINTER  :: TZFDLFI
 !
 IF (TPFILE%LOPENED) THEN
   PRINT *,'ERROR: IO_FILE_OPEN_ll: file ',TRIM(TPFILE%CNAME),' already opened'
@@ -151,6 +153,9 @@ CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE
 TPFILE%LOPENED = .TRUE.
 TPFILE%NOPEN   = TPFILE%NOPEN + 1
 !
+TZFDLFI=>GETFD(ADJUSTL(TRIM(TPFILE%CNAME)//'.lfi'))
+IF (LIOCDF4) TPFILE%NNCID = TZFDLFI%CDF%NCID
+!
 END SUBROUTINE IO_FILE_OPEN_ll
 
 SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR&
@@ -393,6 +398,7 @@ CALL FMCLOS_ll(TPFILE%CNAME,'KEEP',HFIPRI,KRESP,TPFILE=TPFILE)
 !
 TPFILE%LOPENED = .FALSE.
 TPFILE%NCLOSE  = TPFILE%NCLOSE + 1
+TPFILE%NNCID   = -1
 !
 END SUBROUTINE IO_FILE_CLOSE_ll
 
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 6e3014f00c38f7c836b33ab18f9127d7ad2529ae..0f806e5be7dcfe6ef75635964e438b31f8c266a4 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -11,6 +11,7 @@
 MODULE MODE_NETCDF
 USE MODD_NETCDF
 USE NETCDF
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODE_FIELD, ONLY : TFIELDDATA
 
 IMPLICIT NONE 
@@ -157,7 +158,7 @@ IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETUR
 TZFD=>GETFD(TRIM(ADJUSTL(TPFILE%CNAME))//'.lfi')
 !
 IF (ISP == TZFD%OWNER)  THEN
-  ISTATUS = NF90_PUT_ATT(TZFD%CDF%NCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
+  ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'Conventions', 'CF-1.6')
   IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_FILE_WRITE_HEADER[NF90_PUT_ATT]')
 
 !title
@@ -547,10 +548,11 @@ 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)
+SUBROUTINE IO_WRITE_FIELD_NC4_X2(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP,KVERTLEVEL)
 !
 USE MODD_FM, ONLY : FMHEADER
 !
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
@@ -575,7 +577,7 @@ ELSE
 ENDIF
 
 ! Get the Netcdf file ID
-INCID = PZCDF%NCID
+INCID = TPFILE%NNCID
 
 ! NetCDF var names can't contain '%' nor '.' 
 YVARNAME = str_replace(YVARNAME, '%', '__')
@@ -647,10 +649,11 @@ 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,PFIELD,KRESP)
+SUBROUTINE IO_WRITE_FIELD_NC4_X3(TPFILE,TPFIELD,PZCDF,PFIELD,KRESP)
 !
 USE MODD_FM, ONLY : FMHEADER
 !
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
 REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
@@ -665,7 +668,7 @@ INTEGER                  :: IRESP
 !
 IRESP = 0
 ! Get the Netcdf file ID
-INCID = PZCDF%NCID
+INCID = TPFILE%NNCID
 
 ! NetCDF var names can't contain '%' nor '.' 
 YVARNAME = str_replace(TPFIELD%CMNHNAME, '%', '__')
@@ -889,7 +892,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,KFIELD,KRESP)
+SUBROUTINE IO_WRITE_FIELD_NC4_N0(TPFILE,TPFIELD,PZCDF,KFIELD,KRESP)
 !
 USE MODD_FM, ONLY : FMHEADER
 USE MODD_PARAMETERS_ll,  ONLY : JPVEXT
@@ -898,6 +901,7 @@ USE MODD_PARAMETERS_ll,  ONLY : JPHEXT, JPVEXT
 USE MODD_IO_ll, ONLY : LPACK,L1D,L2D
 #endif
 !
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
 INTEGER,               INTENT(IN) :: KFIELD
@@ -911,7 +915,7 @@ INTEGER                  :: IRESP
 !
 IRESP = 0
 ! Get the Netcdf file ID
-INCID = PZCDF%NCID
+INCID = TPFILE%NNCID
 
 ! NetCDF var names can't contain '%' nor '.' 
 YVARNAME = str_replace(TPFIELD%CMNHNAME, '%', '__')
@@ -1103,10 +1107,11 @@ IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC0[NF90_PUT_VAR
 KRESP = IRESP
 END SUBROUTINE NCWRITC0
 
-SUBROUTINE IO_WRITE_FIELD_NC4_C0(TPFIELD,PZCDF,HFIELD,KRESP)
+SUBROUTINE IO_WRITE_FIELD_NC4_C0(TPFILE,TPFIELD,PZCDF,HFIELD,KRESP)
 !
 USE MODD_FM, ONLY : FMHEADER
 !
+TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
 TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
 TYPE(IOCDF), POINTER              :: PZCDF
 CHARACTER(LEN=*),      INTENT(IN) :: HFIELD
@@ -1131,7 +1136,7 @@ IF (MOD(ILEN,IMULT)/=0) PRINT *,'ERROR: IO_WRITE_FIELD_NC4_C0: ILEN is not a mul
 IF (ILEN==0) ILEN = IMULT
 
 ! Get the Netcdf file ID
-INCID = PZCDF%NCID
+INCID = TPFILE%NNCID
 
 ! NetCDF var names can't contain '%' nor '.' 
 YVARNAME = str_replace(TPFIELD%CMNHNAME, '%', '__')