diff --git a/src/MNH/ini_deep_convection.f90 b/src/MNH/ini_deep_convection.f90
index d3e9e033ed0ca7c9a9c0d944cc96899cdc6b80db..056f1ce8168857a9029aeb8372f7bd034951b31d 100644
--- a/src/MNH/ini_deep_convection.f90
+++ b/src/MNH/ini_deep_convection.f90
@@ -8,18 +8,19 @@
 !
 INTERFACE
 !
-      SUBROUTINE INI_DEEP_CONVECTION(HINIFILE,HLUOUT,OINIDCONV,TPDTCUR,        &
-                                     KCOUNTCONV,PDTHCONV,PDRVCONV,PDRCCONV,    &
-                                     PDRICONV,PPRCONV,PPRSCONV,PPACCONV,       &
-                                     PUMFCONV,PDMFCONV,PMFCONV,PPRLFLXCONV,PPRSFLXCONV,&
-                                     PCAPE,KCLTOPCONV,KCLBASCONV,              &
-                                     TPDTDCONV, HGETSVCONV, PDSVCONV,          &
-                                     OCH_CONV_LINOX, PIC_RATE, PCG_RATE,       &
-                                     PIC_TOTAL_NUMBER, PCG_TOTAL_NUMBER        )
-!
+      SUBROUTINE INI_DEEP_CONVECTION(TPINIFILE,HLUOUT,OINIDCONV,TPDTCUR,                &
+                                     KCOUNTCONV,PDTHCONV,PDRVCONV,PDRCCONV,             &
+                                     PDRICONV,PPRCONV,PPRSCONV,PPACCONV,                &
+                                     PUMFCONV,PDMFCONV,PMFCONV,PPRLFLXCONV,PPRSFLXCONV, &
+                                     PCAPE,KCLTOPCONV,KCLBASCONV,                       &
+                                     TPDTDCONV, HGETSVCONV, PDSVCONV,                   &
+                                     OCH_CONV_LINOX, PIC_RATE, PCG_RATE,                &
+                                     PIC_TOTAL_NUMBER, PCG_TOTAL_NUMBER                 )
+!
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_TIME
 !
-CHARACTER (LEN=*),      INTENT(IN) :: HINIFILE  ! Name of the initial file
+TYPE(TFILEDATA),        INTENT(IN) :: TPINIFILE ! Initial file
 CHARACTER (LEN=*),      INTENT(IN) :: HLUOUT    ! name for output-listing
                                                 !  of nested models
 LOGICAL,                INTENT(IN) :: OINIDCONV ! switch to initialize or read
@@ -60,16 +61,16 @@ END SUBROUTINE INI_DEEP_CONVECTION
 END INTERFACE
 !
 END MODULE MODI_INI_DEEP_CONVECTION
-!     ##########################################################################
-      SUBROUTINE INI_DEEP_CONVECTION(HINIFILE,HLUOUT,OINIDCONV,TPDTCUR,        &
-                                     KCOUNTCONV,PDTHCONV,PDRVCONV,PDRCCONV,    &
-                                     PDRICONV,PPRCONV,PPRSCONV,PPACCONV,       &
-                                     PUMFCONV,PDMFCONV,PMFCONV,PPRLFLXCONV,PPRSFLXCONV,&
-                                     PCAPE,KCLTOPCONV,KCLBASCONV,              &
-                                     TPDTDCONV, HGETSVCONV, PDSVCONV,          &
-                                     OCH_CONV_LINOX, PIC_RATE, PCG_RATE,       &
-                                     PIC_TOTAL_NUMBER, PCG_TOTAL_NUMBER        )
-!     ##########################################################################
+!     ###################################################################################
+      SUBROUTINE INI_DEEP_CONVECTION(TPINIFILE,HLUOUT,OINIDCONV,TPDTCUR,                &
+                                     KCOUNTCONV,PDTHCONV,PDRVCONV,PDRCCONV,             &
+                                     PDRICONV,PPRCONV,PPRSCONV,PPACCONV,                &
+                                     PUMFCONV,PDMFCONV,PMFCONV,PPRLFLXCONV,PPRSFLXCONV, &
+                                     PCAPE,KCLTOPCONV,KCLBASCONV,                       &
+                                     TPDTDCONV, HGETSVCONV, PDSVCONV,                   &
+                                     OCH_CONV_LINOX, PIC_RATE, PCG_RATE,                &
+                                     PIC_TOTAL_NUMBER, PCG_TOTAL_NUMBER                 )
+!     ###################################################################################
 !
 !!**** Routine to initialize the convective tendencies and the
 !!     convective counter
@@ -113,6 +114,7 @@ END MODULE MODI_INI_DEEP_CONVECTION
 !*       0.    DECLARATIONS
 !              ------------
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_TIME
 USE MODD_CONVPAR
 USE MODD_CH_M9_n,         ONLY: CNAMES
@@ -129,15 +131,15 @@ USE MODD_CH_AEROSOL, ONLY : CAERONAMES
 USE MODD_DUST, ONLY : CDUSTNAMES
 USE MODD_SALT, ONLY : CSALTNAMES
 !
+USE MODE_FIELD
 USE MODE_FM
-!
 USE MODE_FMREAD
 !
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
-CHARACTER (LEN=*),      INTENT(IN) :: HINIFILE  ! Name of the initial file
+TYPE(TFILEDATA),        INTENT(IN) :: TPINIFILE ! Initial file
 CHARACTER (LEN=*),      INTENT(IN) :: HLUOUT    ! name for output-listing
                                                 !  of nested models
 LOGICAL,                INTENT(IN) :: OINIDCONV ! switch to initialize or read
