diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index 0661659d9c6c7d195d20f3623599653809a737aa..23bc578526ca6a0613a6fa7fb79b10bd6b8828fc 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -1,6 +1,8 @@
 program LFI2CDF
   USE MODD_CONF,  ONLY: CPROGRAM
+  USE MODD_TIMEZ, ONLY: TIMEZ
 
+  USE MODE_FIELD,  ONLY: INI_FIELD_LIST
   USE MODE_IO_ll,  ONLY: INITIO_ll, SET_CONFIO_ll
   USE mode_options
   USE mode_util
@@ -30,6 +32,9 @@ program LFI2CDF
 
   CALL INITIO_ll()
   CALL VERSION
+  CALL INI_CST
+
+  ALLOCATE(TIMEZ) !Used by IO_WRITE_FIELD
 
   call read_commandline(options,hinfile,houtfile,runmode)
 
@@ -50,6 +55,8 @@ program LFI2CDF
      CALL SET_CONFIO_ll()
   END IF
 
+  CALL INI_FIELD_LIST(1)
+
   CALL OPEN_FILES(infiles, outfiles, hinfile, houtfile, nbvar_infile, options, runmode)
   IF (options(OPTLIST)%set) STOP
 
@@ -80,7 +87,7 @@ program LFI2CDF
 
   IF (runmode == MODELFI2CDF) THEN
      ! Conversion LFI -> NetCDF
-     
+
      !Standard treatment (one LFI file only)
      IF (.not.options(OPTMERGE)%set) THEN
        CALL parse_infiles(infiles,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,ibuflen,options)
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90
index 84051bd676b3f908ab9d64c62f1f2467b3a44da8..c346d34c6936f6ab665ae6fc2b4096e9aa3d2ea5 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_options.f90
@@ -1,8 +1,9 @@
 module mode_options
+  USE MODE_FIELD, ONLY: TYPEUNDEF, TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE
+
   implicit none
 
   integer,parameter :: nbavailoptions = 8
-  integer,parameter :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4
   integer,parameter :: MODEUNDEF = -11, MODECDF2CDF = 11, MODELFI2CDF = 12, MODECDF2LFI = 13
 
   integer,parameter :: OPTCOMPRESS = 1, OPTHELP   = 2, OPTLIST   = 3
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index c967a7961275d7a20dc649038517033ea4343a93..1e3e440274c6a88cb4053db4a71c71b506d9c8ec 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -3,9 +3,11 @@ MODULE mode_util
   USE MODD_PARAM
 
   USE mode_dimlist
+  USE MODE_FIELD
   USE MODE_FIELDTYPE
+  USE MODE_FMREAD
+  USE MODE_FMWRIT
   USE mode_options
-
   USE netcdf
 
   IMPLICIT NONE 
@@ -59,6 +61,8 @@ MODULE mode_util
   LOGICAL(KIND=LFI_INT), PARAMETER :: ltrue  = .TRUE.
   LOGICAL(KIND=LFI_INT), PARAMETER :: lfalse = .FALSE.
 
+  CHARACTER(LEN=6) :: CPROGRAM_ORIG
+
 CONTAINS 
   FUNCTION str_replace(hstr, hold, hnew)
     CHARACTER(LEN=*) :: hstr, hold, hnew
@@ -75,31 +79,10 @@ CONTAINS
 
   END FUNCTION str_replace
 
