diff --git a/src/MNH/compute_r00.f90 b/src/MNH/compute_r00.f90
index 3ec7b851a2a402b23d870af13bc45b619d7a84f5..b31a7a65961f5d2fb407fc7036fd0d0319903960 100644
--- a/src/MNH/compute_r00.f90
+++ b/src/MNH/compute_r00.f90
@@ -84,6 +84,7 @@ USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_FMREAD
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_ll
 USE MODD_TYPE_DATE
 !
@@ -100,11 +101,8 @@ INTEGER  :: INPRAR               ! number of articles predicted  in
                                  !  the LFIFM file
 INTEGER  :: ININAR               ! number of articles  present in
                                  !  the LFIFM file
-INTEGER  :: ITYPE                ! type of file (conv2dia and transfer)
 !
-CHARACTER(LEN=100)                 :: YCOMMENT
-CHARACTER(LEN=16)                  :: YRECFM
-INTEGER                            :: IFILECUR,JFILECUR,NIU,NJU,NKU,IGRID,ILENCH
+INTEGER                            :: IFILECUR,JFILECUR,NIU,NJU,NKU
 INTEGER                            :: NFILES,JLOOP
 REAL                               :: ZXOR,ZYOR,ZDX,ZDY
 REAL                               :: ZSPVAL
@@ -127,13 +125,13 @@ REAL                               :: ZXMAX,ZYMAX,ZZMAX  ! domain extrema
 INTEGER, DIMENSION(100)            :: NBRFILES 
 INTEGER                            :: IKU
 TYPE(TFIELDDATA)                   :: TZFIELD
+TYPE(TFILEDATA),POINTER            :: TZTRACFILE
 !
 !-------------------------------------------------------------------------------
 !
 !*       1.0    INITIALIZATION
 !               --------------
 !
-ITYPE=2
 ZSPVAL=-1.E+11
 IKU=SIZE(XZHAT)
 !
@@ -252,8 +250,8 @@ END IF
 ! is performed
 DO JFILECUR=1,NFILES
   !
-  CALL FMOPEN_ll(CFILES(NBRFILES(JFILECUR)),'READ',CLUOUT,   &
-                 INPRAR,ITYPE,NVERB,ININAR,IRESP)
+  CALL IO_FILE_ADD2LIST(TZTRACFILE,CFILES(NBRFILES(JFILECUR)),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TZTRACFILE,CLUOUT,IRESP)
 !
 !*       4.1  check if this file is a start instant
 !
@@ -270,9 +268,7 @@ DO JFILECUR=1,NFILES
 !
   IF (GSTART) THEN
     !
-    YRECFM='DTCUR'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'--',TDTCUR_START, &
-                IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZTRACFILE,'DTCUR',TDTCUR_START)
     IHOUR   = INT(TDTCUR_START%TIME/3600.)
     ZREMAIN = MOD(TDTCUR_START%TIME,3600.)
     IMINUTE = INT(ZREMAIN/60.)
@@ -280,14 +276,9 @@ DO JFILECUR=1,NFILES
     WRITE(YDATE,FMT='(1X,I4.4,I2.2,I2.2,2X,I2.2,"H",I2.2,"M", &
          & F5.2,"S")') TDTCUR_START%TDATE, IHOUR,IMINUTE,ZSECOND  
     !
-    YRECFM='THT'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'XY', &
-                ZTH0(:,:,:),IGRID,ILENCH,YCOMMENT,IRESP)
-    !
-    YRECFM='RVT'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'XY', &
-                ZRV0(:,:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZTRACFILE,'THT',ZTH0(:,:,:))
     !
+    CALL IO_READ_FIELD(TZTRACFILE,'RVT',ZRV0(:,:,:))
     ZRV0(:,:,:)=ZRV0(:,:,:)*1.E+3  ! ZRV0 in g/kg
     !
   END IF
@@ -376,19 +367,27 @@ DO JFILECUR=1,NFILES
 !*       4.4   compute the origin of the particules using one more segment
 !
   IF (JFILECUR /= NFILES) THEN