@@ -178,16 +180,13 @@ REAL, DIMENSION(:,:),   INTENT(INOUT) :: PCG_TOTAL_NUMBER ! Total number of CG
 !*       0.2   declarations of local variables
 !
 !
-INTEGER                :: ILUOUT
-INTEGER                :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=16)     :: YRECFM                    ! management
-CHARACTER (LEN=100)    :: YCOMMENT                  ! variables  
-INTEGER                :: JSV                       ! number of tracers
+INTEGER          :: IID
+INTEGER          :: IRESP
+INTEGER          :: JSV     ! number of tracers
+TYPE(TFIELDDATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
-CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
-!
 !*       1. INITIALIZE CONSTANTS USED IN DEEP CONVECTION PARAMETERIZATION
 !	        -------------------------------------------------------------
 !
@@ -226,181 +225,113 @@ IF ( OINIDCONV ) THEN
 !
 ELSE
 !
-  YRECFM='DTDCONV' 
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',TPDTDCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'COUNTCONV'
-  YCOMMENT    = 'X_Y_COUNTCONV'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',KCOUNTCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'DTHCONV'
-  YCOMMENT    = 'X_Y_Z_DTHCONV (K/S)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDTHCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'DRVCONV'
-  YCOMMENT    = 'X_Y_Z_DRVCONV (1/S)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDRVCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'DRCCONV'
-  YCOMMENT    = 'X_Y_Z_DRCCONV (1/S)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDRCCONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'DRICONV'
-  YCOMMENT    = 'X_Y_Z_DRICONV (1/S)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDRICONV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!
-  YRECFM      = 'PRCONV'
-  YCOMMENT    = 'X_Y_PRCONV (MM/H)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PPRCONV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'DTDCONV',  TPDTDCONV)
+  CALL IO_READ_FIELD(TPINIFILE,'COUNTCONV',KCOUNTCONV)
+  CALL IO_READ_FIELD(TPINIFILE,'DTHCONV',  PDTHCONV)
+  CALL IO_READ_FIELD(TPINIFILE,'DRVCONV',  PDRVCONV)
+  CALL IO_READ_FIELD(TPINIFILE,'DRCCONV',  PDRCCONV)
+  CALL IO_READ_FIELD(TPINIFILE,'DRICONV',  PDRICONV)
+!
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
+  TZFIELD%CUNITS = 'mm hour-1'
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PPRCONV)
   PPRCONV=PPRCONV/(1000.*3600.) ! conversion into m/s units
 !
-!
-  YRECFM      = 'PRSCONV'
-  YCOMMENT    = 'X_Y_PRSCONV (MM/H)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PPRSCONV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
+  TZFIELD%CUNITS = 'mm hour-1'
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PPRSCONV)
   PPRSCONV=PPRSCONV/(1000.*3600.) ! conversion into m/s units
 !
-!
-  YRECFM      = 'PACCONV'
-  YCOMMENT    = 'X_Y_PACCONV (MM)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PPACCONV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
+  TZFIELD%CUNITS = 'mm'
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PPACCONV)
   PPACCONV=PPACCONV/1000.       ! conversion into m unit
 !
   IF ( OCH_CONV_LINOX ) THEN
-    YRECFM      = 'IC_RATE'
-    YCOMMENT    = 'X_Y_IC_RATE (/s)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PIC_RATE,IGRID,ILENCH, &
-                                                          YCOMMENT,IRESP)
-!
-!
-    YRECFM      = 'CG_RATE'
-    YCOMMENT    = 'X_Y_CG_RATE (/s)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PCG_RATE,IGRID,ILENCH, &
-                                                          YCOMMENT,IRESP)
-!
-!
-    YRECFM      = 'IC_TOTAL_NB'
-    YCOMMENT    = 'X_Y_IC_TOTAL_NUMBER (no unit)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PIC_TOTAL_NUMBER,IGRID,ILENCH, &
-                                                          YCOMMENT,IRESP)
-!
-!
-    YRECFM      = 'CG_TOTAL_NB'
-    YCOMMENT    = 'X_Y_CG_TOTAL_NUMBER (no unit)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PCG_TOTAL_NUMBER,IGRID,ILENCH, &
-                                                          YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'IC_RATE',    PIC_RATE)
+    CALL IO_READ_FIELD(TPINIFILE,'CG_RATE',    PCG_RATE)
+    CALL IO_READ_FIELD(TPINIFILE,'IC_TOTAL_NB',PIC_TOTAL_NUMBER)
+    CALL IO_READ_FIELD(TPINIFILE,'CG_TOTAL_NB',PCG_TOTAL_NUMBER)
   END IF
 !
 !
  SELECT CASE(HGETSVCONV)
   CASE('READ')
-    IGRID=1      
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 's-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     DO JSV = 1, NSV_USER
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH      = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_C2R2BEG, NSV_C2R2END
-      YRECFM = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_C1R3BEG, NSV_C1R3END
-      YRECFM = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_ELECBEG, NSV_ELECEND
-      YRECFM = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-      YRECFM = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_AERBEG, NSV_AEREND
-      YRECFM = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-      YRECFM='DSVCONV_LINOX'
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_LINOX'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_DSTBEG, NSV_DSTEND
-      YRECFM = 'DSVCONV_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_SLTBEG, NSV_SLTEND
-      YRECFM = 'DSVCONV_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CSALTNAMES(JSV-NSV_SLTBEG+1)))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_LGBEG, NSV_LGEND
-      YRECFM = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_PPBEG, NSV_PPEND
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PDSVCONV(:,:,:,JSV))
     END DO
  END SELECT
 !
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index fd2dc11d6f4b330d8f5c517b8b95f9886d79f05c..a19b00f3b6a96dec2c24c8a17f9bab1d81110fd6 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -834,54 +834,65 @@ DO JSV = NSV_ELECBEG, NSV_ELECEND
   END SELECT
 END DO
 ! Chemical gas phase scalar variables