-  SUBROUTINE FMREADLFIN1(klu,hrecfm,kval,kresp)
-  INTEGER(KIND=LFI_INT), INTENT(IN) :: klu ! logical fortran unit au lfi file
-  CHARACTER(LEN=*),INTENT(IN)       :: hrecfm ! article name to be read
-  INTEGER, INTENT(OUT)        :: kval ! integer value for hrecfm article
-  INTEGER(KIND=LFI_INT), INTENT(OUT):: kresp! return code null if OK
-  !
-  INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE::iwork
-  INTEGER :: icomlen
-  INTEGER(KIND=LFI_INT) :: iresp,ilenga,iposex
-  !
-  CALL LFINFO(iresp,klu,hrecfm,ilenga,iposex)
-  IF (iresp /=0 .OR. ilenga == 0) THEN
-    kresp = -1
-    kval = 0
-  ELSE
-    ALLOCATE(IWORK(ilenga))
-    CALL LFILEC(iresp,klu,hrecfm,iwork,ilenga)
-    icomlen = iwork(2)
-    kval = iwork(3+icomlen)
-    kresp = iresp
-    DEALLOCATE(IWORK)
-  END IF
-  END SUBROUTINE FMREADLFIN1
-
   SUBROUTINE parse_infiles(infiles, nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw, tpreclist, kbuflen, options, icurrent_level)
+    USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
+    USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT
+
     TYPE(filelist_struct),      INTENT(IN) :: infiles
     INTEGER,                    INTENT(IN) :: nbvar_infile, nbvar_tbr, nbvar_calc, nbvar_tbw
     TYPE(workfield), DIMENSION(:), POINTER :: tpreclist
@@ -118,27 +101,18 @@ CONTAINS
 #ifdef LOWMEM
     INTEGER(KIND=8),DIMENSION(:),ALLOCATABLE :: iwork
 #endif
-    INTEGER(KIND=LFI_INT)                    :: iresp,ilu,ileng,ipos
+    INTEGER                                  :: IID, IRESP
+    INTEGER(KIND=LFI_INT)                    :: iresp2,ilu,ileng,ipos
     CHARACTER(LEN=FM_FIELD_SIZE)             :: var_calc
     CHARACTER(LEN=FM_FIELD_SIZE),dimension(MAXRAW) :: var_raw
     INTEGER, DIMENSION(10)                   :: idim_id
-    INTEGER                                  :: JPHEXT
 
     IF (infiles%files(1)%format == LFI_FORMAT) THEN
       ilu = infiles%files(1)%lun_id
-      CALL FMREADLFIN1(ilu,'JPHEXT',JPHEXT,iresp)
-      IF (iresp /= 0) JPHEXT=1
-
-      ! First check if IMAX,JMAX,KMAX exist in LFI file
-      ! to handle 3D, 2D variables -> update IDIMX,IDIMY,IDIMZ
-      CALL FMREADLFIN1(ilu,'IMAX',IDIMX,iresp)
-      IF (iresp == 0) IDIMX = IDIMX+2*JPHEXT  ! IMAX + 2*JPHEXT
-       !
-      CALL FMREADLFIN1(ilu,'JMAX',IDIMY,iresp)
-      IF (iresp == 0) IDIMY = IDIMY+2*JPHEXT  ! JMAX + 2*JPHEXT
-      !
-      CALL FMREADLFIN1(ilu,'KMAX',IDIMZ,iresp)
-      IF (iresp == 0) IDIMZ = IDIMZ+2  ! KMAX + 2*JPVEXT
+      ! update IDIMX,IDIMY,IDIMZ
+      IDIMX = NIMAX_ll+2*JPHEXT
+      IDIMY = NJMAX_ll+2*JPHEXT
+      IDIMZ = NKMAX   +2*JPVEXT
     ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
       kcdf_id = infiles%files(1)%lun_id
 
@@ -255,8 +229,8 @@ CONTAINS
 
           yrecfm = TRIM(tpreclist(ji)%name)
           IF (infiles%files(1)%format == LFI_FORMAT) THEN