-    YRECFM='LGXT'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'XY', &
-              ZX0(:,:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = '' !Unknown comment
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    TZFIELD%CMNHNAME   = 'LGXT'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    CALL IO_READ_FIELD(TZTRACFILE,TZFIELD,ZX0)
     ZX0(:,:,:)=ZX0(:,:,:)*1.E-3   ! ZX0 in km
     !
-    YRECFM='LGYT'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'XY', &
-              ZY0(:,:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LGYT'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    CALL IO_READ_FIELD(TZTRACFILE,TZFIELD,ZY0)
     ZY0(:,:,:)=ZY0(:,:,:)*1.E-3   ! ZY0 in km
     !
-    YRECFM='LGZT'
-    CALL FMREAD(CFILES(NBRFILES(JFILECUR)),YRECFM,CLUOUT,'XY', &
-              ZZ0(:,:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LGZT'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    CALL IO_READ_FIELD(TZTRACFILE,TZFIELD,ZZ0)
     ZZ0(:,:,:)=ZZ0(:,:,:)*1.E-3   ! ZZ0 in km
     !
     ! old position of the set of particles
@@ -424,7 +423,7 @@ DO JFILECUR=1,NFILES
 !
 !*       4.5   close the input file
 !
-  CALL FMCLOS_ll(CFILES(NBRFILES(JFILECUR)),'KEEP',CLUOUT,IRESP)
+  CALL IO_FILE_CLOSE_ll(TZTRACFILE,CLUOUT,IRESP)
 !
 END DO
 !
diff --git a/src/MNH/free_atm_profile.f90 b/src/MNH/free_atm_profile.f90
index 63c34214da7ea8fddb6ad118db629d360da1df35..2ef4e0c92173b3af89ba780c7fc1cc14ce96df44 100644
--- a/src/MNH/free_atm_profile.f90
+++ b/src/MNH/free_atm_profile.f90
@@ -166,10 +166,7 @@ REAL, DIMENSION(SIZE(PZMASS_MX,1),SIZE(PZMASS_MX,2)) &
                                       :: ZK_BL_TOP  ! as K_BL_TOP but real
 INTEGER                               :: IIMIN, IIMAX, IJMIN, IJMAX
 
-INTEGER           :: IRESP                !
-INTEGER           :: IGRID, ILENCH        !
-CHARACTER(LEN=16) :: YRECFM               ! name of field to be recorded
-CHARACTER(LEN=100):: YCOMMENT             ! comment to be recorded
+INTEGER           :: IRESP
 
 REAL, DIMENSION(SIZE(PZMASS_MX,1),SIZE(PZMASS_MX,2)) &
                                       :: Z2D ! field to be recorded
diff --git a/src/MNH/ice_adjust.f90 b/src/MNH/ice_adjust.f90
index a04f63482dbfb138285d57f56511e7cb0a86d111..c31243eabb57c259aa762c10dcf0218767819c7f 100644
--- a/src/MNH/ice_adjust.f90
+++ b/src/MNH/ice_adjust.f90
@@ -248,13 +248,6 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
       ZW1,ZW2,ZW3,ZW4,ZW5,ZW6,ZW7,&  ! Work arrays for intermediate fields
                             ZCND     ! CND=(T-T00)/(T0-T00) cf sc doc and TAO etal (89)
 !
-INTEGER             :: IRESP      ! Return code of FM routines
-INTEGER             :: ILENG      ! Length of comment string 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,IJU,IKU! dimensions of dummy arrays
 INTEGER             :: IIB,IJB    ! Horz index values of the first inner mass points
 INTEGER             :: IIE,IJE    ! Horz index values of the last inner mass points
diff --git a/src/MNH/ice_adjust_elec.f90 b/src/MNH/ice_adjust_elec.f90
index 4c7b2c622af2869693247ad15dc973c3d86a8ae0..39b599f5aa08d90a941b7dd620e50f7748e75b73 100644
--- a/src/MNH/ice_adjust_elec.f90
+++ b/src/MNH/ice_adjust_elec.f90
@@ -282,13 +282,6 @@ REAL, DIMENSION(SIZE(PEXNREF,1),SIZE(PEXNREF,2),SIZE(PEXNREF,3)) &
                                              ! to add to positive
                                              ! or negative ion number
 !
-INTEGER             :: IRESP      ! Return code of FM routines
-INTEGER             :: ILENG      ! Length of comment string 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,IJU,IKU! dimensions of dummy arrays
 INTEGER             :: IIB,IJB    ! Horz index values of the first inner mass points
 INTEGER             :: IIE,IJE    ! Horz index values of the last inner mass points
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 5b596df31a305628ec165e938a2470739448e909..06ef3f5a035f51bdd47f49f9624035313829cc9b 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -14,14 +14,15 @@ MODULE MODI_INI_AIRCRAFT_BALLOON
 !
 INTERFACE
 !
-      SUBROUTINE INI_AIRCRAFT_BALLOON(HINIFILE,HLUOUT,              &
+      SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE,HLUOUT,             &
                                       PTSTEP, TPDTSEG, PSEGLEN,     &
                                       KRR, KSV, KKU, OUSETKE,       &
                                       PLATOR, PLONOR                )
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_TYPE_DATE
-CHARACTER (LEN=*),  INTENT(IN) :: HINIFILE ! name of
-                                          ! the initial file
+!
+TYPE(TFILEDATA),    INTENT(IN) :: TPINIFILE !Initial file
 CHARACTER(LEN=*),   INTENT(IN) :: HLUOUT  ! output listing
 REAL,               INTENT(IN) :: PTSTEP  ! time step
 TYPE(DATE_TIME),    INTENT(IN) :: TPDTSEG ! segment date and time
@@ -42,7 +43,7 @@ END INTERFACE
 END MODULE MODI_INI_AIRCRAFT_BALLOON
 !
 !     ###############################################################
-      SUBROUTINE INI_AIRCRAFT_BALLOON(HINIFILE,HLUOUT,              &
+      SUBROUTINE INI_AIRCRAFT_BALLOON(TPINIFILE,HLUOUT,             &
                                       PTSTEP, TPDTSEG, PSEGLEN,     &
                                       KRR, KSV, KKU, OUSETKE,       &
                                       PLATOR, PLONOR                )
@@ -84,31 +85,29 @@ END MODULE MODI_INI_AIRCRAFT_BALLOON
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_PARAMETERS
 USE MODD_AIRCRAFT_BALLOON
 USE MODD_CONF
+USE MODD_DIAG_FLAG
+USE MODD_DYN_n
 USE MODD_GRID
+USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_PARAM_n, ONLY : CCLOUD
+USE MODD_PARAMETERS
 !
 USE MODE_ll
+USE MODE_FIELD, ONLY : TFIELDDATA, TYPEREAL
+USE MODE_GRIDPROJ
 USE MODE_IO_ll
 USE MODE_MODELN_HANDLER
-USE MODE_GRIDPROJ
-!
-USE MODD_DIAG_FLAG
-USE MODD_DYN_n
 !
 USE MODI_INI_BALLOON
 USE MODI_INI_AIRCRAFT
 !
-USE MODD_PARAM_n, ONLY : CCLOUD
-!
 IMPLICIT NONE
 !
-!
 !*      0.1  declarations of arguments
 !
-CHARACTER (LEN=*),  INTENT(IN) :: HINIFILE ! name of
-                                          ! the initial file
+TYPE(TFILEDATA),    INTENT(IN) :: TPINIFILE !Initial file
 CHARACTER(LEN=*),   INTENT(IN) :: HLUOUT  ! output listing
 REAL,               INTENT(IN) :: PTSTEP  ! time step
 TYPE(DATE_TIME),    INTENT(IN) :: TPDTSEG ! segment date and time
@@ -129,13 +128,7 @@ INTEGER :: ISTORE ! number of storage instants
 INTEGER :: ILUOUT ! logical unit
 INTEGER :: IRESP  ! return code
 INTEGER :: JSEG   ! loop counter
-!
-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
-
+TYPE(TFIELDDATA) :: TZFIELD
 !
 !----------------------------------------------------------------------------
 !
@@ -491,26 +484,65 @@ END IF
 IF ( CPROGRAM == 'MESONH' .OR. CPROGRAM == 'SPAWN ' .OR. CPROGRAM == 'REAL  ' ) THEN
   ! read the current location in the FM_FILE
   !
-  YRECFM=ADJUSTL(ADJUSTR(TPFLYER%TITLE)//'LAT')
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ZLAT,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+  TZFIELD%CUNITS     = 'degree'
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,ZLAT,IRESP)
   !
   IF ( IRESP /= 0 ) THEN
     WRITE(ILUOUT,*) "INI_LAUCH: Initial location take for ",TPFLYER%TITLE
   ELSE
-    YRECFM=ADJUSTL(ADJUSTR(TPFLYER%TITLE)//'LON')
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,ZLON,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'LON'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'degree'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,ZLON)
     !
-    YRECFM=ADJUSTL(ADJUSTR(TPFLYER%TITLE)//'ALT')
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPFLYER%Z_CUR,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'ALT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPFLYER%Z_CUR)
     !
     TPFLYER%P_CUR   = XUNDEF
     !
-    YRECFM=ADJUSTL(ADJUSTR(TPFLYER%TITLE)//'WASCENT')
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPFLYER%WASCENT,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'WASCENT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPFLYER%WASCENT)
     !
-    YRECFM=ADJUSTL(ADJUSTR(TPFLYER%TITLE)//'RHO')
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,TPFLYER%RHO,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(TPFLYER%TITLE)//'RHO'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'kg m-3'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,TPFLYER%RHO)
     !
     CALL SM_XYHAT(PLATOR,PLONOR,&
               ZLAT,ZLON,        &
diff --git a/src/MNH/ini_cpl.f90 b/src/MNH/ini_cpl.f90
index 2688af510ebec6885de7cf0e0301fb78ca7ef58e..276b540c810db185b8c258452d946c7c4e46a70e 100644
--- a/src/MNH/ini_cpl.f90
+++ b/src/MNH/ini_cpl.f90
@@ -309,10 +309,7 @@ REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRS  ,PLBYSVS  ! in x and y-d
 !
 INTEGER                :: ILUOUT                     !  Logical unit number
                                                      ! associated with HLUOUT 
-INTEGER                :: IGRID,ILENCH,IRESP,ININAR      !  File 
-CHARACTER (LEN=16)     :: YRECFM                               ! management
-CHARACTER (LEN=100)    :: YCOMMENT                             ! variables 
-CHARACTER(LEN=2)       :: YDIR 
+INTEGER                :: IRESP
 CHARACTER (LEN=40)     :: YTITLE                     !  Title for date print 
 INTEGER                :: JCI                        !  Loop index on number of
                                                      ! coupling files
diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90
index f9f3e40c5ae8511ae6ea5c08b44e984b648be699..aa95cef9a2915f715e2a6aabc87d540828b84164 100644
--- a/src/MNH/ini_elecn.f90
+++ b/src/MNH/ini_elecn.f90
@@ -272,7 +272,7 @@ IF (HELEC(1:3) == 'ELE') THEN
 !
   ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
 !
-  CALL INI_PARAM_ELEC (TPINIFILE%CNAME, HLUOUT, CGETSVT, ZRHO00, NRR, IINTVL, &
+  CALL INI_PARAM_ELEC (TPINIFILE, CGETSVT, ZRHO00, NRR, IINTVL, &
                        ZFDINFTY, IIU, IJU, IKU)
 !
 !
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index a19b00f3b6a96dec2c24c8a17f9bab1d81110fd6..aaac7938aad33b6fabd215c1fd0769c1b7c005a5 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -893,7 +893,7 @@ IF (NSV_CHGSEND>=NSV_CHGSBEG) THEN
         IF ( SIZE(PLBYSVM,1) /= 0 ) PLBYSVM(:,:,:,JSV) = 0.
     END SELECT
   END DO
-END DO
+END IF
 ! Chemical aqueous phase scalar variables
 DO JSV = NSV_CHACBEG, NSV_CHACEND
   SELECT CASE(HGETSVM(JSV))
diff --git a/src/MNH/ini_ls.f90 b/src/MNH/ini_ls.f90
index a1c40e53d29c2b3e851536ea7f18d3ed845a55eb..2862e1f11ae863c13243258f8fe7c13a6f8d17c0 100644
--- a/src/MNH/ini_ls.f90
+++ b/src/MNH/ini_ls.f90
@@ -123,10 +123,7 @@ LOGICAL,                INTENT(IN),    OPTIONAL :: OSTEADY_DMASS         ! Md ev
 !
 !*       0.2   declarations of local variables
 !
-INTEGER             :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=16)  :: YRECFM              ! management
-CHARACTER (LEN=100) :: YCOMMENT            ! variables  
-CHARACTER(LEN=2)    :: YDIR                ! 
+INTEGER             :: IRESP
 INTEGER             :: ILUOUT              !  Logical unit number associated with HLUOUT
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index a065e0150214026fc57d91cdd720a1dfd4a117ad..deafa28c7bff89dec5883a9501bb5c2b764430bd 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -2141,9 +2141,9 @@ DEALLOCATE(XSPOWATM)
 !*      23.     BALLOON and AIRCRAFT initializations
 !              ------------------------------------
 !
-CALL INI_AIRCRAFT_BALLOON(TPINIFILE%CNAME,CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV,  &
-                          IKU,CTURB=="TKEL" ,                                        &
-                          XLATORI, XLONORI                                           )
+CALL INI_AIRCRAFT_BALLOON(TPINIFILE,CLUOUT,XTSTEP, TDTSEG, XSEGLEN, NRR, NSV,  &
+                          IKU,CTURB=="TKEL" ,                                  &
+                          XLATORI, XLONORI                                     )
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_param_elec.f90 b/src/MNH/ini_param_elec.f90
index e6b8039ebd2afdbc741727879aec52fb54a40dd0..1fcc6b36d29d68bd9644ccbcc181916ecf9626cf 100644
--- a/src/MNH/ini_param_elec.f90
+++ b/src/MNH/ini_param_elec.f90
@@ -8,12 +8,12 @@
 !
 INTERFACE
 !
-        SUBROUTINE INI_PARAM_ELEC (HINIFILE, HLUOUT, HGETSVM, PRHO00,  &
-                                   KRR, KND, PFDINFTY, IIU, IJU, IKU   )
+        SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00,       &
+                                   KRR, KND, PFDINFTY, IIU, IJU, IKU )
 !
-CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! name of the initial file
-CHARACTER (LEN=*), INTENT(IN) :: HLUOUT   ! name for output-listing
-                                          !  of nested models
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
 INTEGER, INTENT(IN) :: KND      ! Number of intervals to integrate kernels
 INTEGER, INTENT(IN) :: KRR      ! Number of moist variables
@@ -27,10 +27,10 @@ END SUBROUTINE INI_PARAM_ELEC
 END INTERFACE
 END MODULE MODI_INI_PARAM_ELEC
 !
-!      	#################################################################
-        SUBROUTINE INI_PARAM_ELEC (HINIFILE, HLUOUT, HGETSVM, PRHO00,  &
-                                   KRR, KND, PFDINFTY, IIU, IJU, IKU   )
-!      	#################################################################
+!       ##############################################################
+        SUBROUTINE INI_PARAM_ELEC (TPINIFILE, HGETSVM, PRHO00,       &
+                                   KRR, KND, PFDINFTY, IIU, IJU, IKU )
+!       ##############################################################
 !
 !!****  *INI_PARAM_ELEC* -  initialize the constants necessary 
 !!                          for the electrical scheme.
@@ -89,31 +89,30 @@ END MODULE MODI_INI_PARAM_ELEC
 !		------------
 !
 USE MODD_CST
+USE MODD_ELEC_n
+USE MODD_ELEC_DESCR
+USE MODD_ELEC_PARAM
+USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_NSV,   ONLY : NSV_ELECEND
 USE MODD_PARAMETERS
 USE MODD_PARAM_ICE
 USE MODD_RAIN_ICE_DESCR
 USE MODD_RAIN_ICE_PARAM
-USE MODD_ELEC_DESCR
-USE MODD_ELEC_PARAM
-USE MODD_ELEC_n
-USE MODD_NSV, ONLY : NSV_ELECEND
+USE MODD_VAR_ll
+!
+USE MODE_FMREAD
 !
 USE MODI_MOMG
 USE MODI_RRCOLSS
-USE MODI_RZCOLX
 USE MODI_RSCOLRG
+USE MODI_RZCOLX
 USE MODI_VQZCOLX
 !
-USE MODD_VAR_ll
-USE MODE_FMREAD
-!
 IMPLICIT NONE
 !
 !*	0.1	 Declaration of dummy arguments
-!		
-CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! name of the initial file
-CHARACTER (LEN=*), INTENT(IN) :: HLUOUT   ! name for output-listing
-                                          !  of nested models
+!
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE ! Initial file
 CHARACTER (LEN=*), DIMENSION(:),INTENT(IN)  :: HGETSVM
 INTEGER, INTENT(IN) :: KND      ! Number of intervals to integrate kernels
 INTEGER, INTENT(IN) :: KRR      ! Number of moist variables
@@ -125,18 +124,11 @@ INTEGER, INTENT(IN) :: IKU      ! Upper dimension in z direction
 !
 !*	0.2	 Declaration of local variables
 !
-REAL, DIMENSION(IIU,IJU,IKU) :: Z3D               ! 3D array used to read  data
-                                                  ! in initial file
-INTEGER :: JK                 ! Loop index
 REAL    :: ZESR               ! Mean efficiency of rain-aggregate collection
 REAL    :: ZEGS               !  
 REAL    :: ZEGR
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZMANSELL1, ZMANSELL2 ! Used to initialize
                                                           ! XMANSELL array
-INTEGER             :: IGRID,ILENCH,IRESP
-CHARACTER (LEN=100) :: YCOMMENT
-CHARACTER (LEN=16)  :: YRECFM
-CHARACTER (LEN=2)   :: YDIR
 !
 INTEGER             :: JLWC, JTEMP
 REAL, DIMENSION(:), ALLOCATABLE :: ZT, ZLWCC, ZEW
@@ -354,23 +346,10 @@ XEW(:,:,:) = 0.
 !
 SELECT CASE(HGETSVM(NSV_ELECEND))
   CASE ('READ')
-    YRECFM='NI_IAGGS'
-    YDIR='XY'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    XNI_IAGGS(:,:,:) = Z3D(:,:,:)
-    YRECFM='NI_IDRYG'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    XNI_IDRYG(:,:,:) = Z3D(:,:,:)
-    YRECFM='NI_SDRYG'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    XNI_SDRYG(:,:,:) = Z3D(:,:,:)
-    YRECFM='INDUC_CG'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-         YCOMMENT,IRESP)
-    XIND_RATE(:,:,:) = Z3D(:,:,:)
+    CALL IO_READ_FIELD(TPINIFILE,'NI_IAGGS',XNI_IAGGS)
+    CALL IO_READ_FIELD(TPINIFILE,'NI_IDRYG',XNI_IDRYG)
+    CALL IO_READ_FIELD(TPINIFILE,'NI_SDRYG',XNI_SDRYG)
+    CALL IO_READ_FIELD(TPINIFILE,'INDUC_CG',XIND_RATE)
   CASE ('INIT')
     XNI_IAGGS(:,:,:) = 0.
     XNI_IDRYG(:,:,:) = 0.
diff --git a/src/MNH/ini_radiations_ecmwf.f90 b/src/MNH/ini_radiations_ecmwf.f90
index 6c2cee16b749190123f8046af87bc2a048c17db5..c04e7dbda015ec5c925c19845699079562ccc096 100644
--- a/src/MNH/ini_radiations_ecmwf.f90
+++ b/src/MNH/ini_radiations_ecmwf.f90
@@ -279,15 +279,10 @@ REAL :: ZLAT_POLAR    ! POLAR circle LATitude
 REAL, DIMENSION(:,:),ALLOCATABLE :: ZLON          ! longitude
 REAL, DIMENSION(SIZE(PSTATM,1)) :: ZZSTAT ! half level altitudes of standard atm.
 !
-INTEGER                :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=16)     :: YRECFM              ! management
-CHARACTER (LEN=100)    :: YCOMMENT            ! variables  
-!
 INTEGER :: IINFO_ll                   ! return code of parallel routine
 INTEGER :: IIMAX_ll,IJMAX_ll          ! Number of points of
                                       ! Global physical domain
                                       ! in the x and y directions
-INTEGER :: ILUOUT   !  Logical unit number associated with HLUOUT
 !
 REAL, DIMENSION(SIZE(PTHT,1),SIZE(PTHT,2),SIZE(PTHT,3)) :: ZEXNT ! Exner function
 !
@@ -310,8 +305,6 @@ INTEGER :: ZYMD, ZHOURS   ! date for climatology initialisation
 !
 !*       0.1  INITIALIZATIONS
 !
-CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
-!
 !*       0.2  COMPUTES THE PHYSICAL SUBDOMAIN BOUNDS
 !
 CALL GET_DIM_EXT_ll ('B',IIU,IJU)
diff --git a/src/MNH/ls_coupling.f90 b/src/MNH/ls_coupling.f90
index 738a7076cbe48f6ae0f0496054c38b680c991e54..2beabcc4cd17fecf73beb4ea5b61938fba7418b3 100644
--- a/src/MNH/ls_coupling.f90
+++ b/src/MNH/ls_coupling.f90
@@ -262,10 +262,7 @@ REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PLBYRS  ,PLBYSVS  ! in x and y-d
 !
 INTEGER                :: ILUOUT                     !  Logical unit number
                                                      ! associated with HLUOUT 
-INTEGER                :: IGRID,ILENCH,IRESP   !  File 
-CHARACTER (LEN=16)     :: YRECFM                     ! management
-CHARACTER (LEN=100)    :: YCOMMENT                   ! variables  
-CHARACTER(LEN=2)       :: YDIR
+INTEGER                :: IRESP
 REAL                   :: ZLENG                      ! Interpolation length
 INTEGER                :: IIMAX,IJMAX,IKMAX       !  Dimensions  of the physical 
                                                   ! part of the arrays stored in
diff --git a/src/MNH/menu_diachro.f90 b/src/MNH/menu_diachro.f90
index b9d38087ac9f824c26037aee43c95c2c5ba9de32..342f5966c3bb32c02762a85089686bda5a8599f6 100644
--- a/src/MNH/menu_diachro.f90
+++ b/src/MNH/menu_diachro.f90
@@ -70,18 +70,15 @@ IMPLICIT NONE
 !              ---------------
 
 TYPE(TFILEDATA),  INTENT(IN) :: TPDIAFILE    ! file to write
-CHARACTER(LEN=*), INTENT(IN) :: HGROUP
 CHARACTER(LEN=*), INTENT(IN) :: HLUOUTDIA
+CHARACTER(LEN=*), INTENT(IN) :: HGROUP
 !
 !*       0.1   Local variables
 !              ---------------
 
 !
-CHARACTER(LEN=16) :: YRECFM
-CHARACTER(LEN=20) :: YCOMMENT
 CHARACTER(LEN=16),DIMENSION(1500),SAVE    :: YGROUP
-CHARACTER(LEN=28) :: YFILEDIA
-INTEGER   ::   ILENG, ILENCH, IGRID, J, JJ, IALREADY
+INTEGER   ::   ILENG, J, JJ, IALREADY
 INTEGER   ::   IRESPDIA
 INTEGER,SAVE   ::   IGROUP=0
 INTEGER,DIMENSION(:),ALLOCATABLE :: ITABCHAR
@@ -89,11 +86,8 @@ LOGICAL   ::   GPACK
 TYPE(TFIELDDATA)  :: TZFIELD
 !------------------------------------------------------------------------------
 !
-YFILEDIA = TPDIAFILE%CNAME
-!
 GPACK=LPACK
 LPACK=.FALSE.
-YCOMMENT='Nothing'
 !
 IF(HGROUP == 'END')THEN
 
@@ -109,7 +103,7 @@ IF(HGROUP == 'END')THEN
   TZFIELD%CLONGNAME  = 'MesoNH: MENU_BUDGET.DIM'
   TZFIELD%CUNITS     = ''
   TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
+  TZFIELD%CCOMMENT   = ''
   TZFIELD%NGRID      = 0
   TZFIELD%NTYPE      = TYPEINT
   TZFIELD%NDIMS      = 0
@@ -127,7 +121,7 @@ IF(HGROUP == 'END')THEN
   TZFIELD%CLONGNAME  = 'MesoNH: MENU_BUDGET'
   TZFIELD%CUNITS     = ''
   TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(YCOMMENT)
+  TZFIELD%CCOMMENT   = ''
   TZFIELD%NGRID      = 0
   TZFIELD%NTYPE      = TYPEINT
   TZFIELD%NDIMS      = 1
@@ -137,9 +131,16 @@ IF(HGROUP == 'END')THEN
 
 ELSE IF(HGROUP == 'READ')THEN
 
-  YRECFM='MENU_BUDGET.DIM'
-  CALL FMREAD(YFILEDIA,YRECFM,HLUOUTDIA,'--',ILENG,&
-  IGRID,ILENCH,YCOMMENT,IRESPDIA)
+  TZFIELD%CMNHNAME   = 'MENU_BUDGET.DIM'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MENU_BUDGET.DIM'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPDIAFILE,TZFIELD,ILENG,IRESPDIA)
   IF(IRESPDIA == -47)THEN
 !   print *,' No record MENU_BUDGET '
     LPACK=GPACK
@@ -147,11 +148,18 @@ ELSE IF(HGROUP == 'READ')THEN
   ENDIF
 
   ALLOCATE(ITABCHAR(ILENG))
-  YRECFM='MENU_BUDGET'
-  CALL FMREAD(YFILEDIA,YRECFM,HLUOUTDIA,'--',ITABCHAR, &
-  IGRID,ILENCH,YCOMMENT,IRESPDIA)
   IGROUP=ILENG/16
 ! print *,' ILENG ILENCH IGROUP ',ILENG,ILENCH,IGROUP
+  TZFIELD%CMNHNAME   = 'MENU_BUDGET'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MENU_BUDGET'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 1
+  CALL IO_READ_FIELD(TPDIAFILE,TZFIELD,ITABCHAR)
   DO JJ=1,IGROUP
     DO J = 1,16
       YGROUP(JJ)(J:J)=CHAR(ITABCHAR(16*(JJ-1)+J))
diff --git a/src/MNH/modd_lunitn.f90 b/src/MNH/modd_lunitn.f90
index 82ccd39dbfed104555a1b4b311cc76b6061f2c1c..aec2234f0deea1e79a06343f1c05c6befb9f0079 100644
--- a/src/MNH/modd_lunitn.f90
+++ b/src/MNH/modd_lunitn.f90
@@ -53,6 +53,7 @@ IMPLICIT NONE
 TYPE LUNIT_t
 ! 
   CHARACTER(LEN=28) :: CINIFILE      ! Name of the input FM-file
+  TYPE(TFILEDATA),POINTER :: TINIFILE => NULL() ! input FM-file
   CHARACTER(LEN=28) :: CINIFILEPGD   ! Name of the PGD associated to input FM-file  
   TYPE(TFILEDATA),POINTER :: TINIFILEPGD => NULL() ! PGD associated to input FM-file
   CHARACTER(LEN=24) :: COUTFILE      ! Generic name of the output FM-files
@@ -72,7 +73,8 @@ LOGICAL      , DIMENSION(JPMODELMAX),         SAVE :: LUNIT_FIRST_CALL = .TRUE.
 CHARACTER(LEN=4),SAVE :: CMASK_SURFEX='PREP'
 !
 CHARACTER(LEN=28), POINTER :: CINIFILE=>NULL()
-CHARACTER(LEN=28), POINTER :: CINIFILEPGD=>NULL()
+TYPE(TFILEDATA),   POINTER :: TINIFILE => NULL()
+CHARACTER(LEN=28), POINTER :: CINIFILEPGD =>NULL()
 TYPE(TFILEDATA),   POINTER :: TINIFILEPGD => NULL()
 CHARACTER(LEN=24), POINTER :: COUTFILE=>NULL()
 TYPE(TFILEDATA),   POINTER :: TDIAFILE=>NULL()
@@ -97,6 +99,7 @@ ENDIF
 !
 ! Current model is set to model KTO
 CINIFILE=>LUNIT_MODEL(KTO)%CINIFILE
+TINIFILE=>LUNIT_MODEL(KTO)%TINIFILE
 CINIFILEPGD=>LUNIT_MODEL(KTO)%CINIFILEPGD
 TINIFILEPGD=>LUNIT_MODEL(KTO)%TINIFILEPGD
 COUTFILE=>LUNIT_MODEL(KTO)%COUTFILE
diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90
index b86f182967cf3f80556916496a0f4c84625800b1..c4713f707d65e29dd1925217cb8d705c36165066 100644
--- a/src/MNH/prep_pgd.f90
+++ b/src/MNH/prep_pgd.f90
@@ -135,10 +135,6 @@ REAL              :: XSMOOTH_ZS = XUNDEF  ! optional uniform smooth orography fo
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK ! work array for lat and lon reshape
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LAT ! work array for lat and lon reshape
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LON ! work array for lat and lon reshape
-CHARACTER(LEN=16) :: YRECFM   ! name of record
-INTEGER           :: IGRID    ! grid location
-INTEGER           :: ILENCH   ! length of comment string
-CHARACTER(LEN=100):: YCOMMENT ! comment string
 INTEGER           :: IIMAX, IJMAX
 INTEGER           :: NHALO_MNH 
 TYPE(TFILEDATA),POINTER :: TZFILE
diff --git a/src/MNH/rain_ice_elec.f90 b/src/MNH/rain_ice_elec.f90
index d2b1c005bd8c0f10bdcaa812bfc32a28b153ed71..dddcd3e60a8b9f8ec975de2263818e8bda8f8861 100644
--- a/src/MNH/rain_ice_elec.f90
+++ b/src/MNH/rain_ice_elec.f90
@@ -457,8 +457,6 @@ REAL, DIMENSION(SIZE(XRTMIN))     :: ZRTMIN
 !
 INTEGER , DIMENSION(SIZE(GMICRO)) :: I1,I2,I3 ! Used to replace the COUNT
 INTEGER                           :: JL       ! and PACK intrinsics
-CHARACTER (LEN=100) :: YCOMMENT   ! Comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM     ! Name of the desired field in LFIFM file
 !
 LOGICAL, DIMENSION(:,:),ALLOCATABLE :: GELEC ! Logical of work for elec
 REAL, DIMENSION(:),   ALLOCATABLE :: ZRSMIN_ELEC  ! Limit value of ZRXS where charge is available
diff --git a/src/MNH/set_ref.f90 b/src/MNH/set_ref.f90
index 7fb62eebe819f4c2eb464734cb9b2dca3d718258..45f23b24eb5a39c3b859a6d6a6ae6390acc8fe1e 100644
--- a/src/MNH/set_ref.f90
+++ b/src/MNH/set_ref.f90
@@ -214,10 +214,7 @@ REAL, DIMENSION(:,:,:), INTENT(OUT) :: PRHODJ    ! rhod J
 !
 !*       0.2   declarations of local variables
 !
-INTEGER             :: IGRID,ILENCH,IRESP        !   File 
-CHARACTER (LEN=16)  :: YRECFM                    ! management
-CHARACTER (LEN=100) :: YCOMMENT                  ! variables  
-CHARACTER  (LEN=2)  :: YDIR 
+INTEGER             :: IRESP
 INTEGER             :: ILUOUT                    ! Unit number for prints
 REAL, DIMENSION(SIZE(PZZ,1),SIZE(PZZ,2),SIZE(PZZ,3)) :: ZZM 
                                                  ! height of the mass levels
diff --git a/src/MNH/set_subdomain.f90 b/src/MNH/set_subdomain.f90
index 001d82105d5fbc6bb540a7161ce53fd2b54d0170..9a30770153c3923700db6966cf5e5aa45c18ff84 100644
--- a/src/MNH/set_subdomain.f90
+++ b/src/MNH/set_subdomain.f90
@@ -12,11 +12,13 @@
       MODULE MODI_SET_SUBDOMAIN
 !     #########################
 INTERFACE
-      SUBROUTINE SET_SUBDOMAIN(HNAMELIST,HFMFILE,KXOR_DAD,KYOR_DAD, &
-                               KXOR,KYOR,KDXRATIO,KDYRATIO          )
+      SUBROUTINE SET_SUBDOMAIN(HNAMELIST,TPATMFILE,KXOR_DAD,KYOR_DAD, &
+                               KXOR,KYOR,KDXRATIO,KDYRATIO            )
+!
+USE MODD_IO_ll, ONLY : TFILEDATA
 !
 CHARACTER(LEN=28), INTENT(IN) :: HNAMELIST ! name of the namelist file
-CHARACTER(LEN=28), INTENT(IN) :: HFMFILE   ! name of the atmospheric MNH file
+TYPE(TFILEDATA),   INTENT(IN) :: TPATMFILE ! atmospheric MNH file
 INTEGER,           INTENT(OUT):: KXOR_DAD  ! XOR compared to Dad file, if any
 INTEGER,           INTENT(OUT):: KYOR_DAD  ! YOR compared to Dad file, if any
 INTEGER,           INTENT(OUT):: KXOR      ! XOR given or computed
@@ -28,10 +30,10 @@ END SUBROUTINE SET_SUBDOMAIN
 END INTERFACE
 END MODULE MODI_SET_SUBDOMAIN
 !
-!     #######################################################################
-      SUBROUTINE SET_SUBDOMAIN(HNAMELIST,HFMFILE,KXOR_DAD,KYOR_DAD, &
-                               KXOR,KYOR,KDXRATIO,KDYRATIO          )
-!     #######################################################################
+!     #################################################################
+      SUBROUTINE SET_SUBDOMAIN(HNAMELIST,TPATMFILE,KXOR_DAD,KYOR_DAD, &
+                               KXOR,KYOR,KDXRATIO,KDYRATIO            )
+!     #################################################################
 !
 !!****  *SET_SUBDOMAIN* - computes the horizontal MESO-NH domain
 !! 
@@ -93,6 +95,7 @@ USE MODE_FM
 USE MODE_IO_ll
 !
 USE MODD_CONF           ! declaration modules
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_LUNIT
 USE MODD_GRID
 USE MODD_GRID_n
@@ -109,7 +112,7 @@ IMPLICIT NONE
 !              ------------------------
 !
 CHARACTER(LEN=28), INTENT(IN) :: HNAMELIST ! name of the namelist file
-CHARACTER(LEN=28), INTENT(IN) :: HFMFILE   ! name of the atmospheric MNH file
+TYPE(TFILEDATA),   INTENT(IN) :: TPATMFILE ! atmospheric MNH file
 INTEGER,           INTENT(OUT):: KXOR_DAD  ! XOR compared to Dad file, if any
 INTEGER,           INTENT(OUT):: KYOR_DAD  ! YOR compared to Dad file, if any
 INTEGER,           INTENT(OUT):: KXOR      ! XOR given or computed
@@ -123,7 +126,7 @@ INTEGER,           INTENT(OUT):: KDYRATIO  ! DYRATIO compared to Dad file, if an
 CHARACTER(LEN=28) :: YDADFILE ! name of atmospheric file father (if any)
 INTEGER :: ILUNAM     ! logical unit for namelist file HNAMELIST
 INTEGER :: ILUOUT0    ! logical unit for listing file
-INTEGER :: IRESP      ! return-code if problems eraised
+INTEGER :: IRESP      ! return-code if problems araised
 INTEGER :: IIU,IJU    ! number of points in x,y directions of the large grid
 INTEGER :: IIINF      ! left point index
 INTEGER :: IISUP      ! right point index
@@ -136,9 +139,6 @@ INTEGER :: NIMAX,NJMAX         ! Dimensions respectively in x,  y directions
 REAL, DIMENSION(:),   ALLOCATABLE :: ZXHAT      ! = XXHAT(:)
 REAL, DIMENSION(:),   ALLOCATABLE :: ZYHAT      ! = XYHAT(:)
 !
-INTEGER             :: IGRID,ILENCH         !   File
-CHARACTER (LEN=16)  :: YRECFM               ! management
-CHARACTER (LEN=100) :: YCOMMENT             ! variables
 LOGICAL :: GFOUND     ! return code when searching namelist
 !
 !*       0.3   Declaration of namelists
@@ -231,29 +231,24 @@ WRITE(ILUOUT0,*) 'given or computed NYOR  = ',NYOR
 !*       4.1   TEST if FATHER of atmospheric MNH file exists:
 !              ---------------------------------------------
 !
-YRECFM = 'DAD_NAME'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',YDADFILE,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPATMFILE,'DAD_NAME',YDADFILE,IRESP)
 IF ( IRESP /= 0  ) YDADFILE='                          '
 !
 IF (LEN_TRIM(YDADFILE)/=0) THEN
-  YRECFM='DXRATIO'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',KDXRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPATMFILE,'DXRATIO',KDXRATIO,IRESP)
   IF ( IRESP /= 0 .OR. KDXRATIO == 0 ) THEN
     KDXRATIO=1
   END IF
   !
-  YRECFM='DYRATIO'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',KDYRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPATMFILE,'DYRATIO',KDYRATIO,IRESP)
   IF ( IRESP /= 0 .OR. KDYRATIO == 0 ) THEN
     KDYRATIO=1
   END IF
   !
-  YRECFM='XOR'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',KXOR_DAD,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPATMFILE,'XOR',KXOR,IRESP)
   IF ( IRESP /= 0 ) KXOR_DAD=1
   !
-  YRECFM='YOR'
-  CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',KYOR_DAD,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPATMFILE,'YOR',KYOR,IRESP)
   IF ( IRESP /= 0 ) KYOR_DAD=1
 END IF
 !
diff --git a/src/MNH/spawn_field2.f90 b/src/MNH/spawn_field2.f90
index d5f9fb857ab4d37cb6dfca2671fd7edc54a19a9c..e26fade2c706b71166c241420a35669e443ae160 100644
--- a/src/MNH/spawn_field2.f90
+++ b/src/MNH/spawn_field2.f90
@@ -14,10 +14,12 @@ INTERFACE
                PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,                                &
                PDTHFRC,PDRVFRC,PTHREL,PRVREL,                                  &
                PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M,                             &
-               HSONFILE,KIUSON,KJUSON,                                         &
+               TPSONFILE,KIUSON,KJUSON,                                        &
                KIB2,KJB2,KIE2,KJE2,                                            &
                KIB1,KJB1,KIE1,KJE1                                             )
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
 INTEGER,   INTENT(IN)  :: KXOR,KXEND !  horizontal position (i,j) of the ORigin and END  
 INTEGER,   INTENT(IN)  :: KYOR,KYEND ! of the model 2 domain, relative to model 1
 INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
@@ -39,7 +41,7 @@ REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PTHREL,PRVREL
 REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M
 !
            ! Arguments for spawning with 2 input files (father+son1)
-CHARACTER (LEN=*), OPTIONAL, INTENT(IN) :: HSONFILE  ! name of the input FM-file SON
+TYPE(TFILEDATA),   OPTIONAL, INTENT(IN) :: TPSONFILE ! input FM-file SON
 INTEGER,           OPTIONAL, INTENT(IN) :: KIUSON  ! upper dimensions of the
 INTEGER,           OPTIONAL, INTENT(IN) :: KJUSON  !input FM-file SON
 INTEGER,           OPTIONAL, INTENT(IN) :: KIB2,KJB2 ! indexes for common
@@ -51,14 +53,14 @@ END SUBROUTINE SPAWN_FIELD2
 END INTERFACE
 !
 END MODULE MODI_SPAWN_FIELD2
-!     ######spl
+!     ##########################################################################
       SUBROUTINE SPAWN_FIELD2(KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,HTURB,   &
                PUT,PVT,PWT,PTHVT,PRT,PHUT,PTKET,PSVT,PATC,                     &
                PSRCT,PSIGS,                                                    &
                PLSUM,PLSVM,PLSWM,PLSTHM,PLSRVM,                                &
                PDTHFRC,PDRVFRC,PTHREL,PRVREL,                                  &
                PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M,                             &
-               HSONFILE,KIUSON,KJUSON,                                         &
+               TPSONFILE,KIUSON,KJUSON,                                        &
                KIB2,KJB2,KIE2,KJE2,                                            &
                KIB1,KJB1,KIE1,KJE1                                             )
 !     ##########################################################################
@@ -151,6 +153,7 @@ END MODULE MODI_SPAWN_FIELD2
 !*       0.     DECLARATIONS
 !               ------------
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_PARAMETERS       ! Declarative modules 
 USE MODD_CONF
 USE MODD_CST
@@ -220,7 +223,7 @@ REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PDTHFRC,PDRVFRC
 REAL, DIMENSION(:,:,:,:),        INTENT(OUT) :: PTHREL,PRVREL
 REAL, DIMENSION(:,:,:),          INTENT(OUT) :: PVU_FLUX_M,PVTH_FLUX_M,PWTH_FLUX_M
            ! Arguments for spawning with 2 input files (father+son1)
-CHARACTER (LEN=*), OPTIONAL, INTENT(IN) :: HSONFILE  ! name of the input FM-file SON
+TYPE(TFILEDATA),   OPTIONAL, INTENT(IN) :: TPSONFILE ! input FM-file SON
 INTEGER,           OPTIONAL, INTENT(IN) :: KIUSON  ! upper dimensions of the
 INTEGER,           OPTIONAL, INTENT(IN) :: KJUSON  !input FM-file SON
 INTEGER,           OPTIONAL, INTENT(IN) :: KIB2,KJB2 ! indexes for common
@@ -297,7 +300,7 @@ CALL COMPUTE_THV_HU(CONF_MODEL(1)%LUSERV,XRT1,XTHT1,XPABST1,ZTHVT,ZHUT)
 !
 !*       1.2   Working arrays for reading in SON input file
 !
-IF (PRESENT(HSONFILE)) THEN
+IF (PRESENT(TPSONFILE)) THEN
   ALLOCATE(ZWORK3D(KIUSON,KJUSON,SIZE(PUT,3)))
   ALLOCATE(ZPABST1(KIE1-KIB1+1,KJE1-KJB1+1,SIZE(PUT,3)))
   ALLOCATE(ZTHT1(KIE1-KIB1+1,KJE1-KJB1+1,SIZE(PUT,3)))
@@ -723,19 +726,16 @@ END IF
 !*       2.2.3  Informations from model SON1
 ! (LS fields are not treated because they are identical in the father file)
 !
-IF (PRESENT(HSONFILE)) THEN
+IF (PRESENT(TPSONFILE)) THEN
   YDIR='XY'
   !
   !variables which always exist
   !
-  YRECFM='UT'             ! U wind component at time t
-  CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPSONFILE,'UT',ZWORK3D) ! U wind component at time t
   PUT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-  YRECFM='VT'             ! V wind component at time t
-  CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPSONFILE,'VT',ZWORK3D) ! V wind component at time t
   PVT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
-  YRECFM='WT'             ! W wind component at time t
-  CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPSONFILE,'WT',ZWORK3D) ! W wind component at time t
   PWT(KIB2:KIE2,KJB2:KJE2,:) = ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   !
   ! moist variables
@@ -744,43 +744,43 @@ IF (PRESENT(HSONFILE)) THEN
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     GUSERV=.TRUE.
     YRECFM='RVT'             ! Vapor at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RCT'             ! Cloud at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RRT'             ! Rain at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RIT'             ! Ice at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RST'             ! Snow at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RGT'             ! Graupel at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
   IF (IRR<=CONF_MODEL(1)%NRR) THEN
     YRECFM='RHT'             ! Hail at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) ZRT1(:,:,:,IRR)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     IF(IRESP==0) IRR=IRR+1
   END IF
@@ -789,10 +789,10 @@ IF (PRESENT(HSONFILE)) THEN
   WRITE(ILUOUT,FMT=*) '    ',CONF_MODEL(1)%NRR,' moist variables in model1 and model2, ',    &
                              IRR,' moist variables in input SON'
   YRECFM='THT'               ! Theta at time t
-  CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
   ZTHT1(:,:,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   YRECFM='PABST'             ! Pressure at time t
-  CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
   ZPABST1(:,:,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   !
   CALL COMPUTE_THV_HU(GUSERV,ZRT1,ZTHT1,ZPABST1,ZTHVT1,ZHUT1)
@@ -807,7 +807,7 @@ IF (PRESENT(HSONFILE)) THEN
   !
   IF (HTURB/='NONE') THEN
     YRECFM='TKET'             ! Turbulence Kinetic Energy at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP==0) PTKET(KIB2:KIE2,KJB2:KJE2,:)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   END IF
   !
@@ -816,13 +816,13 @@ IF (PRESENT(HSONFILE)) THEN
   IF (NSV /= 0) THEN
     DO JSV = 1, NSV_USER      ! Users Scalar Variables
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_C2R2BEG,NSV_C2R2END  ! C2R2 Scalar Variables
       YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
@@ -878,92 +878,92 @@ IF (PRESENT(HSONFILE)) THEN
          YRECFM_T=TRIM(CLIMA_COLD_NAMES(5))//'T'
       END IF
 ! time t
-      CALL FMREAD(HSONFILE,YRECFM_T,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM_T,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
 !
     DO JSV = NSV_ELECBEG,NSV_ELECEND  ! ELEC Scalar Variables
       YRECFM=TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_CHEMBEG,NSV_CHEMEND ! Chemical Scalar Variables
       YRECFM=TRIM(CNAMES(JSV-NSV_CHEMBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_CHICBEG,NSV_CHICEND ! Ice phase chemical Scalar Variables
       YRECFM=TRIM(CICNAMES(JSV-NSV_CHICBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_AERBEG,NSV_AEREND ! Orilam Scalar Variables
       YRECFM=TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_DSTBEG,NSV_DSTEND ! Dust Scalar Variables
       YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_SLTBEG,NSV_SLTEND ! Sea Salt Scalar Variables
       YRECFM=TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_LGBEG,NSV_LGEND     ! LG Scalar Variables
       YRECFM=TRIM(CLGNAMES(JSV-NSV_LGBEG+1))//'T'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_LNOXBEG,NSV_LNOXEND     ! LNOx Scalar Variables
       YRECFM='LINOX'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = NSV_PPBEG,NSV_PPEND     ! Passive scalar variables
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
 #ifdef MNH_FOREFIRE
     DO JSV = NSV_FFBEG,NSV_FFEND     ! ForeFire variables
       WRITE(YRECFM,'(A3,I3.3)')'SVM',JSV
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
 #endif
     DO JSV = NSV_CSBEG,NSV_CSEND     ! Passive scalar variables
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
       IF(IRESP==0) PSVT(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
     DO JSV = 1,NSV_PP               ! Passive scalar variables
       YRECFM='ATC'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
       IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
 #ifdef MNH_FOREFIRE
    DO JSV = 1,NSV_FF               ! ForeFire variables
       YRECFM='ATC'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
       IF(IRESP==0) PATC(KIB2:KIE2,KJB2:KJE2,:,JSV)=ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
     END DO
 #endif
@@ -973,17 +973,17 @@ IF (PRESENT(HSONFILE)) THEN
   !
   IF (HTURB /= 'NONE' .AND. IRR>1) THEN
     YRECFM='SRCT'                  ! turbulent flux SRC at time t
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF( IRESP /= 0 ) THEN
       YRECFM='SRC'
-      CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,          &
+      CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,          &
                   YCOMMENT,IRESP)
     END IF
     IF(IRESP == 0) PSRCT(KIB2:KIE2,KJB2:KJE2,:) =                    &
                                         ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
 
     YRECFM='SIGS'                  ! subgrid condensation
-    CALL FMREAD(HSONFILE,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FMREAD(TPSONFILE%CNAME,YRECFM,CLUOUT,YDIR,ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
     IF(IRESP == 0) PSIGS(KIB2:KIE2,KJB2:KJE2,:) =                    &
                                         ZWORK3D(KIB1:KIE1,KJB1:KJE1,:)
   END IF
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index f994bf1623167412bc6023da26ff5f20befc0319..48813da8938cf97d39b159e47c861afa33ebee7e 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -315,9 +315,6 @@ LOGICAL,               INTENT(IN) :: OSPAWN_SURF  ! flag to spawn surface fields
 INTEGER :: IRESP    ! Return codes in FM routines
 INTEGER :: ILUOUT   ! Logical unit number for the output listing 
 INTEGER :: INPRAR   ! Number of articles predicted in the LFIFM file
-INTEGER :: ININAR   ! Number of articles present in the LFIFM file
-INTEGER             :: IGRID,ILENCH   !   File management
-CHARACTER (LEN=100) :: YCOMMENT       ! variables
 !
 CHARACTER (LEN=32) :: YDESFM          ! Name of the desfm part of the FM-file
 !  
@@ -502,15 +499,13 @@ IF (LEN_TRIM(HSONFILE) /= 0 ) THEN
   WRITE(ILUOUT,*) 'SPAWN_MODEL2: spawning with a SON input file :',TRIM(HSONFILE)
   CALL IO_FILE_ADD2LIST(TZSONFILE,TRIM(HSONFILE),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
   CALL IO_FILE_OPEN_ll(TZSONFILE,CLUOUT,IRESP)
-  CALL FMREAD(HSONFILE,'DAD_NAME',CLUOUT,'--',YDAD_SON,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'IMAX',CLUOUT,'--',IIMAXSON,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'JMAX',CLUOUT,'--',IJMAXSON,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'XOR',CLUOUT,'--',IXORSON,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'YOR',CLUOUT,'--',IYORSON,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'DXRATIO',CLUOUT,'--',IDXRATIOSON,IGRID,ILENCH,       &
-            YCOMMENT,IRESP)
-  CALL FMREAD(HSONFILE,'DYRATIO',CLUOUT,'--',IDYRATIOSON,IGRID,ILENCH,       &
-            YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZSONFILE,'DAD_NAME',YDAD_SON)
+  CALL IO_READ_FIELD(TZSONFILE,'IMAX',    IIMAXSON)
+  CALL IO_READ_FIELD(TZSONFILE,'JMAX',    IJMAXSON)
+  CALL IO_READ_FIELD(TZSONFILE,'XOR',     IXORSON)
+  CALL IO_READ_FIELD(TZSONFILE,'YOR',     IYORSON)
+  CALL IO_READ_FIELD(TZSONFILE,'DXRATIO', IDXRATIOSON)
+  CALL IO_READ_FIELD(TZSONFILE,'DYRATIO', IDYRATIOSON)
   !
   IF (ADJUSTL(ADJUSTR(YDAD_SON)).NE.ADJUSTL(ADJUSTR(CMY_NAME(1)))) THEN 
     WRITE(ILUOUT,*) 'SPAWN_MODEL2: DAD of SON file is different from the one of model2'
@@ -1149,7 +1144,7 @@ ELSE
                  XLSUM,XLSVM,XLSWM,XLSTHM,XLSRVM,                              &
                  XDTHFRC,XDRVFRC,XTHREL,XRVREL,                                &                 
                  XVU_FLUX_M, XVTH_FLUX_M,XWTH_FLUX_M,                          &
-                 HSONFILE,IIUSON,IJUSON,                                       &
+                 TZSONFILE,IIUSON,IJUSON,                                      &
                  IIB2,IJB2,IIE2,IJE2,                                          &
                  IIB1,IJB1,IIE1,IJE1                                           )
   CALL MPPDB_CHECK3D(XUT,"SPAWN_M2 after SPAWN_FIELD2:XUT",PRECISION)
@@ -1204,7 +1199,7 @@ CALL SPAWN_PRESSURE2(NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
 !
 IF (.NOT.GNOSON) THEN
   ALLOCATE(ZWORK3D(IIUSON,IJUSON,IKU))
-  CALL FMREAD(HSONFILE,'PABST',CLUOUT,'XY',ZWORK3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZSONFILE,'PABST',ZWORK3D)
   XPABST(IIB2:IIE2,IJB2:IJE2,:) = ZWORK3D(IIB1:IIE1,IJB1:IJE1,:)
   DEALLOCATE(ZWORK3D)
 END IF
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index 978b1d23381526ef20927e7a1a1b181b9e27cc26..959be81109b4ca88350a71dd444a8c5b59122e04 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -133,12 +133,6 @@ TYPE(TFILEDATA),   INTENT(IN) :: TPFILE ! File characteristics
 !
 INTEGER            :: ILUOUT        ! logical unit
 INTEGER            :: IRESP         ! IRESP  : return-code for fmwrit
-INTEGER            :: IGRID         ! IGRID : grid indicator
-CHARACTER (LEN=2)  :: YDIR          ! Type of the data field
-INTEGER            :: ILENCH        ! ILENCH : length of comment string 
-CHARACTER(LEN=28)  :: YFMFILE       ! Name of FM-file to write
-CHARACTER(LEN=16)  :: YRECFM        ! Name of the article to be written
-CHARACTER(LEN=100) :: YCOMMENT      ! Comment string
 !
 INTEGER            :: IRR           ! Index for moist variables
 INTEGER            :: JRR,JSV       ! loop index for moist and scalar variables
@@ -164,8 +158,6 @@ CALL FMLOOK_ll(CLUOUT,CLUOUT,ILUOUT,IRESP)
 !
 IMI = GET_CURRENT_MODEL_INDEX()
 !
-YFMFILE = TPFILE%CNAME
-!
 !        2.  WRITE THE DIMENSION OF LB FIELDS
 !            --------------------------------
 !
@@ -190,11 +182,6 @@ IF(NSIZELBY_ll  /= 0) CALL IO_WRITE_FIELD_LB(TPFILE,'LBYTHM',NSIZELBY_ll,XLBYTHM
 !*        4  LB-TKE
 !            ------
 !
-IGRID=1
-YDIR='--'
-YCOMMENT=''
-ILENCH=LEN(YCOMMENT)
-!
 IF(CTURB/='NONE') THEN
   CALL IO_WRITE_FIELD(TPFILE,'HORELAX_TKE',LHORELAX_TKE)
 !
@@ -276,7 +263,6 @@ IF (NSV >=1) THEN
   TZFIELD%NDIMS      = 0
   CALL IO_WRITE_FIELD(TPFILE,TZFIELD,GHORELAX_SV)
 !
-  IGRID=1
   IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2
   IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2
   IF (NSV_USER>0) THEN
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index feb30eec2ab37f2f5854e3b351400ddf5a131ae2..2fbb05a59bdd9c458dc9876dcb48301cf3694926 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -94,11 +94,6 @@ INTEGER :: IRESP    ! return code for I/O
 INTEGER :: ILUOUT0
 INTEGER :: ILUNAM
 INTEGER :: IINFO_ll
-INTEGER :: ININAR
-INTEGER :: IGRID
-INTEGER :: ILENCH
-CHARACTER (LEN=16) :: YRECFM   
-CHARACTER(LEN=100) :: YCOMMENT
 CHARACTER(LEN=28)  :: YZOOMFILE             ! name of the output file
 CHARACTER(LEN=2)   :: YZOOMNBR
 CHARACTER(LEN=28)  :: YMY_NAME,YDAD_NAME
@@ -171,15 +166,13 @@ CALL READ_HGRID(1,TZPGDFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
 ! NIMAX, NJMAX: size of input domain
 ALLOCATE(ZZS1  (NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
 ALLOCATE(ZZSMT1(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
-YRECFM='ZS'
-CALL FMREAD(CPGDFILE,YRECFM,CLUOUT0,'XY',ZZS1,IGRID,ILENCH,YCOMMENT,IRESP)
-YRECFM='ZSMT'
-CALL FMREAD(CPGDFILE,YRECFM,CLUOUT0,'XY',ZZSMT1,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZPGDFILE,'ZS',ZZS1)
+CALL IO_READ_FIELD(TZPGDFILE,'ZSMT',ZZSMT1)
 !
 !*    2.3     Define subdomain
 !             ----------------
 !
-CALL SET_SUBDOMAIN(YNAMELIST,CPGDFILE,IXOR_DAD,IYOR_DAD,IXOR,IYOR,IDXRATIO,IDYRATIO)
+CALL SET_SUBDOMAIN(YNAMELIST,TZPGDFILE,IXOR_DAD,IYOR_DAD,IXOR,IYOR,IDXRATIO,IDYRATIO)
 ! NIMAX, NJMAX: size of output domain
 !
 CALL SET_JP_ll(JPMODELMAX,JPHEXT,JPVEXT,JPHEXT)
@@ -214,8 +207,7 @@ CALL WRITE_HGRID(1,TZZOOMFILE)
 !*    2.5     Preparation of surface physiographic fields
 !             -------------------------------------------
 !
-CALL FMREAD(CPGDFILE,'SURF        ',CLUOUT0,'--',CSURF,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMCLOS_ll(CPGDFILE,'KEEP',CLUOUT0,IRESP)
+CALL IO_READ_FIELD(TZPGDFILE,'SURF',CSURF)
 !
 !
 IF (CSURF=='EXTE') THEN