-DO JSV = NSV_CHGSBEG, NSV_CHGSEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-      IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-        IF (IRESP/=0) THEN
-          IF (PRESENT(PLBXSVMM)) THEN
-            PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-            WRITE(ILUOUT,*) 'Chemical PLBXSVM   will be initialized to 0'
-          ELSE
-            WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBXSVM '
+IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_CHGSBEG, NSV_CHGSEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBXSVMM)) THEN
+                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Chemical PLBXSVM   will be initialized to 0'
+              ELSE
+                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-      IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-        IF (IRESP/=0) THEN
-          IF (PRESENT(PLBYSVMM)) THEN
-            PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-            WRITE(ILUOUT,*) 'Chemical PLBYSVM   will be initialized to 0'
-          ELSE
-            WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBYSVM '
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBYSVMM)) THEN
+                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Chemical PLBYSVM   will be initialized to 0'
+              ELSE
+                WRITE(ILUOUT,*) 'Pb to initialize gas phase Chemical PLBYSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-  CASE('INIT')
-    IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-    IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-  END SELECT
+      CASE('INIT')
+        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
 END DO
 ! Chemical aqueous phase scalar variables
 DO JSV = NSV_CHACBEG, NSV_CHACEND
@@ -1084,55 +1095,67 @@ DO JSV = NSV_AERDEPBEG, NSV_AERDEPEND
   END SELECT
 END DO
 ! Dust scalar variables
-DO JSV = NSV_DSTBEG, NSV_DSTEND
-  SELECT CASE(HGETSVM(JSV))
-  CASE ('READ')
-    IF ( KSIZELBXSV_ll /= 0 ) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-      IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
-        IF (IRESP/=0) THEN
-          IF (PRESENT(PLBXSVMM)) THEN
-            PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
-            WRITE(ILUOUT,*) 'Dust PLBXSVM   will be initialized to 0'
-          ELSE
-            WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
+IF (NSV_DSTEND>=NSV_DSTBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_DSTBEG, NSV_DSTEND
+    SELECT CASE(HGETSVM(JSV))
+      CASE ('READ')
+        IF ( KSIZELBXSV_ll /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DX,IRIMX,PLBXSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBXSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBXSVMM)) THEN
+                PLBXSVM(:,:,:,JSV)=PLBXSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Dust PLBXSVM   will be initialized to 0'
+              ELSE
+                WRITE(ILUOUT,*) 'Pb to initialize dust PLBXSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-!
-    IF (KSIZELBYSV_ll  /= 0 ) THEN
-      YRECFM = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-      IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
-        IF (IRESP/=0) THEN
-          IF (PRESENT(PLBYSVMM)) THEN
-            PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
-            WRITE(ILUOUT,*) 'Dust PLBYSVM   will be initialized to 0'
-          ELSE
-            WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM '
+        !
+        IF (KSIZELBYSV_ll  /= 0 ) THEN
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CDUSTNAMES(JSV-NSV_DSTBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_READ_FIELD_LB(TPINIFILE,TZFIELD,IL3DY,IRIMY,PLBYSVM(:,:,:,JSV),IRESP)
+          IF ( SIZE(PLBYSVM,1) /= 0 ) THEN
+            IF (IRESP/=0) THEN
+              IF (PRESENT(PLBYSVMM)) THEN
+                PLBYSVM(:,:,:,JSV)=PLBYSVMM(:,:,:,JSV)
+                WRITE(ILUOUT,*) 'Dust PLBYSVM   will be initialized to 0'
+              ELSE
+                WRITE(ILUOUT,*) 'Pb to initialize dust PLBYSVM '
 !callabortstop
-            CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-            CALL ABORT
-            STOP
-          ENDIF
+                CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
+                CALL ABORT
+                STOP
+              ENDIF
+            END IF
+          END IF
         END IF
-      END IF
-    END IF
-  CASE('INIT')
-    IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
-    IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+      CASE('INIT')
+        IF ( SIZE(PLBXSVM,1) /= 0 ) PLBXSVM(:,:,:,JSV) = 0.
+        IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
+!
 DO JSV = NSV_DSTDEPBEG, NSV_DSTDEPEND
   SELECT CASE(HGETSVM(JSV))
   CASE ('READ')
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index df4fff5ccec73ccb13c19898f281dd93f50628ce..a065e0150214026fc57d91cdd720a1dfd4a117ad 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -2015,7 +2015,7 @@ DEALLOCATE(ZCO2)
 !* in a RESTART case, reads surface radiative quantities in the MESONH file
 !
 IF (CRAD   == 'ECMW' .AND. CGETRAD=='READ') THEN
-  CALL INI_SURF_RAD(TPINIFILE%CNAME, CLUOUT, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
+  CALL INI_SURF_RAD(TPINIFILE, XDIR_ALB, XSCA_ALB, XEMIS, XTSRAD)
 END IF
 !
 !
@@ -2079,7 +2079,7 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   IF (NVERB>=10) THEN
     WRITE(ILUOUT,*) 'XDTCONV has been set to : ',XDTCONV
   END IF
-  CALL INI_DEEP_CONVECTION (TPINIFILE%CNAME,HLUOUT,GINIDCONV,TDTCUR,         &
+  CALL INI_DEEP_CONVECTION (TPINIFILE,HLUOUT,GINIDCONV,TDTCUR,               &
                            NCOUNTCONV,XDTHCONV,XDRVCONV,XDRCCONV,            &
                            XDRICONV,XPRCONV,XPRSCONV,XPACCONV,               &
                            XUMFCONV,XDMFCONV,XMFCONV,XPRLFLXCONV,XPRSFLXCONV,&
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index d470cf68aa53191e1acdb96a9ac6fa6c9cc7cebb..f1978145d18dbb5861e0518d61a5c2d33395e789 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -284,7 +284,8 @@ ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL  '.OR. CPROGRAM=='SPEC  ') THEN
   YINIFILE    = CINIFILE_n
   HINIFILEPGD = CINIFILEPGD_n
   YEXSEG=TRIM(ADJUSTL(CINIFILE_n))//'.des'
-  CALL FMOPEN_ll(CINIFILE_n,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP)
+  CALL IO_FILE_ADD2LIST(TPINIFILE,TRIM(YINIFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TPINIFILE,HLUOUT,IRESP)
   CALL FMLOOK_ll(YEXSEG,CLUOUT0,ILUSEG,IRESP)
 !
 !*       1.3bis   DIAG program case
diff --git a/src/MNH/ini_spectren.f90 b/src/MNH/ini_spectren.f90
index 760ab376e604238b90694aa36d599a4ece13245d..e299c24c85d90872588c385592fe99a10a1bbb49 100644
--- a/src/MNH/ini_spectren.f90
+++ b/src/MNH/ini_spectren.f90
@@ -150,14 +150,7 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 !
 INTEGER             :: JSV     ! Loop index
 INTEGER             :: IRESP   ! Return code of FM routines
-INTEGER             :: ININAR  ! File management variable
-INTEGER             :: IMASDEV ! version of MESOHN in the input file
 INTEGER             :: ILUOUT  ! Logical unit number of output-listing
-CHARACTER(LEN=2)    :: YDIR   ! Type  of the data field in LFIFM file
-INTEGER             :: IGRID   ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH  ! Length of comment string in LFIFM file
-CHARACTER (LEN=100) :: YCOMMENT!comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM  ! Name of the desired field in LFIFM file
 INTEGER             :: IIU     ! Upper dimension in x direction (local)
 INTEGER             :: IJU     ! Upper dimension in y direction (local)
 INTEGER             :: IIU_ll  ! Upper dimension in x direction (global)
@@ -240,10 +233,8 @@ CINIFILE=TPINIFILE%CNAME
 !
 IKU=NKMAX+2*JPVEXT
 !
-YRECFM = 'ZHAT'
 ALLOCATE(XZHAT(IKU))
- YDIR='--'
-CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'ZHAT',XZHAT)
 IF (XALZBOT>=XZHAT(IKU) .AND. LVE_RELAX) THEN
   WRITE(ILUOUT,FMT=*) "INI_SPECTRE_n ERROR: you want to use vertical relaxation"
   WRITE(ILUOUT,FMT=*) "                  but bottom of layer XALZBOT(",XALZBOT,")"
@@ -765,37 +756,27 @@ NDT_2_WAY(KMI)=4
 
 IF (LSPECTRE_U) THEN
   ALLOCATE(XUT(IIU,IJU,IKU))      ; XUT  = 0.0
-  YRECFM = 'UT'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XUT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'UT',XUT)
 END IF
 !
 IF (LSPECTRE_V) THEN
   ALLOCATE(XVT(IIU,IJU,IKU))      ; XVT  = 0.0
-  YRECFM = 'VT'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XVT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'VT',XVT)
 END IF
 !
 IF (LSPECTRE_W) THEN  
   ALLOCATE(XWT(IIU,IJU,IKU))      ; XWT  = 0.0
-  YRECFM = 'WT'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XWT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'WT',XWT)
 END IF
 !
 IF (LSPECTRE_TH) THEN
   ALLOCATE(XTHT(IIU,IJU,IKU))     ; XTHT = 0.0
-  YRECFM = 'THT'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XTHT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'THT',XTHT)
 END IF
 !
 IF (LSPECTRE_RV) THEN
   ALLOCATE(XRT(IIU,IJU,IKU,NRR))