-            CALL LFINFO(iresp,ilu,trim(yrecfm)//trim(suffix),ileng,ipos)
-            IF (iresp == 0 .AND. ileng /= 0) tpreclist(ji)%found = .true.
+            CALL LFINFO(iresp2,ilu,trim(yrecfm)//trim(suffix),ileng,ipos)
+            IF (iresp2 == 0 .AND. ileng /= 0) tpreclist(ji)%found = .true.
             leng = ileng
           ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
             status = NF90_INQ_VARID(kcdf_id,trim(yrecfm)//trim(suffix),tpreclist(ji)%id_in)
@@ -309,6 +283,7 @@ END DO
 #ifndef LOWMEM
        IF(.NOT.ALLOCATED(lfiart) .AND. infiles%files(1)%format == LFI_FORMAT) ALLOCATE(lfiart(nbvar_infile))
 #endif
+print *,'PW: nbvar_infile=',nbvar_infile
        ALLOCATE(tpreclist(nbvar_infile))
        DO ji=1,nbvar_infile
          tpreclist(ji)%calc   = .FALSE. !By default variables are not computed from others
@@ -317,11 +292,11 @@ END DO
        END DO
 
        IF (infiles%files(1)%format == LFI_FORMAT) THEN
-         CALL LFIPOS(iresp,ilu)
+         CALL LFIPOS(iresp2,ilu)
          ladvan = .TRUE.
 
          DO ji=1,nbvar_infile
-           CALL LFICAS(iresp,ilu,yrecfm,ileng,ipos,ladvan)
+           CALL LFICAS(iresp2,ilu,yrecfm,ileng,ipos,ladvan)
            ! PRINT *,'Article ',ji,' : ',TRIM(yrecfm),', longueur = ',ileng
            tpreclist(ji)%name = trim(yrecfm)
            tpreclist(ji)%found  = .TRUE.
@@ -376,13 +351,13 @@ END DO
 
        IF (infiles%files(1)%format == LFI_FORMAT) THEN
          yrecfm = trim(tpreclist(ji)%name)//trim(suffix)
-         CALL LFINFO(iresp,ilu,yrecfm,ileng,ipos)
+         CALL LFINFO(iresp2,ilu,yrecfm,ileng,ipos)
 #ifdef LOWMEM
-         CALL LFILEC(iresp,ilu,yrecfm,iwork,ileng)
+         CALL LFILEC(iresp2,ilu,yrecfm,iwork,ileng)
          tpreclist(ji)%grid = iwork(1)
          comment_size = iwork(2)
 #else
-         CALL LFILEC(iresp,ilu,yrecfm,lfiart(ji)%iwtab,ileng)
+         CALL LFILEC(iresp2,ilu,yrecfm,lfiart(ji)%iwtab,ileng)
          tpreclist(ji)%grid = lfiart(ji)%iwtab(1)
          comment_size = lfiart(ji)%iwtab(2)
 #endif
@@ -699,6 +674,7 @@ END DO
     INTEGER                                  :: status
     INTEGER                                  :: extent, ndims
     INTEGER                                  :: ich
+    INTEGER                                  :: IID, IRESP2
     INTEGER                                  :: src
     INTEGER                                  :: level
     INTEGER(KIND=LFI_INT)                    :: iresp,ilu,ileng,ipos
@@ -1171,6 +1147,13 @@ END DO
   END SUBROUTINE UPDATE_VARID_IN
 
   SUBROUTINE OPEN_FILES(infiles,outfiles,hinfile,houtfile,nbvar_infile,options,runmode)
+    USE MODD_CONF,          ONLY: LCARTESIAN
+    USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
+    USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
+    USE MODD_GRID,          ONLY: XBETA, XRPK, XLAT0, XLON0, XLATORI, XLONORI
+    USE MODD_GRID_n,        ONLY: LSLEVE, XXHAT, XYHAT, XZHAT
+    USE MODD_PARAMETERS_ll, ONLY: JPHEXT, JPVEXT
+
     USE MODE_FM,               ONLY: IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll
     USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
     TYPE(filelist_struct),INTENT(OUT) :: infiles, outfiles
@@ -1180,8 +1163,9 @@ END DO
     TYPE(option),DIMENSION(:),INTENT(IN) :: options
     INTEGER         , INTENT(IN)  :: runmode
 
+    INTEGER                     :: IRESP
     INTEGER                     :: extindex
-    INTEGER(KIND=LFI_INT)       :: ilu,iresp,iverb,inap,inaf
+    INTEGER(KIND=LFI_INT)       :: ilu,iresp2,iverb,inap,inaf
     INTEGER                     :: idx,status
     CHARACTER(LEN=4)            :: ypextsrc, ypextdest
     LOGICAL                     :: fexist
@@ -1204,22 +1188,65 @@ END DO
        ilu = infiles%files(idx)%lun_id
        infiles%files(idx)%opened  = .TRUE.
 
-       nbvar_infile = inaf
+       nbvar_infile = INFILES%TFILES(idx)%TFILE%NLFININAR
 
        IF (options(OPTLIST)%set) THEN
-          CALL LFILAF(iresp,ilu,lfalse)
+          CALL LFILAF(iresp2,ilu,lfalse)
           CALL IO_FILE_CLOSE_ll(INFILES%TFILES(idx)%TFILE)
           return
        END IF
 
+       !Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll for netCDF files)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP)
+       IF(IRESP/=0) JPVEXT=1
+       !
+       ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JMAX',NJMAX_ll)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'KMAX',NKMAX)
+       !
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'PROGRAM',CPROGRAM_ORIG)
+       !
+       ALLOCATE(CSTORAGE_TYPE)
+       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE)
+       !
+       IF ( TRIM(CPROGRAM_ORIG)/='PGD' &
+         .AND. .NOT.(TRIM(CPROGRAM_ORIG)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX
+         ALLOCATE(XXHAT(NIMAX_ll+2*JPHEXT))
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'XHAT',XXHAT)
+         ALLOCATE(XYHAT(NJMAX_ll+2*JPHEXT))
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'YHAT',XYHAT)
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'CARTESIAN',LCARTESIAN)
+         !
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LAT0',XLAT0)
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LON0',XLON0)
+         CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'BETA',XBETA)
+         !
+         IF (.NOT.LCARTESIAN) THEN
+           CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'RPK',   XRPK)
+           CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LATORI',XLATORI)
+           CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'LONORI',XLONORI)
+         ENDIF
+         !
+         IF (TRIM(CPROGRAM_ORIG)/='NESPGD') THEN
+           ALLOCATE(XZHAT(NKMAX+2*JPVEXT))
+           CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'ZHAT',XZHAT)
+           ALLOCATE(LSLEVE)
+           CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'SLEVE',LSLEVE)
+         END IF
+       END IF
+
        IF (.NOT.options(OPTSPLIT)%set) THEN
          outfiles%nbfiles = outfiles%nbfiles + 1
 
          idx = outfiles%nbfiles