-  YRECFM = 'RVT'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,XRT(:,:,:,1),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'RVT',XRT(:,:,:,1))
 END IF
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/ini_surf_rad.f90 b/src/MNH/ini_surf_rad.f90
index 9eb2433c78ac509f60b3c17f4edfba1449af6944..2566399537eea25b38331115c1e33ecb021d1d22 100644
--- a/src/MNH/ini_surf_rad.f90
+++ b/src/MNH/ini_surf_rad.f90
@@ -14,11 +14,11 @@
 !
 INTERFACE
 !
-    SUBROUTINE INI_SURF_RAD(HINIFILE, HLUOUT, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD)
+    SUBROUTINE INI_SURF_RAD(TPINIFILE, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD)
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 !
-CHARACTER (LEN=*),      INTENT(IN)  :: HINIFILE  ! Name of the initial file
-CHARACTER (LEN=*),      INTENT(IN)  :: HLUOUT    ! name for output-listing
+TYPE(TFILEDATA),        INTENT(IN)  :: TPINIFILE ! Initial file
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB  ! Direct albedo
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB  ! Diffuse albedo
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PEMIS     ! emissivity
@@ -31,9 +31,9 @@ END INTERFACE
 END MODULE MODI_INI_SURF_RAD
 !
 !
-!   #######################################################################
-    SUBROUTINE INI_SURF_RAD(HINIFILE, HLUOUT, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD)
-!   #######################################################################
+!   #####################################################################
+    SUBROUTINE INI_SURF_RAD(TPINIFILE, PDIR_ALB, PSCA_ALB, PEMIS, PTSRAD)
+!   #####################################################################
 !
 !!****  *INI_SURF_RAD * - initialisation for ECMWF radiation scheme in the MesoNH framework
 !!
@@ -66,14 +66,15 @@ END MODULE MODI_INI_SURF_RAD
 !*       0.    DECLARATIONS
 !              ------------
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
 USE MODE_FMREAD
 !
 IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
-CHARACTER (LEN=*),      INTENT(IN)  :: HINIFILE  ! Name of the initial file
-CHARACTER (LEN=*),      INTENT(IN)  :: HLUOUT    ! name for output-listing
+TYPE(TFILEDATA),        INTENT(IN)  :: TPINIFILE ! Initial file
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PDIR_ALB  ! Direct albedo
 REAL, DIMENSION(:,:,:), INTENT(OUT) :: PSCA_ALB  ! Diffuse albedo
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PEMIS     ! emissivity
@@ -81,35 +82,12 @@ REAL, DIMENSION(:,:),   INTENT(OUT) :: PTSRAD    ! radiative surface temperature
 !
 !*       0.2   declarations of local variables
 !
-INTEGER                :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=16)     :: YRECFM              ! management
-CHARACTER (LEN=100)    :: YCOMMENT            ! variables  
-!
 !-------------------------------------------------------------------------------
 !
-YRECFM      = 'DIR_ALB'
-YCOMMENT    = 'X_Y_DIR_ALB (-)'
-IGRID       = 1
-ILENCH      = LEN(YCOMMENT)
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDIR_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM      = 'SCA_ALB'
-YCOMMENT    = 'X_Y_SCA_ALB (-)'
-IGRID       = 1
-ILENCH      = LEN(YCOMMENT)
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PSCA_ALB,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM      = 'EMIS'
-YCOMMENT    = 'X_Y_EMIS (-)'
-IGRID       = 1
-ILENCH      = LEN(YCOMMENT)
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PEMIS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM      = 'TSRAD'
-YCOMMENT    = 'X_Y_TSRAD (-)'
-IGRID       = 1
-ILENCH      = LEN(YCOMMENT)
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PTSRAD,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'DIR_ALB',PDIR_ALB)
+CALL IO_READ_FIELD(TPINIFILE,'SCA_ALB',PSCA_ALB)
+CALL IO_READ_FIELD(TPINIFILE,'EMIS',PEMIS)
+CALL IO_READ_FIELD(TPINIFILE,'TSRAD',PTSRAD)
 !  
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index 181104754b2383d87a8f48df8b4a582ff7bee973..1345f4cd6f24bd7b9b787a32aa056ac84bd23874 100644
--- a/src/MNH/prep_surfex.f90
+++ b/src/MNH/prep_surfex.f90
@@ -139,8 +139,12 @@ CALL CLOSE_ll(YPRE_REAL1, IOSTAT=IRESP)
 
 !*       4.2   reading of values of some configuration variables in namelist
 !
-CALL FMREAD(CPGDFILE,'IMAX',CLUOUT0,'--',II,IGRID,ILENGTH,HCOMMENT,IRESP)
-CALL FMREAD(CPGDFILE,'JMAX',CLUOUT0,'--',IJ,IGRID,ILENGTH,HCOMMENT,IRESP)
+CALL INI_FIELD_LIST(1)
+!
+CALL INI_FIELD_SCALARS()
+!
+CALL IO_READ_FIELD(TZPGDFILE,'IMAX',II)
+CALL IO_READ_FIELD(TZPGDFILE,'JMAX',IJ)
 CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
 CALL SET_DAD0_ll()
 CALL SET_DIM_ll(II, IJ, 1)
@@ -156,10 +160,6 @@ CALL SET_DAD_ll(0, 1)
 !JUANZ CALL INI_PARA_ll(IINFO_ll)
 CALL INI_PARAZ_ll(IINFO_ll)
 !
-CALL INI_FIELD_LIST(1)
-!
-CALL INI_FIELD_SCALARS()
-!
 !-------------------------------------------------------------------------------
 !
 !
@@ -169,9 +169,10 @@ CALL INI_FIELD_SCALARS()
 !* reading of date
 !
 IF (YATMFILETYPE=='MESONH') THEN