+         CALL IO_FILE_ADD2LIST(OUTFILES%TFILES(idx)%TFILE,HOUTFILE,'UNKNOWN','WRITE', &
+                               HFORMAT='NETCDF4')
+         CALL IO_FILE_OPEN_ll(OUTFILES%TFILES(idx)%TFILE,HPROGRAM_ORIG=CPROGRAM_ORIG)
+         outfiles%files(idx)%lun_id = OUTFILES%TFILES(idx)%TFILE%NNCID
          outfiles%files(idx)%format = NETCDF_FORMAT
          outfiles%files(idx)%status = WRITING
-         status = NF90_CREATE(TRIM(houtfile)//'.nc', IOR(NF90_CLOBBER,NF90_NETCDF4), outfiles%files(idx)%lun_id)
-         IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
          outfiles%files(idx)%opened  = .TRUE.
 
          status = NF90_SET_FILL(outfiles%files(idx)%lun_id,NF90_NOFILL,omode)
@@ -1282,7 +1309,7 @@ END DO
        outfiles%files(idx)%format = LFI_FORMAT
        outfiles%files(idx)%status = WRITING
        ilu = outfiles%files(idx)%lun_id
-       CALL LFIOUV(iresp,ilu,ltrue,TRIM(houtfile)//'.lfi','NEW' ,lfalse,lfalse,iverb,inap,inaf)
+       CALL LFIOUV(iresp2,ilu,ltrue,TRIM(houtfile)//'.lfi','NEW' ,lfalse,lfalse,iverb,inap,inaf)
        outfiles%files(idx)%opened  = .TRUE.
     END IF