-  CALL FMOPEN_ll(YATMFILE,'READ',CLUOUT0,0,1,1,ININAR,IRESP)
-  CALL FMREAD(YATMFILE,'DTCUR',CLUOUT0,'--',TDTCUR,IGRID,ILENGTH,HCOMMENT,IRESP)
-  CALL FMCLOS_ll(YATMFILE,'KEEP',CLUOUT0,IRESP)
+  CALL IO_FILE_ADD2LIST(TZATMFILE,TRIM(YATMFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=1,KLFIVERB=1)
+  CALL IO_FILE_OPEN_ll(TZATMFILE,CLUOUT0,IRESP)
+  CALL IO_READ_FIELD(TZATMFILE,'DTCUR',TDTCUR)
+  CALL IO_FILE_CLOSE_ll(TZATMFILE,CLUOUT0,IRESP)
 ELSE
   TDTCUR%TDATE%YEAR = NUNDEF
   TDTCUR%TDATE%MONTH= NUNDEF
diff --git a/src/MNH/read_all_data_mesonh_case.f90 b/src/MNH/read_all_data_mesonh_case.f90
index cc369a623b2b3be21984fed630782ef542466a33..2eb30cc31ac0d77fbb52311cbefe572adddd1296 100644
--- a/src/MNH/read_all_data_mesonh_case.f90
+++ b/src/MNH/read_all_data_mesonh_case.f90
@@ -191,8 +191,6 @@ CHARACTER(LEN=28) :: YOUTFILE
 CHARACTER(LEN=2)  :: YPGD_TYPE
 !
 INTEGER           :: IMASDEV       ! Masdev version
-INTEGER           :: IGRID, ILENCH
-CHARACTER(LEN=100):: YCOMMENT
 !
 !* temporary namelist configuration variables
 !
@@ -326,15 +324,15 @@ CALL READ_PRC_FMFILE(IIINF_LS,IISUP_LS,IJINF_LS,IJSUP_LS                     )
 !                 ---------
 !
 ALLOCATE(XZS(IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
-CALL FMREAD(TPPGDFILE%CNAME,'ZS',CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPPGDFILE,'ZS',XZS)
 CALL ZS_BOUNDARY(XZS,XZS_LS)
 !
 ALLOCATE(XZSMT(IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
-CALL FMREAD(TPPGDFILE%CNAME,'MASDEV',CLUOUT,'XY',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPPGDFILE,'MASDEV',IMASDEV)
 IF (IMASDEV<=46) THEN
   XZSMT = XZS
 ELSE
-  CALL FMREAD(TPPGDFILE%CNAME,'ZSMT',CLUOUT,'XY',XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPPGDFILE,'ZSMT',XZSMT)
 END IF 
 CALL ZS_BOUNDARY(XZSMT,XZSMT_LS)
 !
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index 13017f6310c1834cdb8981b93ee0fbdf857aa8e2..d34944a220abcf0eaf70ef48adc37b0562b01325 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -271,6 +271,7 @@ USE MODE_FIELD,           ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll,           ONLY: UPCASE
+USE MODE_MSG
 !
 USE MODI_INI_LB
 USE MODI_INI_LS
@@ -561,11 +562,7 @@ END SELECT
 !
 SELECT CASE(HGETCIT)             ! ice concentration
   CASE('READ')
-    YRECFM='CIT'
-    YDIR='XY'
-    IF (SIZE(PCIT) /= 0 )   &
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PCIT,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    IF (SIZE(PCIT) /= 0 ) CALL IO_READ_FIELD(TPINIFILE,'CIT',PCIT)
   CASE('INIT')
     PCIT(:,:,:)=0.
 END SELECT
@@ -575,50 +572,77 @@ END SELECT
 YDIR='XY'
 ISV= SIZE(PSVT,4)
 !
-DO JSV = 1, NSV_USER              ! initialize according to the get indicators
-  SELECT CASE(HGETSVT(JSV))
-    CASE ('READ')
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-      PSVT(:,:,:,JSV) = Z3D(:,:,:)
-    CASE ('INIT')
-      PSVT(:,:,:,JSV) = 0. 
-  END SELECT
-END DO
+IF (NSV_USER>0) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = 1, NSV_USER              ! initialize according to the get indicators
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_C2R2BEG,NSV_C2R2END
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-    IF (LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
-      ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
-      ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
-      ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*ALOG(ZWORK(:,:,:)))
-      !rvsat
-      ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
-      ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:) 
-      PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:)
-    END IF
-  END SELECT
-END DO
+IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'm-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_C2R2BEG,NSV_C2R2END
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+        IF (LSUPSAT .AND. (HGETRVT == 'READ') ) THEN
+          ZWORK(:,:,:) = (PPABST(:,:,:)/XP00 )**(XRD/XCPD)
+          ZWORK(:,:,:) = PTHT(:,:,:)*ZWORK(:,:,:)
+          ZWORK(:,:,:) = EXP(XALPW-XBETAW/ZWORK(:,:,:)-XGAMW*ALOG(ZWORK(:,:,:)))
+          !rvsat
+          ZWORK(:,:,:) = (XMV / XMD)*ZWORK(:,:,:)/(PPABST(:,:,:)-ZWORK(:,:,:))
+          ZWORK(:,:,:) = PRT(:,:,:,1)/ZWORK(:,:,:)
+          PSVT(:,:,:,NSV_C2R2END ) = ZWORK(:,:,:)
+        END IF
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_C1R3BEG,NSV_C1R3END
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+IF (NSV_C1R3END>=NSV_C1R3BEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'm-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_C1R3BEG,NSV_C1R3END
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
 ! LIMA variables
 !
@@ -690,56 +714,99 @@ DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
   END SELECT
 END DO
 !
-DO JSV = NSV_ELECBEG,NSV_ELECEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT
-END DO
+IF (NSV_ELECEND>=NSV_ELECBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_ELECBEG,NSV_ELECEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        IF (JSV .GT. NSV_ELECBEG .AND. JSV .LT. NSV_ELECEND) THEN
+          TZFIELD%CUNITS     = 'C m-3'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (C/m3)'
+        ELSE
+          TZFIELD%CUNITS     = 'm-3'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (nb ions/m3)'
+        END IF
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_CHGSBEG,NSV_CHGSEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))
-    YRECFM=TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
+  CNAMES(JSV-NSV_CHGSBEG+1) = UPCASE(CNAMES(JSV-NSV_CHGSBEG+1))
+  TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHGSBEG+1))//'T'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+  TZFIELD%CUNITS     = 'ppbv'
+  TZFIELD%CDIR       = 'XY'
+  WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_CHGSBEG,NSV_CHGSEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_CHACBEG,NSV_CHACEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))
-    YRECFM=TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_CHACEND>=NSV_CHACBEG) THEN
+  CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1) = UPCASE(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))
+  TZFIELD%CSTDNAME   = ''
+  !PW TODO: check units
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_CHACBEG,NSV_CHACEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CNAMES(JSV-NSV_CHACBEG+NSV_CHGS+1))//'M'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3,A4)')'X_Y_Z_','CHAQ',JSV,' (M)'
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+!***ATTENTION: BUG ? field written with a M suffix, read with a T suffix
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
-DO JSV = NSV_CHICBEG,NSV_CHICEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
-    YRECFM=TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_CHICEND>=NSV_CHICBEG) THEN
+  CICNAMES(JSV-NSV_CHICBEG+1) = UPCASE(CICNAMES(JSV-NSV_CHICBEG+1))
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_CHICBEG,NSV_CHICEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
 DO JSV = NSV_SLTBEG,NSV_SLTEND
   SELECT CASE(HGETSVT(JSV))
@@ -765,17 +832,27 @@ DO JSV = NSV_SLTDEPBEG,NSV_SLTDEPEND
   END SELECT    
 END DO
 !
-DO JSV = NSV_DSTBEG,NSV_DSTEND
-  SELECT CASE(HGETSVT(JSV))
-  CASE ('READ')
-    YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PSVT(:,:,:,JSV) = Z3D(:,:,:)
-  CASE ('INIT')
-    PSVT(:,:,:,JSV) = 0.
-  END SELECT    
-END DO
+IF (NSV_DSTEND>=NSV_DSTBEG) THEN
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = NSV_DSTBEG,NSV_DSTEND
+    SELECT CASE(HGETSVT(JSV))
+      CASE ('READ')
+        TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
+        CALL IO_READ_FIELD(TPINIFILE,TZFIELD,PSVT(:,:,:,JSV))
+      CASE ('INIT')
+        PSVT(:,:,:,JSV) = 0.
+    END SELECT
+  END DO
+END IF
 !
 DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
   SELECT CASE(HGETSVT(JSV))
@@ -896,61 +973,29 @@ DO JSV = NSV_LNOXBEG,NSV_LNOXEND
 END DO
 !
 IF (CCONF == 'RESTA') THEN
-  YRECFM = 'US_PRES'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRUS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM = 'VS_PRES'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRVS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM = 'WS_PRES'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRWS_PRES,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM = 'THS_CLD'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRTHS_CLD,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'US_PRES',PRUS_PRES)
+  CALL IO_READ_FIELD(TPINIFILE,'VS_PRES',PRVS_PRES)
+  CALL IO_READ_FIELD(TPINIFILE,'WS_PRES',PRWS_PRES)
+  CALL IO_READ_FIELD(TPINIFILE,'THS_CLD',PRTHS_CLD)
   DO JRR = 1, SIZE(PRT,4)
-   IF (JRR == 1 ) THEN
-    YRECFM='RVS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 2 ) THEN
-    YRECFM='RCS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 3 ) THEN
-    YRECFM='RRS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 4 ) THEN
-    YRECFM='RIS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 5 ) THEN
-    YRECFM='RSS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 6 ) THEN
-    YRECFM='RGS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
-   IF (JRR == 7 ) THEN
-    YRECFM='RHS_CLD'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    PRRS_CLD(:,:,:,JRR) = Z3D(:,:,:)
-   END IF
+    SELECT CASE(JRR)
+      CASE (1)
+        CALL IO_READ_FIELD(TPINIFILE,'RVS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (2)
+        CALL IO_READ_FIELD(TPINIFILE,'RCS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (3)
+        CALL IO_READ_FIELD(TPINIFILE,'RRS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (4)
+        CALL IO_READ_FIELD(TPINIFILE,'RIS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (5)
+        CALL IO_READ_FIELD(TPINIFILE,'RSS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (6)
+        CALL IO_READ_FIELD(TPINIFILE,'RGS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE (7)
+        CALL IO_READ_FIELD(TPINIFILE,'RHS_CLD',PRRS_CLD(:,:,:,JRR))
+      CASE DEFAULT
+        CALL PRINT_MSG(NVERB_FATAL,'GEN','READ_FIELD','PRT is too big')
+    END SELECT
   END DO
   DO JSV = NSV_C2R2BEG,NSV_C2R2END
    IF (JSV == NSV_C2R2BEG ) THEN
@@ -973,29 +1018,12 @@ END IF
 IF (CPROGRAM=='MESONH' .AND. HUVW_ADV_SCHEME(1:3)=='CEN' .AND. &
         HTEMP_SCHEME == 'LEFR' ) THEN
   IF (CCONF=='RESTA') THEN
-    YRECFM = 'UM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PUM,IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM = 'VM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PVM,IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM = 'WM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWM,IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM = 'DUM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDUM,IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM = 'DVM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDVM,IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM = 'DWM'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PDWM,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'UM', PUM)
+    CALL IO_READ_FIELD(TPINIFILE,'VM', PVM)
+    CALL IO_READ_FIELD(TPINIFILE,'WM', PWM)
+    CALL IO_READ_FIELD(TPINIFILE,'DUM',PDUM)
+    CALL IO_READ_FIELD(TPINIFILE,'DVM',PDVM)
+    CALL IO_READ_FIELD(TPINIFILE,'DWM',PDWM)
   ELSE
     PUM = PUT
     PVM = PVT
diff --git a/src/MNH/read_grid_time_mesonh_case.f90 b/src/MNH/read_grid_time_mesonh_case.f90
index 2c99639d3cdc741305c70d1026b322471d0099ac..b9b3317949ceef0cbaa0b43f2670f850b7f9c148 100644
--- a/src/MNH/read_grid_time_mesonh_case.f90
+++ b/src/MNH/read_grid_time_mesonh_case.f90
@@ -125,12 +125,7 @@ CHARACTER(LEN=*),  INTENT(OUT):: HDAD_NAME! dad name of the FM file
 REAL               :: ZEPS       ! a little number
 INTEGER            :: IRESP      ! return-code if problem eraised in FMLOOK
 INTEGER            :: ILUOUT0    ! logical number for listing file
-INTEGER            :: IGRID      ! grid point indicator 
-INTEGER            :: ILENCH     ! length of comment string 
 INTEGER            :: IMASDEV    ! Masdev version
-
-CHARACTER(LEN=100) :: YCOMMENT   ! comment string
-CHARACTER(LEN=16)  :: YRECFM     ! Name of the article to be read
 INTEGER            :: JL         ! loop controls
 INTEGER            :: ILMAX_LS
 !
@@ -163,11 +158,14 @@ TYPE(TFILEDATA),POINTER :: TZFMFILE => NULL()
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 ZEPS=1.E-10
 !
+!PW: TODO: temporary: look for file from its name
+!     TPFMFILE should be passed in arguments
+CALL IO_FILE_FIND_BYNAME(HFMFILE,TZFMFILE,IRESP)
+!
 !*       1.1   Original FMfile name
 !              --------------------
 !
-YRECFM = 'DAD_NAME'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',HDAD_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'DAD_NAME',HDAD_NAME)
 !
 !-------------------------------------------------------------------------------
 !
@@ -177,18 +175,12 @@ CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',HDAD_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
 !*       2.1    Projection :
 !               ----------
 !
-YRECFM='LON0'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZLON0_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'LON0',ZLON0_LS)
 ZLON0_LS =ZLON0_LS +NINT((XLON0    -ZLON0_LS )/360.)*360.
 ! 
-YRECFM='RPK'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZRPK_LS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LAT0'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZLAT0_LS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BETA'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ZBETA_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'RPK', ZRPK_LS)
+CALL IO_READ_FIELD(TZFMFILE,'LAT0',ZLAT0_LS)
+CALL IO_READ_FIELD(TZFMFILE,'BETA',ZBETA_LS)
 !
 IF (     (ABS(ZLAT0_LS-XLAT0)>ZEPS*MAX(1.,ABS(XLAT0)))               &
    .OR.  (ABS(ZLON0_LS-XLON0)>ZEPS*MAX(1.,ABS(XLON0)))               &
@@ -212,9 +204,6 @@ END IF
 !*       2.2    Horizontal grid:
 !               ---------------
 !
-!PW: TODO: temporary: look for file from its name
-!     TPFMFILE should be passed in arguments
-CALL IO_FILE_FIND_BYNAME(HFMFILE,TZFMFILE,IRESP)
 CALL READ_HGRID(1,TZFMFILE,YMY_NAME,YDAD_NAME,YTYPE)
 CALL RETRIEVE2_NEST_INFO_n(1,0,KXOR_LS,KYOR_LS,IXSIZE,IYSIZE,IDXRATIO,IDYRATIO)
 !
@@ -234,35 +223,31 @@ END IF
 !               -------------
 !
 !
-YRECFM='KMAX'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',ILMAX_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'KMAX',ILMAX_LS)
 !
 ILMAX_LS=ILMAX_LS+2*JPVEXT
 !
-YRECFM='ZHAT'
 ALLOCATE(XZHAT_LS(ILMAX_LS))
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',XZHAT_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'ZHAT',XZHAT_LS)
 !
-CALL FMREAD(HFMFILE,'MASDEV',CLUOUT0,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'MASDEV',IMASDEV)
 CALL DEFAULT_SLEVE(LSLEVE_LS,XLEN1_LS,XLEN2_LS)
 IF (IMASDEV<=46) THEN
   LSLEVE_LS = .FALSE.
 ELSE
-  CALL FMREAD(HFMFILE,'SLEVE',CLUOUT0,'--',LSLEVE_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFMFILE,'SLEVE',LSLEVE_LS)
   IF (LSLEVE_LS) THEN
-    CALL FMREAD(HFMFILE,'LEN1',CLUOUT0,'--',XLEN1_LS,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HFMFILE,'LEN2',CLUOUT0,'--',XLEN2_LS,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZFMFILE,'LEN1',XLEN1_LS)
+    CALL IO_READ_FIELD(TZFMFILE,'LEN2',XLEN2_LS)
   END IF
 END IF
 !
-YRECFM='THINSHELL'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',LTHINSHELL,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'THINSHELL',LTHINSHELL)
 !
 !*       2.5    Time variables :
 !               --------------
 !
-YRECFM='DTCUR' 
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',TDTCUR,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZFMFILE,'DTCUR',TDTCUR)
 !
 TDTMOD=TDTCUR
 TDTSEG=TDTCUR
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index ac337d47f3e55ac645f4d578d67453c6b9c95215..bd0e4d15357773c3b22e1b02a67e0ba4e86b3b98 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -1212,10 +1212,11 @@ END SUBROUTINE READ_SURFN0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEINT
 USE MODE_FM
 USE MODE_FMREAD
 !
-USE MODD_IO_SURF_MNH,     ONLY : COUT, CFILE , NLUOUT, NMASK, &
+USE MODD_IO_SURF_MNH,     ONLY : COUT, CFILE, TPINFILE, NLUOUT, NMASK, &
                                  NIU, NJU, NIB, NJB, NIE, NJE
 !
 USE MODI_PACK_2D_1D
@@ -1240,17 +1241,35 @@ INTEGER           :: IGRID          ! IGRID : grid indicator
 INTEGER           :: ILENCH         ! ILENCH : length of comment string
 !
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
+TYPE(TFIELDDATA) :: TZFIELD
 !---------------------------------------------------------------------
 !
 IF (HDIR=='-') THEN
 !
- CALL FMREAD(CFILE,HREC,COUT,'--',KFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 1
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,KFIELD,KRESP)
 !
 ELSE IF (HDIR=='H') THEN
- ALLOCATE(IWORK(NIU,NJU))
-
+  ALLOCATE(IWORK(NIU,NJU))
 !
- CALL FMREAD(CFILE,HREC,COUT,'XY',IWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 2
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,IWORK,KRESP)
 !
  IF (KRESP /=0) THEN
     WRITE(NLUOUT,*) 'WARNING'
@@ -1262,7 +1281,6 @@ ELSE IF (HDIR=='H') THEN
     CALL PACK_2D_1D(NMASK,IWORK(NIB:NIE,NJB:NJE),KFIELD)
  END IF
 !
-
 DEALLOCATE(IWORK)
 
 ENDIF