From aede1160bdb5158e9facd5cab28cf61d8aab136d Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Fri, 18 Aug 2017 15:37:54 +0200
Subject: [PATCH] Philippe 18/08/2017: IO: use IO_READ_FIELD for several
 fields, IO_FILE_OPEN and IO_FILE_CLOSE for several files

---
 src/LIB/SURCOUCHE/src/mode_field.f90   |  24 ++
 src/MNH/get_nb_procio_read_mnh.f90     |   6 +-
 src/MNH/ini_elecn.f90                  |  46 +--
 src/MNH/ini_lb.f90                     |  80 ++--
 src/MNH/ini_micron.f90                 |  22 +-
 src/MNH/ini_modeln.f90                 |  18 +-
 src/MNH/ini_radiations.f90             | 107 ++----
 src/MNH/ini_segn.f90                   |   9 +-
 src/MNH/ini_size_spawn.f90             | 157 +++-----
 src/MNH/init_mnh.f90                   |   2 +-
 src/MNH/latlon_to_xy.f90               |  15 +-
 src/MNH/mnh2lpdm_ini.f90               |  41 +-
 src/MNH/mnhclose_aux_io_surf.f90       |   4 +-
 src/MNH/mnhend_io_surfn.f90            |   3 +-
 src/MNH/mnhinit_io_surfn.f90           |  12 +-
 src/MNH/mnhopen_aux_io_surf.f90        |  27 +-
 src/MNH/mnhread_zs_dummyn.f90          |  65 ++--
 src/MNH/modd_io_surf_mnh.f90           |   5 +-
 src/MNH/modd_lunitn.f90                |   3 +
 src/MNH/open_prc_files.f90             |  44 ++-
 src/MNH/prep_ideal_case.f90            |  32 +-
 src/MNH/prep_nest_pgd.f90              |  26 +-
 src/MNH/prep_real_case.f90             |  21 +-
 src/MNH/prep_surf_mnh.f90              |   4 +-
 src/MNH/prep_surfex.f90                |   7 +-
 src/MNH/read_all_data_grib_case.f90    |  46 +--
 src/MNH/read_all_data_mesonh_case.f90  |  41 +-
 src/MNH/read_dummy_gr_fieldn.f90       | 121 +++---
 src/MNH/read_field.f90                 | 116 +++---
 src/MNH/read_grid_time_mesonh_case.f90 |  21 +-
 src/MNH/read_hgrid.f90                 |  86 ++---
 src/MNH/read_hgridn.f90                | 101 ++---
 src/MNH/read_precip_field.f90          | 211 ++++++-----
 src/MNH/read_surf_mnh.f90              | 498 +++++++++++++++++--------
 src/MNH/spawn_model2.f90               |  19 +-
 src/MNH/spawn_surf2_rain.f90           |  74 ++--
 src/MNH/spawning.f90                   |   2 +-
 src/MNH/write_surf_mnh.f90             |   5 +-
 src/MNH/xy_to_latlon.f90               |  14 +-
 src/MNH/zoom_pgd.f90                   |   9 +-
 src/MNH/zsmt_pgd.f90                   |  11 +-
 41 files changed, 1142 insertions(+), 1013 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 6f96aad63..97a59426a 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -168,6 +168,30 @@ TFIELDLIST(IDX)%NDIMS      = 0
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'VERSION'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'SURFEX version (without BUG)'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = '--'
+TFIELDLIST(IDX)%CCOMMENT   = ''
+TFIELDLIST(IDX)%NGRID      = 0
+TFIELDLIST(IDX)%NTYPE      = TYPEINT
+TFIELDLIST(IDX)%NDIMS      = 0
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'BUG'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'SURFEX bugfix number'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = ''
+TFIELDLIST(IDX)%CCOMMENT   = ''
+TFIELDLIST(IDX)%NGRID      = 0
+TFIELDLIST(IDX)%NTYPE      = TYPEINT
+TFIELDLIST(IDX)%NDIMS      = 0
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'PROGRAM'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH family: used program'
diff --git a/src/MNH/get_nb_procio_read_mnh.f90 b/src/MNH/get_nb_procio_read_mnh.f90
index 0d5cec1c4..ea9fa17af 100644
--- a/src/MNH/get_nb_procio_read_mnh.f90
+++ b/src/MNH/get_nb_procio_read_mnh.f90
@@ -37,7 +37,7 @@
 !-------------------------------------------------------------------------------
 !
 USE MODE_FD_ll,        ONLY : GETFD,JPFINL,FD_ll
-USE MODD_IO_SURF_MNH,  ONLY : COUT, CFILE
+USE MODD_IO_SURF_MNH,  ONLY : COUT, TPINFILE
 !
 IMPLICIT NONE
 !
@@ -61,7 +61,7 @@ INTEGER                      :: ILUPRI
 !*      1. get the number of processes used for IO
 !
 IRESP = 0
-YFNLFI=TRIM(ADJUSTL(CFILE))//'.lfi'
+YFNLFI=TRIM(ADJUSTL(TPINFILE%CNAME))//'.lfi'
 !
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
@@ -74,7 +74,7 @@ END IF
 IF (IRESP.NE.0) THEN
   CALL FMLOOK_ll(COUT,COUT,ILUPRI,IRESP)
   WRITE (ILUPRI,*) ' exit from GET_NB_PROCIO_READ_MNH with RESP:',IRESP
-  WRITE (ILUPRI,*) '   | CFILE = ',CFILE
+  WRITE (ILUPRI,*) '   | TPINFILE%CNAME = ',TRIM(ADJUSTL(TPINFILE%CNAME))
 END IF
 KRESP = IRESP
 !
diff --git a/src/MNH/ini_elecn.f90 b/src/MNH/ini_elecn.f90
index eaddafac3..f9f3e40c5 100644
--- a/src/MNH/ini_elecn.f90
+++ b/src/MNH/ini_elecn.f90
@@ -12,17 +12,19 @@
 !     ######################
 !
 INTERFACE
-      SUBROUTINE INI_ELEC_n (KLUOUT, HELEC, HCLOUD, HLUOUT, HINIFILE, &
-                             PTSTEP, PZZ,                             &
-                             PDXX, PDYY, PDZZ, PDZX, PDZY             )
+      SUBROUTINE INI_ELEC_n (KLUOUT, HELEC, HCLOUD, HLUOUT, TPINIFILE, &
+                             PTSTEP, PZZ,                              &
+                             PDXX, PDYY, PDZZ, PDZX, PDZY              )
+!
+USE MODD_IO_ll,  ONLY : TFILEDATA
 !
 INTEGER,           INTENT(IN) :: KLUOUT   ! Logical unit number for prints
 CHARACTER (LEN=4), INTENT(IN) :: HELEC    ! atmospheric electricity scheme
 CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
 CHARACTER (LEN=*), INTENT(IN) :: HLUOUT   ! name for output-listing
                                           !  of nested models
-CHARACTER (LEN=*), INTENT(IN) :: HINIFILE ! name of the initial file
-REAL,              INTENT(IN) :: PTSTEP   ! Time STEP  
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
+REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
 !
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ     ! height z
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX    ! metric coefficient dxx
@@ -35,11 +37,11 @@ END SUBROUTINE INI_ELEC_n
 END INTERFACE
 END MODULE MODI_INI_ELEC_n
 !
-!     ################################################################
-      SUBROUTINE INI_ELEC_n(KLUOUT, HELEC, HCLOUD, HLUOUT, HINIFILE, &
-                            PTSTEP, PZZ,                             &
-                            PDXX, PDYY, PDZZ, PDZX, PDZY             )
-!     ################################################################
+!     #################################################################
+      SUBROUTINE INI_ELEC_n(KLUOUT, HELEC, HCLOUD, HLUOUT, TPINIFILE, &
+                            PTSTEP, PZZ,                              &
+                            PDXX, PDYY, PDZZ, PDZX, PDZY              )
+!     #################################################################
 !
 !!    PURPOSE
 !!    -------
@@ -91,6 +93,7 @@ USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll
 USE MODD_ELEC_DESCR
 USE MODD_ELEC_n, ONLY : XRHOM_E, XAF_E, XCF_E, XBFY_E, XBFB_E, XBF_SXP2_YP1_Z_E
 USE MODD_CONF_n, ONLY : NRR
+USE MODD_IO_ll,  ONLY : TFILEDATA
 USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT
 USE MODD_CST
 USE MODD_CONF, ONLY : CEQNSYS,CCONF,CPROGRAM
@@ -126,13 +129,13 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of dummy arguments
 !
-INTEGER,            INTENT(IN)  :: KLUOUT    ! Logical unit number for prints
-CHARACTER (LEN=4),  INTENT(IN)  :: HELEC    ! atmospheric electricity scheme
-CHARACTER (LEN=4),  INTENT(IN)  :: HCLOUD   ! microphysics scheme
-CHARACTER (LEN=*),  INTENT(IN)  :: HLUOUT   ! name for output-listing
-                                            !  of nested models
-CHARACTER (LEN=*), INTENT(IN)  :: HINIFILE ! name of the initial file
-REAL,              INTENT(IN)  :: PTSTEP   ! Time STEP 
+INTEGER,           INTENT(IN) :: KLUOUT   ! Logical unit number for prints
+CHARACTER (LEN=4), INTENT(IN) :: HELEC    ! atmospheric electricity scheme
+CHARACTER (LEN=4), INTENT(IN) :: HCLOUD   ! microphysics scheme
+CHARACTER (LEN=*), INTENT(IN) :: HLUOUT   ! name for output-listing
+                                          !  of nested models
+TYPE(TFILEDATA),   INTENT(IN) :: TPINIFILE! Initial file
+REAL,              INTENT(IN) :: PTSTEP   ! Time STEP
 !
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PZZ     ! height z
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDXX    ! metric coefficient dxx
@@ -141,7 +144,6 @@ REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZZ    ! metric coefficient dzz
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZX    ! metric coefficient dzx
 REAL, DIMENSION(:,:,:), INTENT(IN) :: PDZY    ! metric coefficient dzy
 !
-!
 !*       0.2   declarations of local variables
 !
 INTEGER :: IRESP   ! Return code of FM routines 
@@ -228,9 +230,9 @@ IF(SIZE(XINPRR) == 0) RETURN
 !*       2.    Initialize MODD_PRECIP_n variables
 !              -----------------------------------
 !
-CALL READ_PRECIP_FIELD (HINIFILE, HLUOUT, CPROGRAM, CCONF,                   &
-                        CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH,   &
-                        XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D, &
+CALL READ_PRECIP_FIELD (TPINIFILE, HLUOUT, CPROGRAM, CCONF,                   &
+                        CGETINPRC,CGETINPRR,CGETINPRS,CGETINPRG,CGETINPRH,    &
+                        XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,  &
                         XACPRR, XINPRS, XACPRS, XINPRG, XACPRG, XINPRH, XACPRH)
 !
 !
@@ -270,7 +272,7 @@ IF (HELEC(1:3) == 'ELE') THEN
 !
   ZRHO00 = XP00 / (XRD * XTHVREFZ(IKB))
 !
-  CALL INI_PARAM_ELEC (HINIFILE, HLUOUT, CGETSVT, ZRHO00, NRR, IINTVL, &
+  CALL INI_PARAM_ELEC (TPINIFILE%CNAME, HLUOUT, CGETSVT, ZRHO00, NRR, IINTVL, &
                        ZFDINFTY, IIU, IJU, IKU)
 !
 !
diff --git a/src/MNH/ini_lb.f90 b/src/MNH/ini_lb.f90
index fe105644b..fd2dc11d6 100644
--- a/src/MNH/ini_lb.f90
+++ b/src/MNH/ini_lb.f90
@@ -338,9 +338,7 @@ CASE('READ')
       STOP
     ENDIF
   ELSE
-    YRECFM = 'HORELAX_TKE'
-    YDIR='--'      
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,GHORELAX_TKE,IGRID,ILENCH,YCOMMENT,IRESP)        
+    CALL IO_READ_FIELD(TPINIFILE,'HORELAX_TKE',GHORELAX_TKE)
     IF (GHORELAX_TKE) THEN 
       IRIMX=(KSIZELBXTKE_ll-2*JPHEXT)/2   
       IRIMY=(KSIZELBYTKE_ll-2*JPHEXT)/2
@@ -353,18 +351,12 @@ CASE('READ')
       IL3DY=2*JPHEXT ! 2
     ENDIF
 !
-    YRECFM='LBXTKEM'
-    IF (KSIZELBXTKE_ll /= 0) THEN  
-      YDIRLB='LBX'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXTKEM,IRIMX,IL3DX,IGRID,&
-           & ILENCH,YCOMMENT,IRESP)
+    IF (KSIZELBXTKE_ll /= 0) THEN
+      CALL IO_READ_FIELD_LB(TPINIFILE,'LBXTKEM',IL3DX,IRIMX,PLBXTKEM)
     END IF
 !
-    YRECFM='LBYTKEM'
     IF (KSIZELBYTKE_ll /= 0) THEN  
-      YDIRLB='LBY'
-      CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYTKEM,IRIMY,IL3DY,IGRID,&
-           & ILENCH,YCOMMENT,IRESP)
+      CALL IO_READ_FIELD_LB(TPINIFILE,'LBYTKEM',IL3DY,IRIMY,PLBYTKEM)
     END IF
   ENDIF
 CASE('INIT')
@@ -494,9 +486,17 @@ END IF
 !
 IF (KSV > 0) THEN 
   IF (ANY(HGETSVM(1:KSV)=='READ')) THEN
-    YRECFM = 'HORELAX_SV'
-    YDIR='--'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,GHORELAX_SV,IGRID,ILENCH,YCOMMENT,IRESP)  
+    TZFIELD%CMNHNAME   = 'HORELAX_SV'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: HORELAX_SV'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%CLBTYPE    = 'NONE'
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPELOG
+    TZFIELD%NDIMS      = 0
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,GHORELAX_SV)
     IF ( GHORELAX_SV ) THEN
       IRIMX=(KSIZELBXSV_ll-2*JPHEXT)/2   
       IRIMY=(KSIZELBYSV_ll-2*JPHEXT)/2
@@ -667,12 +667,20 @@ IF (CCLOUD=='LIMA' ) THEN
   DO JSV = NSV_LIMA_CCN_FREE,NSV_LIMA_CCN_FREE+NMOD_CCN-1
     SELECT CASE(HGETSVM(JSV))
     CASE ('READ')
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'kg-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
       IF ( KSIZELBXSV_ll /= 0 ) THEN
-        YRECFM = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
-        YDIRLB='LBX'
-        CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
+        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
@@ -690,10 +698,11 @@ IF (CCLOUD=='LIMA' ) THEN
       END IF
 !
       IF (KSIZELBYSV_ll  /= 0 ) THEN
-        YRECFM = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
-        YDIRLB='LBY'
-        CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-             & IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_WARM_NAMES(3))//INDICE)
+        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
@@ -717,12 +726,20 @@ IF (CCLOUD=='LIMA' ) THEN
   DO JSV = NSV_LIMA_IFN_FREE,NSV_LIMA_IFN_FREE+NMOD_IFN-1
     SELECT CASE(HGETSVM(JSV))
     CASE ('READ')
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'kg-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
       IF ( KSIZELBXSV_ll /= 0 ) THEN
-        YRECFM = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-        YDIRLB='LBX'
-        CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBXSVM(:,:,:,JSV),IRIMX,IL3DX,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
+        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
@@ -740,10 +757,11 @@ IF (CCLOUD=='LIMA' ) THEN
       END IF
 !
       IF (KSIZELBYSV_ll  /= 0 ) THEN
-        YRECFM = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
-        YDIRLB='LBY'
-        CALL FMREAD_LB(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIRLB,PLBYSVM(:,:,:,JSV),IRIMY,IL3DY,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(UPCASE(CLIMA_COLD_NAMES(2))//INDICE)
+        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
diff --git a/src/MNH/ini_micron.f90 b/src/MNH/ini_micron.f90
index 17154b38c..ae6dfbb6c 100644
--- a/src/MNH/ini_micron.f90
+++ b/src/MNH/ini_micron.f90
@@ -13,18 +13,21 @@
 !      ########################
 !
 INTERFACE
-      SUBROUTINE INI_MICRO_n  ( KLUOUT )
+      SUBROUTINE INI_MICRO_n  ( TPINIFILE,KLUOUT )
 !
-INTEGER,                 INTENT(IN) :: KLUOUT    ! Logical unit number for prints
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file
+INTEGER,         INTENT(IN) :: KLUOUT    ! Logical unit number for prints
 !
 END SUBROUTINE INI_MICRO_n 
 !
 END INTERFACE
 !
 END MODULE MODI_INI_MICRO_n 
-!     ##################################
-      SUBROUTINE  INI_MICRO_n ( KLUOUT )
-!     ##################################
+!     ############################################
+      SUBROUTINE INI_MICRO_n  ( TPINIFILE,KLUOUT )
+!     ############################################
 !
 !
 !!****  *INI_MICRO_n* allocates and fills MODD_PRECIP_n variables 
@@ -60,7 +63,8 @@ END MODULE MODI_INI_MICRO_n
 !
 !
 USE MODD_CONF, ONLY : CCONF,CPROGRAM       
-USE MODD_LUNIT_n, ONLY : CINIFILE,CLUOUT
+USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_LUNIT_n, ONLY : CLUOUT
 USE MODD_GET_n, ONLY : CGETRCT,CGETRRT, CGETRST, CGETRGT, CGETRHT, CGETCLOUD
 USE MODD_DIM_n, ONLY : NIMAX_ll, NJMAX_ll
 USE MODD_PARAMETERS, ONLY : JPVEXT, JPHEXT
@@ -111,8 +115,8 @@ IMPLICIT NONE
 !
 !*       0.1   Declarations of dummy arguments :
 !
-INTEGER,                 INTENT(IN) :: KLUOUT    ! Logical unit number for prints
-!
+TYPE(TFILEDATA), INTENT(IN) :: TPINIFILE ! Initial file
+INTEGER,         INTENT(IN) :: KLUOUT    ! Logical unit number for prints
 !
 !       0.2  declaration of local variables
 !
@@ -238,7 +242,7 @@ END IF
 !*       3.    INITIALIZE MODD_PRECIP_n variables
 !              ----------------------------------
 !
-CALL READ_PRECIP_FIELD(CINIFILE,CLUOUT,CPROGRAM,CCONF,                &
+CALL READ_PRECIP_FIELD(TPINIFILE,CLUOUT,CPROGRAM,CCONF,               &
                   CGETRCT,CGETRRT,CGETRST,CGETRGT,CGETRHT,            &
                   XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,&
                   XACPRR,XINPRS,XACPRS,XINPRG,XACPRG, XINPRH,XACPRH )           
diff --git a/src/MNH/ini_modeln.f90 b/src/MNH/ini_modeln.f90
index dddf34dde..df4fff5cc 100644
--- a/src/MNH/ini_modeln.f90
+++ b/src/MNH/ini_modeln.f90
@@ -1686,7 +1686,7 @@ END IF
 !               ----------------------------
 !
 IF (CELEC == 'NONE') THEN
-  CALL INI_MICRO_n(ILUOUT)
+  CALL INI_MICRO_n(TPINIFILE,ILUOUT)
 !
 !-------------------------------------------------------------------------------
 !
@@ -1694,9 +1694,9 @@ IF (CELEC == 'NONE') THEN
 !               --------------------------------------
 !
 ELSE
-  CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, HLUOUT, CINIFILE, &
-                  XTSTEP, XZZ,                             &
-                  XDXX, XDYY, XDZZ, XDZX, XDZY             )
+  CALL INI_ELEC_n(ILUOUT, CELEC, CCLOUD, HLUOUT, TPINIFILE, &
+                  XTSTEP, XZZ,                              &
+                  XDXX, XDYY, XDZZ, XDZX, XDZY              )
 !
   WRITE (UNIT=ILUOUT,&
   FMT='(/,"ELECTRIC VARIABLES ARE BETWEEN INDEX",I2," AND ",I2)')&
@@ -1883,7 +1883,7 @@ IF (CRAD   /= 'NONE') THEN
   ELSE
     GINIRAD  =.FALSE.
   END IF
-  CALL INI_RADIATIONS(TPINIFILE%CNAME,HLUOUT,GINIRAD,TDTCUR,TDTEXP,XZZ, &
+  CALL INI_RADIATIONS(TPINIFILE,HLUOUT,GINIRAD,TDTCUR,TDTEXP,XZZ, &
                       XDXX, XDYY,                         &
                       XSINDEL,XCOSDEL,XTSIDER,XCORSOL,    &
                       XSLOPANG,XSLOPAZI,                  &
@@ -1949,7 +1949,8 @@ END IF
 IF (CSURF=='EXTE' .AND. (CPROGRAM=='MESONH' .OR. CPROGRAM=='DIAG  ')) THEN
   ! ouverture du fichier PGD
   IF  ( LEN_TRIM(CINIFILEPGD) > 0 ) THEN
-    CALL FMOPEN_ll(CINIFILEPGD,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.) 
+    CALL IO_FILE_ADD2LIST(TINIFILEPGD,TRIM(CINIFILEPGD),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
+    CALL IO_FILE_OPEN_ll(TINIFILEPGD,HLUOUT,IRESP,OPARALLELIO=.FALSE.)
     IF (IRESP/=0) THEN
       WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
       WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNITn"
@@ -1988,7 +1989,8 @@ ELSE
 END IF
 IF (CSURF=='EXTE' .AND. (CPROGRAM=='SPAWN ')) THEN
   ! ouverture du fichier PGD
-  CALL FMOPEN_ll(CINIFILEPGD,'READ',HLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.) 
+  CALL IO_FILE_ADD2LIST(TINIFILEPGD,TRIM(CINIFILEPGD),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TINIFILEPGD,HLUOUT,IRESP,OPARALLELIO=.FALSE.)
   IF (IRESP/=0) THEN
     WRITE(ILUOUT,FMT=*) "INI_MODEL_n ERROR TO OPEN THE FILE CINIFILEPGD=",CINIFILEPGD
     WRITE(ILUOUT,FMT=*) "CHECK YOUR NAMELIST NAM_LUNIT2_SPA"
@@ -2020,7 +2022,7 @@ END IF
 !*      17.3   Mesonh fields
 !              -------------
 !
-IF (CPROGRAM/='REAL  ') CALL MNHREAD_ZS_DUMMY_n(CINIFILEPGD)
+IF (CPROGRAM/='REAL  ') CALL MNHREAD_ZS_DUMMY_n(TINIFILEPGD)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_radiations.f90 b/src/MNH/ini_radiations.f90
index 27926cdf6..8c7253c77 100644
--- a/src/MNH/ini_radiations.f90
+++ b/src/MNH/ini_radiations.f90
@@ -13,18 +13,19 @@
 !
 INTERFACE
 !
-    SUBROUTINE INI_RADIATIONS(HINIFILE,HLUOUT,OINIRAD,TPDTCUR,TPDTEXP,PZZ,     &
-         PDXX,PDYY,                                                    &
+    SUBROUTINE INI_RADIATIONS(TPINIFILE,HLUOUT,OINIRAD,TPDTCUR,TPDTEXP,&
+         PZZ,PDXX,PDYY,                                                &
          PSINDEL,PCOSDEL,PTSIDER,PCORSOL,PSLOPANG,PSLOPAZI,            &
          PDTHRAD,PDIRFLASWD,PSCAFLASWD,                                &
          PFLALWD,PDIRSRFSWD,KCLEARCOL_TM1,                             &
          PZENITH, PAZIM, TPDTRAD_FULL,TPDTRAD_CLONLY,TPINITHALO2D_ll,  &
-         PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW               ) 
+         PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW               )
 !
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+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    ! name for output-listing
                                                  !  of nested models
 LOGICAL,                INTENT(IN)  :: OINIRAD   ! switch to initialize or read
@@ -71,15 +72,15 @@ END INTERFACE
 END MODULE MODI_INI_RADIATIONS
 !
 !
-!   #######################################################################
-    SUBROUTINE INI_RADIATIONS(HINIFILE,HLUOUT,OINIRAD,TPDTCUR,TPDTEXP,PZZ,  &
-         PDXX,PDYY,                                                 &
-         PSINDEL,PCOSDEL,PTSIDER,PCORSOL,PSLOPANG,PSLOPAZI,         &
-         PDTHRAD,PDIRFLASWD,PSCAFLASWD,                             &
-         PFLALWD,PDIRSRFSWD,KCLEARCOL_TM1,                          &
-         PZENITH,PAZIM, TPDTRAD_FULL,TPDTRAD_CLONLY,TPINITHALO2D_ll,&
-         PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW            )
-!   #######################################################################
+!   ####################################################################
+    SUBROUTINE INI_RADIATIONS(TPINIFILE,HLUOUT,OINIRAD,TPDTCUR,TPDTEXP,&
+         PZZ,PDXX,PDYY,                                                &
+         PSINDEL,PCOSDEL,PTSIDER,PCORSOL,PSLOPANG,PSLOPAZI,            &
+         PDTHRAD,PDIRFLASWD,PSCAFLASWD,                                &
+         PFLALWD,PDIRSRFSWD,KCLEARCOL_TM1,                             &
+         PZENITH, PAZIM, TPDTRAD_FULL,TPDTRAD_CLONLY,TPINITHALO2D_ll,  &
+         PRADEFF,PSWU,PSWD,PLWU,PLWD,PDTHRADSW,PDTHRADLW               )
+!   ####################################################################
 !
 !!****  *INI_RADIATION_TIME * - initialisation for radiation scheme in the MesoNH framework
 !!
@@ -119,23 +120,24 @@ END MODULE MODI_INI_RADIATIONS
 !MESO-NH modules
 !
 USE MODD_ARGSLIST_ll, ONLY : LIST_ll
-USE MODD_TYPE_DATE
 USE MODD_CST,         ONLY : XPI
 USE MODD_CONF,        ONLY : LFLAT, L2D
-USE MODD_PARAMETERS,  ONLY : JPVEXT
+USE MODD_IO_ll,       ONLY : TFILEDATA
 USE MODD_LES
-USE MODD_PARAM_RAD_n,  ONLY: LFIX_DAT
+USE MODD_PARAMETERS,  ONLY : JPVEXT
+USE MODD_PARAM_RAD_n, ONLY : LFIX_DAT
+USE MODD_TYPE_DATE
 !
 USE MODE_FMREAD
-USE MODI_SHUMAN
 USE MODE_ll
 !
+USE MODI_SHUMAN
 !
 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)  :: OINIRAD   ! switch to initialize or read
@@ -176,10 +178,6 @@ REAL, DIMENSION(:,:,:),     INTENT(OUT) :: PRADEFF ! effective radius
 !
 !*       0.2   declarations of local variables
 !
-INTEGER                :: IGRID,ILENCH,IRESP  !   File 
-CHARACTER (LEN=16)     :: YRECFM              ! management
-CHARACTER (LEN=100)    :: YCOMMENT            ! variables  
-!
 INTEGER, DIMENSION(0:11) :: IBIS, INOBIS ! Cumulative number of days per month
                                          ! for bissextile and regular years
 REAL :: ZDATE         ! Julian day of the year
@@ -316,61 +314,16 @@ IF ( OINIRAD ) THEN
   PDIRSRFSWD(:,:,:)= 0.
   KCLEARCOL_TM1    = 0
 ELSE
-  YRECFM='DTRAD_FULL' 
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',TPDTRAD_FULL,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='DTRAD_CLLY' 
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',TPDTRAD_CLONLY,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'ZENITH'
-  YCOMMENT    = 'X_Y_ZENITH (RAD)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PZENITH,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'AZIM'
-  YCOMMENT    = 'X_Y_AZIM (RAD)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PAZIM,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'DTHRAD'
-  YCOMMENT    = 'X_Y_Z_DTHRAD (K/S)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDTHRAD,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'FLALWD'
-  YCOMMENT    = 'X_Y_FLALWD (W/M2)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PFLALWD,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'DIRFLASWD'
-  YCOMMENT    = 'X_Y_DIRFLASWD (W/M2)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDIRFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'SCAFLASWD'
-  YCOMMENT    = 'X_Y_SCAFLASWD (W/M2)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PSCAFLASWD,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'DIRSRFSWD'
-  YCOMMENT    = 'X_Y_DIRSRFSWD (W/M2)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',PDIRSRFSWD,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM      = 'CLEARCOL_TM1'
-  YCOMMENT    = 'TRACE OF CLOUD'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY',KCLEARCOL_TM1,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-!
+  CALL IO_READ_FIELD(TPINIFILE,'DTRAD_FULL',  TPDTRAD_FULL)
+  CALL IO_READ_FIELD(TPINIFILE,'DTRAD_CLLY',  TPDTRAD_CLONLY)
+  CALL IO_READ_FIELD(TPINIFILE,'DTHRAD',      PDTHRAD)
+  CALL IO_READ_FIELD(TPINIFILE,'FLALWD',      PFLALWD)
+  CALL IO_READ_FIELD(TPINIFILE,'DIRFLASWD',   PDIRFLASWD)
+  CALL IO_READ_FIELD(TPINIFILE,'SCAFLASWD',   PSCAFLASWD)
+  CALL IO_READ_FIELD(TPINIFILE,'DIRSRFSWD',   PDIRSRFSWD)
+  CALL IO_READ_FIELD(TPINIFILE,'CLEARCOL_TM1',KCLEARCOL_TM1)
+  CALL IO_READ_FIELD(TPINIFILE,'ZENITH',      PZENITH)
+  CALL IO_READ_FIELD(TPINIFILE,'AZIM',        PAZIM)
 END IF
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 72794550f..d470cf68a 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -292,7 +292,8 @@ ELSE IF (CPROGRAM=='SPAWN ' .OR. CPROGRAM=='REAL  '.OR. CPROGRAM=='SPEC  ') THEN
 ELSE IF (CPROGRAM=='DIAG  ') THEN
   YINIFILE    = CINIFILE_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,CLUOUT0,IRESP)
   CALL FMLOOK_ll(YEXSEG,CLUOUT0,ILUSEG,IRESP)
   HINIFILEPGD=CINIFILEPGD_n
 !   
@@ -443,13 +444,13 @@ IF (KMI == 1) THEN
   CALL IO_READ_FIELD(TPINIFILE,'THINSHELL',LTHINSHELL)
 !
   IF (IMASDEV>=46) THEN
-   CALL IO_READ_FIELD(TPINIFILE,'L1D',L1D)
+   CALL IO_READ_FIELD(TPINIFILE,'L1D',L1D,IRESP)
    IF (IRESP/=0)  L1D=.FALSE.
 !
-   CALL IO_READ_FIELD(TPINIFILE,'L2D',L2D)
+   CALL IO_READ_FIELD(TPINIFILE,'L2D',L2D,IRESP)
    IF (IRESP/=0)  L2D=.FALSE.
 !
-   CALL IO_READ_FIELD(TPINIFILE,'PACK',LPACK)
+   CALL IO_READ_FIELD(TPINIFILE,'PACK',LPACK,IRESP)
    IF (IRESP/=0) LPACK=.TRUE.
   ELSE
    L1D=.FALSE.
diff --git a/src/MNH/ini_size_spawn.f90 b/src/MNH/ini_size_spawn.f90
index b0a17124a..6de91c868 100644
--- a/src/MNH/ini_size_spawn.f90
+++ b/src/MNH/ini_size_spawn.f90
@@ -13,12 +13,14 @@ MODULE MODI_INI_SIZE_SPAWN
 !
 INTERFACE
 !
-SUBROUTINE INI_SIZE_SPAWN(HLBCX,HLBCY,HPRESOPT,KITR,HINIFILE)
+SUBROUTINE INI_SIZE_SPAWN(HLBCX,HLBCY,HPRESOPT,KITR,TPINIFILE)
 !
-CHARACTER (LEN=4),DIMENSION(2), INTENT(IN)  :: HLBCX,HLBCY !  LBC types for model1
-CHARACTER (LEN=5),  INTENT(IN)              :: HPRESOPT        ! Pressure solver option of model1
-INTEGER,            INTENT(IN)              :: KITR            ! Iterations of pressure solver of model1
-CHARACTER (LEN=*),  INTENT(IN)              :: HINIFILE ! name of the model 1 file
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
+CHARACTER (LEN=4),DIMENSION(2), INTENT(IN)    :: HLBCX,HLBCY ! LBC types for model1
+CHARACTER (LEN=5),              INTENT(IN)    :: HPRESOPT    ! Pressure solver option of model1
+INTEGER,                        INTENT(IN)    :: KITR        ! Iterations of pressure solver of model1
+TYPE(TFILEDATA),                INTENT(IN)    :: TPINIFILE   ! Model 1 file
 !
 END SUBROUTINE INI_SIZE_SPAWN
 !
@@ -27,9 +29,9 @@ END INTERFACE
 END MODULE MODI_INI_SIZE_SPAWN
 !
 !
-!     #############################################################
-      SUBROUTINE INI_SIZE_SPAWN(HLBCX,HLBCY,HPRESOPT,KITR,HINIFILE)
-!     #############################################################
+!     ##############################################################
+      SUBROUTINE INI_SIZE_SPAWN(HLBCX,HLBCY,HPRESOPT,KITR,TPINIFILE)
+!     ##############################################################
 !
 !!****  *INI_SIZE_SPAWN * - subroutine to compute dimensions and position of model 2,
 !!                          initialize its LBC and call the // initialisation routines
@@ -74,50 +76,42 @@ END MODULE MODI_INI_SIZE_SPAWN
 !*       0.     DECLARATIONS
 !               ------------
 !
-USE MODD_SPAWN
-USE MODD_PARAMETERS
 USE MODD_CONF
+USE MODD_DIM_n, ONLY : DIM_MODEL
+USE MODD_DYN_n, ONLY : CPRESOPT, NITR
 USE MODD_GRID
-USE MODD_PGDGRID
+USE MODD_GRID_n
+USE MODD_IO_ll, ONLY : ISNPROC, ISP, TFILEDATA
+USE MODD_LBC_n
+USE MODD_LUNIT_n
+USE MODD_PARAMETERS
 USE MODD_PGDDIM
+USE MODD_PGDGRID
+USE MODD_SPAWN
+USE MODD_VAR_ll, ONLY : YSPLITTING
 !
 USE MODE_ll
-USE MODE_IO_ll
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_GRIDPROJ
+USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
+USE MODE_MODELN_HANDLER
+USE MODE_SPLITTINGZ_ll
 !
-USE MODD_DIM_n, ONLY : DIM_MODEL
-!
-USE MODD_DYN_n, ONLY : CPRESOPT, NITR
-USE MODD_LBC_n
-USE MODD_GRID_n
-USE MODD_LUNIT_n
-!
+USE MODI_COMPARE_DAD
 USE MODI_DEFAULT_DESFM_n   ! Only for model 2
 USE MODI_READ_HGRID
 USE MODI_RETRIEVE1_NEST_INFO_n
-USE MODI_COMPARE_DAD
-USE MODE_MODELN_HANDLER
-!
-!$20140602 for NPROC
-!USE MODD_VAR_ll
-USE MODD_IO_ll, ONLY : ISNPROC, ISP
-!20140602 for INI_PARAZ_ll
-USE MODE_SPLITTINGZ_ll
 !
-USE MODE_SPLITTING_ll, ONLY : SPLIT2
-USE MODD_VAR_ll, ONLY : YSPLITTING, NMNH_COMM_WORLD
-USE MODD_STRUCTURE_ll, ONLY : ZONE_ll
-!$
 IMPLICIT NONE
 !
 !*       0.1  Declarations of dummy arguments :
 !
-CHARACTER (LEN=4),DIMENSION(2), INTENT(IN)  :: HLBCX,HLBCY !  LBC types for model1
-CHARACTER (LEN=5),  INTENT(IN)              :: HPRESOPT        ! Pressure solver option of model1
-INTEGER,            INTENT(IN)              :: KITR            ! Iterations of pressure solver of model1
-CHARACTER (LEN=*),  INTENT(IN)              :: HINIFILE ! name of the model 1 file
+CHARACTER (LEN=4),DIMENSION(2), INTENT(IN)    :: HLBCX,HLBCY ! LBC types for model1
+CHARACTER (LEN=5),              INTENT(IN)    :: HPRESOPT    ! Pressure solver option of model1
+INTEGER,                        INTENT(IN)    :: KITR        ! Iterations of pressure solver of model1
+TYPE(TFILEDATA),                INTENT(IN)    :: TPINIFILE   ! Model 1 file
 !
 !*       0.2  Declarations of local variables :
 !
@@ -132,9 +126,6 @@ CHARACTER (LEN=5)  :: YPRESOPT        ! Pressure solver option of model 1
 INTEGER            :: IITR            ! Iterations of pressure solver of model 1
 CHARACTER (LEN=28) :: YMY_NAME, YDAD_NAME
 CHARACTER (LEN=2)  :: YSTORAGE_TYPE
-CHARACTER (LEN=16) :: YRECFM
-INTEGER            :: ILENCH, IGRID
-CHARACTER (LEN=100):: YCOMMENT
 INTEGER            :: IMI
 !
 !$20140602
@@ -147,11 +138,9 @@ LOGICAL, DIMENSION(JPMODELMAX) :: L2D_ALL  ! Flag for      2D conf. for each PGD
 LOGICAL, DIMENSION(JPMODELMAX) :: LPACK_ALL! Flag for packing conf. for each PGD
 INTEGER            :: IDIMX, IDIMY, IIB, IJB, IIE, IJE
 !$
-!-------------------------------------------------------------------------------
 REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM
 INTEGER :: IIMAX_ll,IJMAX_ll
-TYPE(ZONE_ll), DIMENSION(:), ALLOCATABLE :: TZSPLITTING
-!-------------------------------------------------------------------------------
+TYPE(TFILEDATA),POINTER :: TZDOMAIN => NULL()
 !
 !
 IMI = GET_CURRENT_MODEL_INDEX()
@@ -205,9 +194,7 @@ IF (LBAL_ONLY) THEN
       CALL ABORT
       STOP
     ELSE
-      YRECFM='DAD_NAME'
-      YDIR='--'
-      CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,YDAD_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL IO_READ_FIELD(TPINIFILE,'DAD_NAME',YDAD_NAME)
       IF (ADJUSTL(ADJUSTR(YDAD_NAME)) .NE. ADJUSTL(ADJUSTR(CDADINIFILE))) THEN
         WRITE(ILUOUT,*) 'ERROR in INI_SIZE_SPAWN: YDADINIFILE is NOT the DAD of model 1'
         WRITE(ILUOUT,*) ' YDADINIFILE='//TRIM(CDADINIFILE)
@@ -237,29 +224,12 @@ ENDIF
 !
 IF (LEN_TRIM(CDOMAIN)>0) THEN
 !
-  YRECFM='LON0'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XLON0,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='LAT0'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='BETA'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XBETA,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='RPK'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XRPK,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='LONORI'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XPGDLONOR,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='LATORI'
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XPGDLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'LAT0',  XLAT0)
+  CALL IO_READ_FIELD(TPINIFILE,'LON0',  XLON0)
+  CALL IO_READ_FIELD(TPINIFILE,'RPK',   XRPK)
+  CALL IO_READ_FIELD(TPINIFILE,'BETA',  XBETA)
+  CALL IO_READ_FIELD(TPINIFILE,'LATORI',XPGDLATOR)
+  CALL IO_READ_FIELD(TPINIFILE,'LONORI',XPGDLONOR)
   !
   !$20140602 INSERT BIG MODIF JUAN May27
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -269,16 +239,15 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN
 ! initialize grid2 dims, xor, xend and ratio so to initialize in INI_CHILD 
 ! structures TCRRT_COMDATA%T_CHILDREN%T_SPLITB and TCRRT_PROCONF%T_CHILDREN
 !$20140602 add condition on npproc
-  CALL FMOPEN_ll(CDOMAIN,'READ',CLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_ADD2LIST(TZDOMAIN,TRIM(CDOMAIN),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TZDOMAIN,CLUOUT,IRESP,OPARALLELIO=.FALSE.)
   !
-  YDIR='--'
-  CALL FMREAD(CDOMAIN,'DXRATIO',CLUOUT,YDIR,NDXRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CDOMAIN,'DYRATIO',CLUOUT,YDIR,NDYRATIO,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CDOMAIN,'XOR',CLUOUT,YDIR,NXOR,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CDOMAIN,'YOR',CLUOUT,YDIR,NYOR,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CDOMAIN,'IMAX',CLUOUT,YDIR,IIMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CDOMAIN,'JMAX',CLUOUT,YDIR,IJMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMCLOS_ll(CDOMAIN,'KEEP',CLUOUT,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_READ_FIELD(TZDOMAIN,'DXRATIO',NDXRATIO)
+  CALL IO_READ_FIELD(TZDOMAIN,'DYRATIO',NDYRATIO)
+  CALL IO_READ_FIELD(TZDOMAIN,'XOR',    NXOR)
+  CALL IO_READ_FIELD(TZDOMAIN,'YOR',    NYOR)
+  CALL IO_READ_FIELD(TZDOMAIN,'IMAX',   IIMAX_ll)
+  CALL IO_READ_FIELD(TZDOMAIN,'JMAX',   IJMAX_ll)
   NXEND=NXOR+IIMAX_ll/NDXRATIO+2*JPHEXT-1
   NYEND=NYOR+IJMAX_ll/NDYRATIO+2*JPHEXT-1
   !
@@ -301,37 +270,16 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN
 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
   !$
   ALLOCATE(XPGDXHAT(DIM_MODEL(1)%NIMAX+2*JPHEXT))
-  !ALLOCATE(XPGDXHAT(15+2*JPHEXT))
-  YRECFM='XHAT'
-  !$20140505 test '--'
-  !YDIR='XX'
-  !YDIR='--'
-  !$20140520 retour a 'XX'
-  !$then np1 works, but np4 stops here
-  !$20140602 use NPROC
-  IF (ISNPROC.EQ.1) YDIR='XX'
-  IF (ISNPROC.GT.1) YDIR='XX'!'--'
-  !$
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XPGDXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'XHAT',XPGDXHAT)
   !
   ALLOCATE(XPGDYHAT(DIM_MODEL(1)%NJMAX+2*JPHEXT))
-  YRECFM='YHAT'
-  !$20140506 test '--'
-  !YDIR='YY'
-  !YDIR='--'
-  !$20140520 retour a 'YY'
-  !$20140602 use NPROC
-  IF (ISNPROC.EQ.1) YDIR='YY'
-  IF (ISNPROC.GT.1) YDIR='YY'!'--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,XPGDYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'YHAT',XPGDYHAT)
   !
-  YRECFM='MASDEV' 
-  YDIR='--'
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,YDIR,IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'MASDEV',IMASDEV)
   !
   IF (IMASDEV<=45) THEN
-    CALL FMREAD(HINIFILE,'LATOR',CLUOUT,'--',XPGDLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
-    CALL FMREAD(HINIFILE,'LONOR',CLUOUT,'--',XPGDLONOR,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TZDOMAIN,'LATOR',XPGDLATOR)
+    CALL IO_READ_FIELD(TZDOMAIN,'LONOR',XPGDLONOR)
     ZXHATM = - 0.5 * (XPGDXHAT(1)+XPGDXHAT(2))
     ZYHATM = - 0.5 * (XPGDYHAT(1)+XPGDYHAT(2))
     CALL SM_LATLON(XPGDLATOR,XPGDLONOR,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
@@ -342,9 +290,8 @@ IF (LEN_TRIM(CDOMAIN)>0) THEN
 !
 !*     1.4   read grid in file CDOMAIN if available :
 !
-  CALL FMOPEN_ll(CDOMAIN,'READ',CLUOUT,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.)
-  CALL READ_HGRID(2,CDOMAIN,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
-  CALL FMCLOS_ll(CDOMAIN,'KEEP',CLUOUT,IRESP,OPARALLELIO=.FALSE.)
+  CALL READ_HGRID(2,TZDOMAIN,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+  CALL IO_FILE_CLOSE_ll(TZDOMAIN,CLUOUT,IRESP,OPARALLELIO=.FALSE.)
   CALL RETRIEVE1_NEST_INFO_n(1,2,NXOR,NYOR,NXSIZE,NYSIZE,NDXRATIO,NDYRATIO)
   DEALLOCATE(XZS,XZSMT,XXHAT,XYHAT)
 !
diff --git a/src/MNH/init_mnh.f90 b/src/MNH/init_mnh.f90
index cfaf842a0..15ac5c8b6 100644
--- a/src/MNH/init_mnh.f90
+++ b/src/MNH/init_mnh.f90
@@ -203,7 +203,7 @@ IF (CPROGRAM=='SPAWN ') THEN
   DPTR_CLBCX=>CLBCX
   DPTR_CLBCY=>CLBCY
   CALL INI_PARAZ_ll(IINFO_ll)
-  CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,TZINIFILE(1)%TZFILE%CNAME)
+  CALL INI_SIZE_SPAWN(DPTR_CLBCX,DPTR_CLBCY,CPRESOPT,NITR,TZINIFILE(1)%TZFILE)
 END IF
 !
 !   INITIALIZE data structures of ComLib
diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90
index bedc9f900..d4d7576cb 100644
--- a/src/MNH/latlon_to_xy.f90
+++ b/src/MNH/latlon_to_xy.f90
@@ -67,16 +67,17 @@
 !*    0.     DECLARATION
 !            -----------
 !
-USE MODE_FM
-USE MODE_IO_ll
-!
 USE MODD_GRID      
+USE MODD_IO_ll,  ONLY: TFILEDATA
 USE MODD_PGDDIM
 USE MODD_PGDGRID
 USE MODD_PARAMETERS
 USE MODD_LUNIT
 !
+USE MODE_FM
 USE MODE_GRIDPROJ
+USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 !
 USE MODI_INI_CST
 USE MODI_READ_HGRID
@@ -102,6 +103,7 @@ REAL    :: ZXHAT               ! output conformal coodinate x
 REAL    :: ZYHAT               ! output conformal coodinate y
 INTEGER :: II,IJ               ! indexes of the point
 REAL    :: ZI,ZJ               ! fractionnal indexes of the point
+TYPE(TFILEDATA),POINTER :: TZINIFILE
 !
 !*    0.3    Declaration of namelists
 !            ------------------------
@@ -136,17 +138,18 @@ CALL CLOSE_ll('LATLON2XY1.nam',IOSTAT=IRESP)
 !*    1.     Opening of MESONH file
 !            ----------------------
 !
-CALL FMOPEN_ll(YINIFILE,'READ',CLUOUT0,0,2,2,ININAR,IRESP)
+CALL IO_FILE_ADD2LIST(TZINIFILE,TRIM(YINIFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=2)
+CALL IO_FILE_OPEN_ll(TZINIFILE,CLUOUT0,IRESP)
 !
 !*    2.     Reading of MESONH file
 !            ----------------------
 !
-CALL READ_HGRID(0,YINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
+CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
 !
 !*    3.     Closing of MESONH file
 !            ----------------------
 !
-CALL FMCLOS_ll(YINIFILE,'KEEP',CLUOUT0,IRESP)
+CALL IO_FILE_CLOSE_ll(TZINIFILE,CLUOUT0,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index 3c4c2771d..d9784ea91 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -29,28 +29,27 @@
 !
 !*	0.1 Modules.
 !
-USE MODE_MODELN_HANDLER
-USE MODD_MNH2LPDM
-!
-USE MODE_FM
-USE MODE_IO_ll
-!
 USE MODD_CST
-USE MODD_TIME
-USE MODD_PARAMETERS
-USE MODD_GRID
 USE MODD_DIM_n
+USE MODD_GRID
 USE MODD_GRID_n
-USE MODD_TIME_n
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LUNIT
+USE MODD_MNH2LPDM
+USE MODD_PARAMETERS
+USE MODD_TIME
+USE MODD_TIME_n
 !
-USE MODI_INI_CST
-USE MODI_READ_HGRID
-USE MODI_FMREAD_LL
-!
+USE MODE_FM
 USE MODE_GRIDPROJ
+USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+USE MODE_MODELN_HANDLER
 USE MODI_XYTOLATLON
 !
+USE MODI_FMREAD_LL
+USE MODI_INI_CST
+USE MODI_READ_HGRID
 USE MODI_TEMPORAL_DIST
 !
 !*	0.2 Arguments.
@@ -82,6 +81,8 @@ INTEGER               :: JI,JJ,JK,a
 INTEGER               :: b,c,I
 INTEGER, DIMENSION(:,:), ALLOCATABLE   :: TAB2D
 INTEGER, DIMENSION(:), ALLOCATABLE   :: TAB1D
+TYPE(TFILEDATA),POINTER :: TZFM1 => NULL()
+TYPE(TFILEDATA),POINTER :: TZFM2 => NULL()
 !
 !
 !
@@ -98,8 +99,10 @@ CALL GOTO_MODEL(1)
 !
 !*	2.1 Ouverture du fichier Meso-NH.
 !
-CALL FMOPEN_LL(HFM1,'READ',HFLOG,0,2,KVERB,INBART,IREP)
-CALL FMOPEN_LL(HFM2,'READ',HFLOG,0,2,KVERB,INBART,IREP)
+CALL IO_FILE_ADD2LIST(TZFM1,TRIM(HFM1),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=KVERB)
+CALL IO_FILE_ADD2LIST(TZFM2,TRIM(HFM2),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=KVERB)
+CALL IO_FILE_OPEN_ll(TZFM1,HFLOG,IREP)
+CALL IO_FILE_OPEN_ll(TZFM2,HFLOG,IREP)
 !
 !
 !*      2.2 Date et heure du modele.
@@ -149,7 +152,7 @@ NMDLMN =NMDLMN-NMDLHH*60
 !
 !*	2.3 Grille horizontale.
 !
-CALL READ_HGRID(1,HFM1,YNAME,YDAD,YSTORAGE)
+CALL READ_HGRID(1,TZFM1,YNAME,YDAD,YSTORAGE)
 IF (YNAME == YDAD) THEN
 IGRILLE=1
 ELSE
@@ -432,8 +435,8 @@ DEALLOCATE(XZHAT)
 !
 !	 Fermeture du fichier Meso-NH.
 !
-CALL FMCLOS_LL(HFM1,'KEEP',HFLOG,IREP)
-CALL FMCLOS_LL(HFM2,'KEEP',HFLOG,IREP)
+CALL IO_FILE_CLOSE_ll(TZFM1,HFLOG,IREP)
+CALL IO_FILE_CLOSE_ll(TZFM2,HFLOG,IREP)
 !
 !
 !-------------------------------------------'
diff --git a/src/MNH/mnhclose_aux_io_surf.f90 b/src/MNH/mnhclose_aux_io_surf.f90
index c1f9963aa..4d97ba51d 100644
--- a/src/MNH/mnhclose_aux_io_surf.f90
+++ b/src/MNH/mnhclose_aux_io_surf.f90
@@ -63,7 +63,7 @@ USE MODE_ll
 USE MODE_FM
 USE MODE_IO_ll
 
-USE MODD_IO_SURF_MNH, ONLY : COUT, CACTION, NMASK_ALL, NMASK
+USE MODD_IO_SURF_MNH, ONLY : COUT, TPINFILE, CACTION, NMASK_ALL, NMASK
 !
 IMPLICIT NONE
 !
@@ -82,7 +82,7 @@ INTEGER           :: IRESP          ! return-code if a problem appears
 !-------------------------------------------------------------------------------
 !
 IF (CACTION=='OPEN  ') THEN
-  CALL FMCLOS_ll(HFILE,'KEEP',COUT,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_CLOSE_ll(TPINFILE,COUT,IRESP,OPARALLELIO=.FALSE.)
   CACTION='      '
 END IF
 !
diff --git a/src/MNH/mnhend_io_surfn.f90 b/src/MNH/mnhend_io_surfn.f90
index d416cd8f5..aa0847a4c 100644
--- a/src/MNH/mnhend_io_surfn.f90
+++ b/src/MNH/mnhend_io_surfn.f90
@@ -60,7 +60,7 @@ USE MODE_ll
 USE MODE_FM
 USE MODE_IO_ll
 
-USE MODD_IO_SURF_MNH, ONLY : CACTION, CFILE, COUTFILE, NMASK, NMASK_ALL
+USE MODD_IO_SURF_MNH, ONLY : CACTION, CFILE, TPINFILE, COUTFILE, NMASK, NMASK_ALL
 !
 IMPLICIT NONE
 !
@@ -80,6 +80,7 @@ CACTION='     '
 !
 CFILE    = '                           '
 COUTFILE = '                           '
+TPINFILE => NULL()
 !
 DEALLOCATE(NMASK)
 DEALLOCATE(NMASK_ALL)
diff --git a/src/MNH/mnhinit_io_surfn.f90 b/src/MNH/mnhinit_io_surfn.f90
index f3740b99c..ba0a0f843 100644
--- a/src/MNH/mnhinit_io_surfn.f90
+++ b/src/MNH/mnhinit_io_surfn.f90
@@ -60,9 +60,9 @@ END MODULE MODI_MNHINIT_IO_SURF_n
 !              ------------
 !
 !
-USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE,COUTFILE, NLUOUT,  &
-         NMASK, CMASK, NIU, NJU, NIB, NJB, NIE, NJE, CACTION,&
-         NMASK_ALL, NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,      &
+USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE, TPINFILE, COUTFILE, NLUOUT,  &
+         NMASK, CMASK, NIU, NJU, NIB, NJB, NIE, NJE, CACTION,          &
+         NMASK_ALL, NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL,                &
          NIE_ALL, NJE_ALL, NHALO
 !
 USE MODD_CONF,           ONLY : CPROGRAM
@@ -72,9 +72,10 @@ USE MODD_LUNIT,          ONLY : CLUOUT0, COUTFMFILE, CPGDFILE
 USE MODD_DIM_n,          ONLY : NIMAX, NJMAX, NIMAX_ll, NJMAX_ll
 USE MODD_PARAMETERS,     ONLY : JPHEXT
 !
+USE MODE_ll
 USE MODE_FM
 USE MODE_IO_ll
-USE MODE_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
 USE MODE_MODELN_HANDLER
 !
 USE MODI_GET_1D_MASK
@@ -129,11 +130,14 @@ IF (HACTION=='READ ') THEN
     CASE('MESONH','DIAG  ')
       IF(CMASK_SURFEX=="PGD") THEN
         CFILE=CINIFILEPGD
+        CALL IO_FILE_FIND_BYNAME(TRIM(CINIFILEPGD),TPINFILE,IRESP)
       ELSE
         CFILE=CINIFILE
+        CALL IO_FILE_FIND_BYNAME(TRIM(CINIFILE),TPINFILE,IRESP)
       ENDIF
     CASE('REAL  ','IDEAL ','NESPGD','SPAWN ','ZOOMPG')
       CFILE=CPGDFILE
+      CALL IO_FILE_FIND_BYNAME(TRIM(CPGDFILE),TPINFILE,IRESP)
   END SELECT
 ELSE IF (HACTION=='WRITE') THEN
   COUTFILE=COUTFMFILE
diff --git a/src/MNH/mnhopen_aux_io_surf.f90 b/src/MNH/mnhopen_aux_io_surf.f90
index a2b4c4f3d..20bd56411 100644
--- a/src/MNH/mnhopen_aux_io_surf.f90
+++ b/src/MNH/mnhopen_aux_io_surf.f90
@@ -57,7 +57,7 @@ END MODULE MODI_MNHOPEN_AUX_IO_SURF
 !              ------------
 !
 !
-USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE, COUTFILE, NLUOUT, &
+USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE, TPINFILE, COUTFILE, NLUOUT, &
          NMASK_ALL, CMASK, NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, NIE_ALL, NJE_ALL, CACTION, &
          NMASK, NIU, NJU, NIB, NJB, NIE, NJE
 !
@@ -68,6 +68,7 @@ USE MODD_LUNIT,          ONLY : CLUOUT0, COUTFMFILE, CPGDFILE
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME
 !
 USE MODI_GET_1D_MASK
 USE MODI_MNH_SURF_GRID_IO_INIT
@@ -84,12 +85,8 @@ CHARACTER(LEN=6),  INTENT(IN)  :: HMASK
 !*       0.2   Declarations of local variables
 !              -------------------------------
 !
-INTEGER           :: IRESP,ININAR   ! IRESP  : return-code if a problem appears 
-                                    ! at the open of the file in LFI  routines 
+INTEGER           :: IRESP
 INTEGER           :: IMI            ! model index
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-CHARACTER(LEN=100):: YCOMMENT       ! Comment string
 INTEGER           :: IIMAX          ! number of points in X direction
 INTEGER           :: IJMAX          ! number of points in Y direction
 !
@@ -123,12 +120,16 @@ IF (LEN_TRIM(CACTION)>0) THEN
 END IF
 !
 IF (HFILE/=COUTFMFILE .AND. HFILE/=CPGDFILE) THEN
-  CALL FMOPEN_ll(HFILE,'READ',COUT,0,2,5,ININAR,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_ADD2LIST(TPINFILE,TRIM(HFILE),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=5,OOLD=.TRUE.)
+  CALL IO_FILE_OPEN_ll(TPINFILE,COUT,IRESP,OPARALLELIO=.FALSE.)
+  !
   IF (IRESP .NE. 0) THEN
-   PRINT*," /!\  MNHOPEN_AUX_IO_SURF :: FATAL PROBLEM OPENING INPUT/READ FILES =", HFILE
-   STOP '/!\ MNHOPEN_AUX_IO_SURF :: FATAL PROBLEM OPENING INPUT/READ FILES , CHECK OUTPUT_LISTING* !!!'
+    PRINT*," /!\  MNHOPEN_AUX_IO_SURF :: FATAL PROBLEM OPENING INPUT/READ FILES =", HFILE
+    STOP '/!\ MNHOPEN_AUX_IO_SURF :: FATAL PROBLEM OPENING INPUT/READ FILES , CHECK OUTPUT_LISTING* !!!'
   ENDIF
   CACTION = 'OPEN  '
+ELSE
+  CALL IO_FILE_FIND_BYNAME(TRIM(HFILE),TPINFILE,IRESP)
 END IF
 !
 CFILE    = HFILE
@@ -136,12 +137,12 @@ COUTFILE = HFILE
 !
 !
 !*       3.    initialisation of 2D arrays for entire physical field
-! 
-CALL FMREAD(HFILE,'IMAX',COUT,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFILE,'JMAX',COUT,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+!
+CALL IO_READ_FIELD(TPINFILE,'IMAX',IIMAX)
+CALL IO_READ_FIELD(TPINFILE,'JMAX',IJMAX)
 CALL MNH_SURF_GRID_IO_INIT(IIMAX,IJMAX)
 IJPHEXT= 1
-CALL FMREAD(HFILE,'JPHEXT',COUT,'--',IJPHEXT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINFILE,'JPHEXT',IJPHEXT)
 IF ( IJPHEXT .NE. JPHEXT ) THEN
    WRITE(NLUOUT,FMT=*) ' MNHOPEN_AUX_IO : JPHEXT in PRE_PGD1.nam/NAM_CONF_PGD ( or default value )&
       & JPHEXT=',JPHEXT
diff --git a/src/MNH/mnhread_zs_dummyn.f90 b/src/MNH/mnhread_zs_dummyn.f90
index 4f554c98b..cd9e6339a 100644
--- a/src/MNH/mnhread_zs_dummyn.f90
+++ b/src/MNH/mnhread_zs_dummyn.f90
@@ -12,10 +12,11 @@
       MODULE MODI_MNHREAD_ZS_DUMMY_n
 !     ##########################
 INTERFACE
-      SUBROUTINE MNHREAD_ZS_DUMMY_n(HINIFILE)
+      SUBROUTINE MNHREAD_ZS_DUMMY_n(TPINIFILE)
 !
-CHARACTER (LEN=*),  INTENT(IN)   :: HINIFILE ! name of
-                                             ! the initial file
+USE MODD_IO_ll, ONLY : TFILEDATA
+!
+TYPE(TFILEDATA),    INTENT(IN)   :: TPINIFILE    !Initial file
 !
 END SUBROUTINE MNHREAD_ZS_DUMMY_n
 !
@@ -24,7 +25,7 @@ END INTERFACE
 END MODULE MODI_MNHREAD_ZS_DUMMY_n
 !
 !     ##########################################################################
-      SUBROUTINE MNHREAD_ZS_DUMMY_n(HINIFILE)
+      SUBROUTINE MNHREAD_ZS_DUMMY_n(TPINIFILE)
 !     ##########################################################################
 !
 !!****  *MNHREAD_ZS_DUMMY_n* - reads zs and dummy surface fields
@@ -60,10 +61,11 @@ END MODULE MODI_MNHREAD_ZS_DUMMY_n
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_LUNIT_n,    ONLY : CLUOUT
 USE MODD_GRID_n,     ONLY : XZS
 USE MODD_GR_FIELD_n, ONLY : XSSO_STDEV, XSSO_ANISOTROPY, XSSO_DIRECTION, XSSO_SLOPE, &
                             XAVG_ZS, XSIL_ZS, XMIN_ZS, XMAX_ZS
+USE MODD_IO_ll,      ONLY : TFILEDATA
+USE MODD_LUNIT_n,    ONLY : CLUOUT
 USE MODD_PARAM_n,    ONLY : CSURF
 !
 USE MODI_READ_DUMMY_GR_FIELD_n
@@ -75,22 +77,12 @@ IMPLICIT NONE
 !
 !*       0.1   Declarations of arguments
 !              -------------------------
-CHARACTER (LEN=*),  INTENT(IN)   :: HINIFILE ! name of
-                                             ! the initial file
 !
-
+TYPE(TFILEDATA),    INTENT(IN)   :: TPINIFILE    !Initial file
 !
 !*       0.2   Declarations of local variables
 !              -------------------------------
 !
-INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears 
-                                    ! at the open of the file in LFI  routines 
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string 
-!
-CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be read
-CHARACTER(LEN=100):: YCOMMENT       ! Comment string
-!
 INTEGER           :: IIU            ! X array size
 INTEGER           :: IJU            ! Y array size
 !
@@ -112,10 +104,9 @@ CALL GET_DIM_EXT_ll('B',IIU,IJU)
 !
 !*       1.3    Orography :
 !               ---------
-YRECFM='ZS'
 IF (.NOT.(ASSOCIATED(XZS))) THEN
   ALLOCATE(XZS(IIU,IJU))
-  CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'ZS',XZS)
 END IF
 !
 IF (CSURF /='EXTE') RETURN
@@ -126,44 +117,36 @@ IF (CSURF /='EXTE') RETURN
 !*       2.1    Orographic characteristics :
 !               --------------------------
 !
-YRECFM='SSO_STDEV'
-IF (.NOT.(ASSOCIATED(XSSO_STDEV))) ALLOCATE(XSSO_STDEV(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XSSO_STDEV(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+IF (.NOT.(ASSOCIATED(XSSO_ANISOTROPY))) ALLOCATE(XSSO_ANISOTROPY(IIU,IJU))
+CALL IO_READ_FIELD(TPINIFILE,'SSO_ANIS',XSSO_ANISOTROPY(:,:))
+!
+IF (.NOT.(ASSOCIATED(XSSO_SLOPE))) ALLOCATE(XSSO_SLOPE(IIU,IJU))
+CALL IO_READ_FIELD(TPINIFILE,'SSO_SLOPE',XSSO_SLOPE(:,:))
+!
+IF (.NOT.(ASSOCIATED(XSSO_DIRECTION))) ALLOCATE(XSSO_DIRECTION(IIU,IJU))
+CALL IO_READ_FIELD(TPINIFILE,'SSO_DIR',XSSO_DIRECTION(:,:))
 !
-YRECFM='AVG_ZS'
 IF (.NOT.(ASSOCIATED(XAVG_ZS))) ALLOCATE(XAVG_ZS(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XAVG_ZS(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'AVG_ZS',XAVG_ZS(:,:))
 !
-YRECFM='SIL_ZS'
 IF (.NOT.(ASSOCIATED(XSIL_ZS))) ALLOCATE(XSIL_ZS(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XSIL_ZS(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'SIL_ZS',XSIL_ZS(:,:))
 !
-YRECFM='MAX_ZS'
 IF (.NOT.(ASSOCIATED(XMAX_ZS))) ALLOCATE(XMAX_ZS(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XMAX_ZS(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'MAX_ZS',XMAX_ZS(:,:))
 !
-YRECFM='MIN_ZS'
 IF (.NOT.(ASSOCIATED(XMIN_ZS))) ALLOCATE(XMIN_ZS(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XMIN_ZS(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='SSO_ANIS'
-IF (.NOT.(ASSOCIATED(XSSO_ANISOTROPY))) ALLOCATE(XSSO_ANISOTROPY(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XSSO_ANISOTROPY(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'MIN_ZS',XMIN_ZS(:,:))
 !
-YRECFM='SSO_SLOPE'
-IF (.NOT.(ASSOCIATED(XSSO_SLOPE))) ALLOCATE(XSSO_SLOPE(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XSSO_SLOPE(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='SSO_DIR'
-IF (.NOT.(ASSOCIATED(XSSO_DIRECTION))) ALLOCATE(XSSO_DIRECTION(IIU,IJU))
-CALL FMREAD(HINIFILE,YRECFM,CLUOUT,'XY',XSSO_DIRECTION(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
+IF (.NOT.(ASSOCIATED(XSSO_STDEV))) ALLOCATE(XSSO_STDEV(IIU,IJU))
+CALL IO_READ_FIELD(TPINIFILE,'SSO_STDEV',XSSO_STDEV(:,:))
 !
 !-------------------------------------------------------------------------------
 !
 !*      3.     Dummy fields
 !              ------------
 !
-CALL READ_DUMMY_GR_FIELD_n(HINIFILE,CLUOUT,1,IIU,1,IJU,.TRUE.)
+CALL READ_DUMMY_GR_FIELD_n(TPINIFILE,CLUOUT,1,IIU,1,IJU,.TRUE.)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/modd_io_surf_mnh.f90 b/src/MNH/modd_io_surf_mnh.f90
index 98f4ac86c..830660da8 100644
--- a/src/MNH/modd_io_surf_mnh.f90
+++ b/src/MNH/modd_io_surf_mnh.f90
@@ -36,7 +36,7 @@
 !
 !*       0.   DECLARATIONS
 !
-!$20140403
+USE MODD_IO_ll, ONLY : TFILEDATA
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
 
 IMPLICIT NONE
@@ -53,6 +53,7 @@ TYPE IO_SURF_MNH_t
 !INTEGER                :: NLUOUT      ! output listing logical unit
 !CHARACTER(LEN=6),SAVE          :: CMASK
 CHARACTER(LEN=28)              :: CFILE       ! Name of the input FM-file
+TYPE(TFILEDATA),POINTER        :: TPINFILE => NULL() ! Input FM-file
 CHARACTER(LEN=28)              :: COUTFILE    ! Name of the output FM-file
 CHARACTER(LEN=28)              :: COUT        ! Name of output_listing file
 INTEGER                        :: NLUOUT      ! output listing logical unit
@@ -85,6 +86,7 @@ TYPE(IO_SURF_MNH_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: IO_SURF_MNH_MODEL
 !!!!!!!!!!!!!!!!!!!! LOCAL VARIABLE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 !
 CHARACTER(LEN=28)     ,POINTER :: CFILE =>NULL()      ! Name of the input FM-file
+TYPE(TFILEDATA)       ,POINTER :: TPINFILE => NULL()  ! Input FM-file
 CHARACTER(LEN=28)     ,POINTER :: COUTFILE =>NULL()   ! Name of the output FM-file
 CHARACTER(LEN=28)     ,POINTER :: COUT =>NULL()       ! Name of output_listing file
 INTEGER               ,POINTER :: NLUOUT =>NULL()     ! output listing logical unit
@@ -119,6 +121,7 @@ IO_SURF_MNH_MODEL(KFROM)%NMASK_ALL=>NMASK_ALL
 
 ! current model is set for model KTO 
 CFILE=>IO_SURF_MNH_MODEL(KTO)%CFILE
+TPINFILE=>IO_SURF_MNH_MODEL(KTO)%TPINFILE
 COUTFILE=>IO_SURF_MNH_MODEL(KTO)%COUTFILE
 COUT=>IO_SURF_MNH_MODEL(KTO)%COUT
 NLUOUT=>IO_SURF_MNH_MODEL(KTO)%NLUOUT
diff --git a/src/MNH/modd_lunitn.f90 b/src/MNH/modd_lunitn.f90
index d67979cae..82ccd39db 100644
--- a/src/MNH/modd_lunitn.f90
+++ b/src/MNH/modd_lunitn.f90
@@ -54,6 +54,7 @@ TYPE LUNIT_t
 ! 
   CHARACTER(LEN=28) :: CINIFILE      ! Name of the 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
   TYPE(TFILEDATA),POINTER :: TDIAFILE => NULL() ! diachronic output file
 !
@@ -72,6 +73,7 @@ CHARACTER(LEN=4),SAVE :: CMASK_SURFEX='PREP'
 !
 CHARACTER(LEN=28), POINTER :: CINIFILE=>NULL()
 CHARACTER(LEN=28), POINTER :: CINIFILEPGD=>NULL()
+TYPE(TFILEDATA),   POINTER :: TINIFILEPGD => NULL()
 CHARACTER(LEN=24), POINTER :: COUTFILE=>NULL()
 TYPE(TFILEDATA),   POINTER :: TDIAFILE=>NULL()
 CHARACTER(LEN=16), POINTER :: CLUOUT=>NULL()
@@ -96,6 +98,7 @@ ENDIF
 ! Current model is set to model KTO
 CINIFILE=>LUNIT_MODEL(KTO)%CINIFILE
 CINIFILEPGD=>LUNIT_MODEL(KTO)%CINIFILEPGD
+TINIFILEPGD=>LUNIT_MODEL(KTO)%TINIFILEPGD
 COUTFILE=>LUNIT_MODEL(KTO)%COUTFILE
 TDIAFILE=>LUNIT_MODEL(KTO)%TDIAFILE
 CLUOUT=>LUNIT_MODEL(KTO)%CLUOUT
diff --git a/src/MNH/open_prc_files.f90 b/src/MNH/open_prc_files.f90
index 0b37a6c07..e08d9c08e 100644
--- a/src/MNH/open_prc_files.f90
+++ b/src/MNH/open_prc_files.f90
@@ -12,9 +12,12 @@
 !     ##########################
 !
 INTERFACE
-      SUBROUTINE OPEN_PRC_FILES(HPRE_REAL1,HATMFILE,HATMFILETYPE           &
-                                          ,HCHEMFILE,HCHEMFILETYPE         &
-                                          ,HSURFFILE,HSURFFILETYPE,HPGDFILE)
+      SUBROUTINE OPEN_PRC_FILES(HPRE_REAL1,HATMFILE,HATMFILETYPE,   &
+                                           HCHEMFILE,HCHEMFILETYPE, &
+                                           HSURFFILE,HSURFFILETYPE, &
+                                           HPGDFILE,TPPGDFILE)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
 !
 CHARACTER(LEN=28), INTENT(OUT) :: HPRE_REAL1   ! name of the PRE_REAL1 file
 CHARACTER(LEN=28), INTENT(OUT) :: HATMFILE     ! name of the input atmospheric file
@@ -24,15 +27,18 @@ CHARACTER(LEN=6),  INTENT(OUT) :: HCHEMFILETYPE! type of the input chemical file
 CHARACTER(LEN=28), INTENT(OUT) :: HSURFFILE    ! name of the input surface file
 CHARACTER(LEN=6),  INTENT(OUT) :: HSURFFILETYPE! type of the input surface file
 CHARACTER(LEN=28), INTENT(OUT) :: HPGDFILE     ! name of the physiographic data file
+TYPE(TFILEDATA),POINTER, INTENT(OUT) :: TPPGDFILE ! physiographic data file
+!
 END SUBROUTINE OPEN_PRC_FILES
 END INTERFACE
 END MODULE MODI_OPEN_PRC_FILES
 !
-!     ######################################################################
-      SUBROUTINE OPEN_PRC_FILES(HPRE_REAL1,HATMFILE,HATMFILETYPE           &
-                                          ,HCHEMFILE,HCHEMFILETYPE         &
-                                          ,HSURFFILE,HSURFFILETYPE,HPGDFILE)
-!     ######################################################################
+!     ###############################################################
+      SUBROUTINE OPEN_PRC_FILES(HPRE_REAL1,HATMFILE,HATMFILETYPE,   &
+                                           HCHEMFILE,HCHEMFILETYPE, &
+                                           HSURFFILE,HSURFFILETYPE, &
+                                           HPGDFILE,TPPGDFILE)
+!     ###############################################################
 !
 !!****  *OPEN_PRC_FILES* - openning of the files used in PREP_REAL_CASE
 !!
@@ -97,20 +103,22 @@ END MODULE MODI_OPEN_PRC_FILES
 USE MODD_CONF  ! declaration modules
 USE MODD_CONF_n
 !JUAN Z_SPLITTING
-USE MODD_CONFZ
+!USE MODD_CONFZ
 !JUAN Z_SPLITTING
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LUNIT
 USE MODD_LUNIT_n, CINIFILE_n=>CINIFILE , CINIFILEPGD_n=>CINIFILEPGD
 !
-!JUAN Z_SPLITTING
-USE MODN_CONFZ
-!JUAN Z_SPLITTING
 !
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 USE MODE_POS
 USE MODE_FM
 USE MODE_IO_ll
 !
 USE MODN_CONFIO, ONLY : NAM_CONFIO
+!JUAN Z_SPLITTING
+USE MODN_CONFZ
+!JUAN Z_SPLITTING
 !
 IMPLICIT NONE
 !
@@ -125,6 +133,7 @@ CHARACTER(LEN=6),  INTENT(OUT) :: HCHEMFILETYPE! type of the input chemical file
 CHARACTER(LEN=28), INTENT(OUT) :: HSURFFILE    ! name of the input surface file
 CHARACTER(LEN=6),  INTENT(OUT) :: HSURFFILETYPE! type of the input surface file
 CHARACTER(LEN=28), INTENT(OUT) :: HPGDFILE     ! name of the physiographic data file
+TYPE(TFILEDATA),POINTER, INTENT(OUT) :: TPPGDFILE ! physiographic data file
 !
 !*       0.2   Declaration of local variables
 !              ------------------------------
@@ -261,10 +270,11 @@ IF (LEN_TRIM(HPGDFILE)==0) THEN
 ELSE
 !-------------------------------------------------------------------------------
 !
-!*       5.    OPENNING THE PHYSIOGRAPHIC DATA FILE
-!              ------------------------------------
+!*       5.    OPENING THE PHYSIOGRAPHIC DATA FILE
+!              -----------------------------------
 !
-  CALL FMOPEN_ll(HPGDFILE,'READ',CLUOUT0,0,2,NVERB,ININAR,IRESP,OPARALLELIO=.FALSE.)
+  CALL IO_FILE_ADD2LIST(TPPGDFILE,TRIM(HPGDFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TPPGDFILE,CLUOUT0,IRESP,OPARALLELIO=.FALSE.)
   IF (IRESP/=0) THEN
     WRITE(ILUOUT0,*) 'STOP: problem during opening of PGD file ',HPGDFILE
 !callabortstop
@@ -285,8 +295,8 @@ WRITE(ILUOUT0,*) 'HPGDFILE= ', HPGDFILE
 !
 !  because of new parallel IO, FMATTR must be called just before opening the Aladin file
 !
-!*       6.2   OPENNING INPUT MESONH FILE
-!              --------------------------
+!*       6.2   OPENING INPUT MESONH FILE
+!              -------------------------
 !
 !  done during INIT
 !
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index 4d68f8e56..b3b7f1546 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -576,9 +576,10 @@ REAL              :: XHSLOP=1.2           ! if LHSLOP filtering of slopes higher
 REAL              :: ZZS_MAX, ZZS_MAX_ll
 INTEGER           :: IJPHEXT
 !
-TYPE(TFILEDATA),POINTER :: TZFILE
-TYPE(TFILEDATA),POINTER :: TZFILEDUMMY => NULL()
-TYPE(TFILEDATA),POINTER :: TZINIFILEPGD
+TYPE(TFILEDATA),POINTER :: TZFILE       => NULL()
+TYPE(TFILEDATA),POINTER :: TZFILEDUMMY  => NULL()
+TYPE(TFILEDATA),POINTER :: TZINIFILEPGD => NULL()
+TYPE(TFILEDATA),POINTER :: TZPGDFILE    => NULL()
 !
 !
 !*       0.2  Namelist declarations
@@ -622,9 +623,6 @@ NAMELIST/NAM_AERO_PRE/ LORILAM, LINITPM, XINIRADIUSI, XINIRADIUSJ, &
 !              --------
 CALL MPPDB_INIT()
 !
-TZFILE => NULL()
-TZINIFILEPGD => NULL()
-!
 CALL GOTO_MODEL(1)
 !
 CALL INITIO_ll()
@@ -711,13 +709,19 @@ CALL READ_PRE_IDEA_NAM_n(NLUPRE,NLUOUT)
 CALL POSNAM(NLUPRE,'NAM_AERO_PRE',GFOUND,NLUOUT)
 IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_AERO_PRE)
 !
+CALL INI_FIELD_LIST()
+!
+CALL INI_FIELD_SCALARS()
+!
 IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN 
   ! open the PGD_FILE
-  CALL FMOPEN_ll(CPGD_FILE,'READ',CLUOUT,NNPRAR,2,NVERB,NNINAR,NRESP)
+  CALL IO_FILE_ADD2LIST(TZPGDFILE,TRIM(CPGD_FILE),'UNKNOWN','READ',KLFINPRAR=NNPRAR,KLFITYPE=2,KLFIVERB=NVERB)
+  CALL IO_FILE_OPEN_ll(TZPGDFILE,CLUOUT,NRESP)
+
   ! read the grid in the PGD file
-  CALL FMREAD(CPGD_FILE,'IMAX',CLUOUT,'--',NIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CPGD_FILE,'JMAX',CLUOUT,'--',NJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(CPGD_FILE,'JPHEXT',CLUOUT,'--',IJPHEXT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZPGDFILE,'IMAX',  NIMAX)
+  CALL IO_READ_FIELD(TZPGDFILE,'JMAX',  NJMAX)
+  CALL IO_READ_FIELD(TZPGDFILE,'JPHEXT',IJPHEXT)
 
   IF ( CPGD_FILE /= CINIFILEPGD) THEN
      WRITE(NLUOUT,FMT=*) ' WARNING : in PRE_IDEA1.nam, in NAM_LUNITn you&
@@ -898,10 +902,6 @@ CALL INI_NSV(1)
 LHORELAX_SV(:)=.FALSE.
 IF(.NOT. L1D) LHORELAX_SV(1:NSV)=.TRUE.
 !
-CALL INI_FIELD_LIST()
-!
-CALL INI_FIELD_SCALARS()
-!
 !-------------------------------------------------------------------------------
 !
 !*       4.    ALLOCATE MEMORY FOR ARRAYS :  
@@ -1211,7 +1211,7 @@ IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN
 !--------------------------------------------------------
 ! the MESONH horizontal grid will be read in the PGD_FILE 
 !--------------------------------------------------------
-  CALL READ_HGRID(1,CPGD_FILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+  CALL READ_HGRID(1,TZPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
 ! control the cartesian option
   IF( LCARTESIAN ) THEN
      WRITE(NLUOUT,FMT=*) 'PREP_IDEAL_CASE : IN GENERAL, THE USE OF A PGD_FILE &
@@ -1867,7 +1867,7 @@ IF (CSURF =='EXTE' .AND. (LEN_TRIM(CPGD_FILE)==0 .OR. .NOT. LREAD_GROUND_PARAM))
 ENDIF
 CALL IO_FILE_CLOSE_ll(TZFILE,CLUOUT,NRESP)
 IF( LEN_TRIM(CPGD_FILE) /= 0 ) THEN
-  CALL FMCLOS_ll(CPGD_FILE,'KEEP',CLUOUT,NRESP)
+  CALL IO_FILE_CLOSE_ll(TZPGDFILE,CLUOUT,NRESP)
 ENDIF
 !
 !
diff --git a/src/MNH/prep_nest_pgd.f90 b/src/MNH/prep_nest_pgd.f90
index ea77ead1e..0db388877 100644
--- a/src/MNH/prep_nest_pgd.f90
+++ b/src/MNH/prep_nest_pgd.f90
@@ -151,8 +151,6 @@ INTEGER                        :: IINFO_ll ! return code of // routines
 INTEGER                        :: JPGD     ! loop control
 CHARACTER(LEN=28)              :: YMY_NAME,YDAD_NAME
 CHARACTER(LEN=2)               :: YSTORAGE_TYPE
-CHARACTER(LEN=100)             :: YCOMMENT
-INTEGER                        :: IGRID, ILENCH
 LOGICAL, DIMENSION(JPMODELMAX) :: L1D_ALL  ! Flag for      1D conf. for each PGD
 LOGICAL, DIMENSION(JPMODELMAX) :: L2D_ALL  ! Flag for      2D conf. for each PGD
 LOGICAL, DIMENSION(JPMODELMAX) :: LPACK_ALL! Flag for packing conf. for each PGD
@@ -218,14 +216,14 @@ CALL MPI_COMM_SIZE(NMNH_COMM_WORLD, NPROC, IINFO_ll)
 CALL SET_DAD0_ll()
 DO JPGD=1,NMODEL
   ! read and set dimensions and ratios of model JPGD
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'IMAX',CLUOUT0,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'JMAX',CLUOUT0,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'DXRATIO',CLUOUT0,'--',NDXRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'DYRATIO',CLUOUT0,'--',NDYRATIO_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'XSIZE',CLUOUT0,'--',NXSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'YSIZE',CLUOUT0,'--',NYSIZE(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'XOR',CLUOUT0,'--',NXOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'YOR',CLUOUT0,'--',NYOR_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'IMAX',   IIMAX)
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'JMAX',   IJMAX)
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'DXRATIO',NDXRATIO_ALL(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'DYRATIO',NDYRATIO_ALL(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'XSIZE',  NXSIZE(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'YSIZE',  NYSIZE(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'XOR',    NXOR_ALL(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'YOR',    NYOR_ALL(JPGD))
   CALL SET_DIM_ll(IIMAX, IJMAX, 1)
   ! compute origin and end of local subdomain of model JPGD
   ! initialize variables from MODD_NESTING, origin and end of global model JPGD in coordinates of its father
@@ -262,11 +260,11 @@ DO JPGD=1,NMODEL
   CALL GOTO_MODEL(JPGD)
   CALL GO_TOMODEL_ll(JPGD,IINFO_ll)
   CALL GOTO_SURFEX(JPGD)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'L1D         ',CLUOUT0,'--',L1D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'L2D         ',CLUOUT0,'--',L2D_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(TZFILEPGD(JPGD)%TZFILE%CNAME,'PACK        ',CLUOUT0,'--',LPACK_ALL(JPGD),IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'L1D', L1D_ALL(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'L2D', L2D_ALL(JPGD))
+  CALL IO_READ_FIELD(TZFILEPGD(JPGD)%TZFILE,'PACK',LPACK_ALL(JPGD))
   CALL SET_FMPACK_ll(L1D_ALL(JPGD),L2D_ALL(JPGD),LPACK_ALL(JPGD))
-  CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%TZFILE%CNAME,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+  CALL READ_HGRID(JPGD,TZFILEPGD(JPGD)%TZFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
   CSTORAGE_TYPE='PG'
 END DO
   CALL INI_PARAZ_ll(IINFO_ll)
diff --git a/src/MNH/prep_real_case.f90 b/src/MNH/prep_real_case.f90
index 61bc3c37b..0cf14b1cd 100644
--- a/src/MNH/prep_real_case.f90
+++ b/src/MNH/prep_real_case.f90
@@ -514,7 +514,8 @@ LOGICAL  :: LUSECHAQ
 LOGICAL  :: LUSECHIC
 LOGICAL  :: LUSECHEM
 !
-TYPE(TFILEDATA),POINTER :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE    => NULL()
+TYPE(TFILEDATA),POINTER :: TZPGDFILE => NULL()
 !
 !
 !*       0.3   Declaration of namelists
@@ -553,8 +554,6 @@ ZHORI  = 0.
 ZSURF  = 0.
 ZTIME1 = ZSTART
 !
-TZFILE => NULL()
-!
 !*       1.    SET DEFAULT VALUES
 !              ------------------
 !
@@ -576,7 +575,7 @@ CALL INITIO_ll()
 CALL OPEN_PRC_FILES(YPRE_REAL1,YATMFILE, YATMFILETYPE  &
                               ,YCHEMFILE,YCHEMFILETYPE &
                               ,YSURFFILE,YSURFFILETYPE &
-                              ,YPGDFILE)
+                              ,YPGDFILE,TZPGDFILE)
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 CPGDFILE = YPGDFILE
@@ -640,8 +639,8 @@ IF (YATMFILETYPE == 'GRIBEX') THEN
 CALL INIT_NMLVAR()
 CALL READ_VER_GRID(YPRE_REAL1)
 !
-CALL FMREAD(CPGDFILE,'IMAX',CLUOUT0,'--',NIMAX,IGRID,ILENGTH,HCOMMENT,IRESP)
-CALL FMREAD(CPGDFILE,'JMAX',CLUOUT0,'--',NJMAX,IGRID,ILENGTH,HCOMMENT,IRESP)
+CALL IO_READ_FIELD(TZPGDFILE,'IMAX',NIMAX)
+CALL IO_READ_FIELD(TZPGDFILE,'JMAX',NJMAX)
 !
 NIMAX_ll=NIMAX   !! _ll variables are global variables
 NJMAX_ll=NJMAX   !! but the old names are kept in PRE_IDEA1.nam file
@@ -720,12 +719,12 @@ ZMISC = ZTIME2 - ZTIME1
 ZTIME1 = ZTIME2
 !
 IF (YATMFILETYPE=='MESONH') THEN
-  CALL READ_ALL_DATA_MESONH_CASE(YPRE_REAL1,YATMFILE,YPGDFILE,YDAD_NAME)
+  CALL READ_ALL_DATA_MESONH_CASE(YPRE_REAL1,YATMFILE,TZPGDFILE,YDAD_NAME)
 ELSE IF (YATMFILETYPE=='GRIBEX') THEN
   IF(LEN_TRIM(YCHEMFILE)>0 .AND. YCHEMFILETYPE=='GRIBEX')THEN
-    CALL READ_ALL_DATA_GRIB_CASE('ATM1',YPRE_REAL1,YATMFILE,YPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+    CALL READ_ALL_DATA_GRIB_CASE('ATM1',YPRE_REAL1,YATMFILE,TZPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
   ELSE
-    CALL READ_ALL_DATA_GRIB_CASE('ATM0',YPRE_REAL1,YATMFILE,YPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+    CALL READ_ALL_DATA_GRIB_CASE('ATM0',YPRE_REAL1,YATMFILE,TZPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
   END IF
 !
   YDAD_NAME=' '
@@ -749,7 +748,7 @@ IF(LEN_TRIM(YCHEMFILE)>0)THEN
   CALL POSNAM(IPRE_REAL1,'NAM_AERO_CONF',GFOUND,ILUOUT0)
   IF (GFOUND) READ(IPRE_REAL1,NAM_AERO_CONF)
   IF(YCHEMFILETYPE=='GRIBEX') &
-  CALL READ_ALL_DATA_GRIB_CASE('CHEM',YPRE_REAL1,YCHEMFILE,YPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
+  CALL READ_ALL_DATA_GRIB_CASE('CHEM',YPRE_REAL1,YCHEMFILE,TZPGDFILE,ZHORI,NVERB,LDUMMY_REAL)
 END IF
 !
 CALL CLOSE_ll(YPRE_REAL1, IOSTAT=IRESP)
@@ -1068,7 +1067,7 @@ ZWRITE = ZTIME2 - ZTIME1
 !
 !* reading in the PGD file
 !
-CALL MNHREAD_ZS_DUMMY_n(YPGDFILE)
+CALL MNHREAD_ZS_DUMMY_n(TZPGDFILE)
 !
 !* writing in the output file
 !
diff --git a/src/MNH/prep_surf_mnh.f90 b/src/MNH/prep_surf_mnh.f90
index d19845c7b..47067da09 100644
--- a/src/MNH/prep_surf_mnh.f90
+++ b/src/MNH/prep_surf_mnh.f90
@@ -53,8 +53,8 @@ END MODULE MODI_PREP_SURF_MNH
 !
 USE MODD_LUNIT_n,     ONLY : CINIFILE
 USE MODD_TIME_n,      ONLY : TDTCUR
-USE MODD_LUNIT,       ONLY : CLUOUT0, COUTFMFILE, CPGDFILE
-USE MODD_IO_SURF_MNH, ONLY : COUTFILE, CFILE
+USE MODD_LUNIT,       ONLY : CLUOUT0, COUTFMFILE
+USE MODD_IO_SURF_MNH, ONLY : COUTFILE
 USE MODE_FM
 !
 USE MODI_INIT_PGD_SURF_ATM
diff --git a/src/MNH/prep_surfex.f90 b/src/MNH/prep_surfex.f90
index c7e405b23..181104754 100644
--- a/src/MNH/prep_surfex.f90
+++ b/src/MNH/prep_surfex.f90
@@ -86,7 +86,8 @@ INTEGER               :: IINFO_ll        ! return code of // routines
 CHARACTER (LEN=100)   :: HCOMMENT
 INTEGER               :: II, IJ, IGRID, ILENGTH
 !
-TYPE(TFILEDATA),POINTER :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE    => NULL()
+TYPE(TFILEDATA),POINTER :: TZPGDFILE => NULL()
 !
 !-------------------------------------------------------------------------------
 !
@@ -94,8 +95,6 @@ TYPE(TFILEDATA),POINTER :: TZFILE
 !*       1.    SET DEFAULT VALUES
 !              ------------------
 !
-TZFILE => NULL()
-!
 CALL GOTO_MODEL(1)
 !
 CALL VERSION
@@ -111,7 +110,7 @@ CALL INITIO_ll()
 CALL OPEN_PRC_FILES(YPRE_REAL1,YATMFILE, YATMFILETYPE  &
                               ,YCHEMFILE,YCHEMFILETYPE &
                               ,YSURFFILE,YSURFFILETYPE &
-                              ,YPGDFILE)
+                              ,YPGDFILE,TZPGDFILE)
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 CPGDFILE = YPGDFILE
diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index 91d0ac3d3..68f698ab1 100644
--- a/src/MNH/read_all_data_grib_case.f90
+++ b/src/MNH/read_all_data_grib_case.f90
@@ -12,22 +12,25 @@
       MODULE MODI_READ_ALL_DATA_GRIB_CASE
 !     #################################
 INTERFACE
-SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,HPRE_REAL1,HGRIB,HPGDFILE,      &
+SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,HPRE_REAL1,HGRIB,TPPGDFILE,     &
                     PTIME_HORI,KVERB,ODUMMY_REAL                         ) 
 !
-CHARACTER(LEN=4),   INTENT(IN) :: HFILE    !which file ('ATM0','ATM1' or 'CHEM')
-CHARACTER(LEN=28),  INTENT(IN) :: HPRE_REAL1 ! name of the PRE_REAL1 file
-CHARACTER(LEN=28),  INTENT(IN) :: HGRIB    ! name of the GRIB file
-CHARACTER(LEN=28),  INTENT(IN) :: HPGDFILE ! name of the physiographic data file
-INTEGER,           INTENT(IN)  :: KVERB    ! verbosity level
-LOGICAL,           INTENT(IN)  :: ODUMMY_REAL! flag to interpolate dummy fields
-REAL,           INTENT(INOUT)  :: PTIME_HORI ! time spent in hor. interpolations
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+CHARACTER(LEN=4),  INTENT(IN)    :: HFILE       ! which file ('ATM0','ATM1' or 'CHEM')
+CHARACTER(LEN=28), INTENT(IN)    :: HPRE_REAL1  ! name of the PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HGRIB       ! name of the GRIB file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE   ! physiographic data file
+INTEGER,           INTENT(IN)    :: KVERB       ! verbosity level
+LOGICAL,           INTENT(IN)    :: ODUMMY_REAL ! flag to interpolate dummy fields
+REAL,              INTENT(INOUT) :: PTIME_HORI  ! time spent in hor. interpolations
+!
 END SUBROUTINE READ_ALL_DATA_GRIB_CASE
 !
 END INTERFACE
 END MODULE MODI_READ_ALL_DATA_GRIB_CASE
 !     ##########################################################################
-      SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,HPRE_REAL1,HGRIB,HPGDFILE,      &
+      SUBROUTINE READ_ALL_DATA_GRIB_CASE(HFILE,HPRE_REAL1,HGRIB,TPPGDFILE,     &
                        PTIME_HORI,KVERB,ODUMMY_REAL                            )
 !     ##########################################################################
 !
@@ -135,6 +138,7 @@ END MODULE MODI_READ_ALL_DATA_GRIB_CASE
 USE MODE_FM
 USE MODE_IO_ll
 USE MODE_TIME
+USE MODE_THERMO
 !
 USE MODI_ADD_FORECAST_TO_DATE
 USE MODI_READ_HGRID_n
@@ -147,7 +151,9 @@ USE MODI_REMOVAL_VORTEX
 USE MODI_CH_INIT_CCS
 USE MODI_CH_AER_INIT_SOA
 USE MODI_INI_CTURB
+USE MODI_CH_OPEN_INPUT
 !
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_CONF
 USE MODD_CONF_n
 USE MODD_CST
@@ -170,23 +176,21 @@ USE MODE_MODELN_HANDLER
 !JUAN REALZ
 USE MODE_MPPDB
 !JUAN REALZ
+!
 USE GRIB_API
-USE MODI_CH_OPEN_INPUT  
-USE MODE_THERMO
-
 !
 IMPLICIT NONE
 !
 !* 0.1. Declaration of arguments
 !       ------------------------
 !
-CHARACTER(LEN=4),       INTENT(IN) :: HFILE !which file ('ATM0','ATM1' or 'CHEM')
-CHARACTER(LEN=28),      INTENT(IN) :: HPRE_REAL1 ! name of the PRE_REAL1 file
-CHARACTER(LEN=28),      INTENT(IN) :: HGRIB      ! name of the GRIB file
-CHARACTER(LEN=28),      INTENT(IN) :: HPGDFILE   ! name of the physiographic data file
-INTEGER,               INTENT(IN)  :: KVERB    ! verbosity level
-LOGICAL,               INTENT(IN)  :: ODUMMY_REAL! flag to interpolate dummy fields
-REAL,                INTENT(INOUT) :: PTIME_HORI ! time spent in hor. interpolations
+CHARACTER(LEN=4),  INTENT(IN)    :: HFILE       ! which file ('ATM0','ATM1' or 'CHEM')
+CHARACTER(LEN=28), INTENT(IN)    :: HPRE_REAL1  ! name of the PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HGRIB       ! name of the GRIB file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE   ! physiographic data file
+INTEGER,           INTENT(IN)    :: KVERB       ! verbosity level
+LOGICAL,           INTENT(IN)    :: ODUMMY_REAL ! flag to interpolate dummy fields
+REAL,              INTENT(INOUT) :: PTIME_HORI  ! time spent in hor. interpolations
 !
 !* 0.2 Declaration of local variables
 !      ------------------------------
@@ -194,7 +198,7 @@ REAL,                INTENT(INOUT) :: PTIME_HORI ! time spent in hor. interpolat
 INTEGER                            :: ILUOUT0       ! Unit used for output msg.
 INTEGER                            :: IRESP   ! Return code of FM-routines
 INTEGER                            :: IRET          ! Return code from subroutines
-INTEGER(KIND=kindOfInt)                  :: IRET_GRIB          ! Return code from subroutines
+INTEGER(KIND=kindOfInt)            :: IRET_GRIB          ! Return code from subroutines
 REAL                               :: ZA,ZB,ZC      ! Dummy variables
 REAL                               :: ZD,ZE,ZF      !  |
 REAL                               :: ZTEMP         !  |
@@ -325,7 +329,7 @@ IMI = GET_CURRENT_MODEL_INDEX()
 !     -------------
 !
 CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRET)
-CALL READ_HGRID_n(HPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+CALL READ_HGRID_n(TPPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
 !
 ! 1.1 Domain restriction
 !
diff --git a/src/MNH/read_all_data_mesonh_case.f90 b/src/MNH/read_all_data_mesonh_case.f90
index 57054d46a..cc369a623 100644
--- a/src/MNH/read_all_data_mesonh_case.f90
+++ b/src/MNH/read_all_data_mesonh_case.f90
@@ -12,13 +12,15 @@
 MODULE MODI_READ_ALL_DATA_MESONH_CASE
 !####################################
 INTERFACE
-      SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,HPGDFILE,        &
-                              HDAD_NAME                                        )
-
-CHARACTER(LEN=28),  INTENT(IN)  :: HPRE_REAL1 ! name of the PRE_REAL1 file
-CHARACTER(LEN=28),  INTENT(IN)  :: HFMFILE    ! name of the Mesonh input file
-CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE   ! name of the physiographic data file
-CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME! true name of the Mesonh input file
+      SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,TPPGDFILE, &
+                              HDAD_NAME                                  )
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+CHARACTER(LEN=28), INTENT(IN)    :: HPRE_REAL1 ! name of the PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HFMFILE    ! name of the Mesonh input file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE  ! physiographic data file
+CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME  ! true name of the Mesonh input file
 !
 END SUBROUTINE READ_ALL_DATA_MESONH_CASE
 !
@@ -26,10 +28,10 @@ END INTERFACE
 !
 END MODULE MODI_READ_ALL_DATA_MESONH_CASE
 !
-!     #########################################################################
-      SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,HPGDFILE,        &
-                              HDAD_NAME                                        )
-!     #########################################################################
+!     ####################################################################
+      SUBROUTINE READ_ALL_DATA_MESONH_CASE(HPRE_REAL1,HFMFILE,TPPGDFILE, &
+                              HDAD_NAME                                  )
+!     ####################################################################
 !
 !!****  *READ_ALL_DATA_MESONH_CASE* - reads data for the initialization of real cases.
 !! 
@@ -131,6 +133,7 @@ USE MODI_ZS_BOUNDARY
 !
 USE MODD_CONF           ! declaration modules
 USE MODD_CONF_n
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_PARAM_n
 USE MODD_LUNIT
 USE MODD_LUNIT_n
@@ -160,10 +163,10 @@ IMPLICIT NONE
 !*       0.1   Declaration of arguments
 !              ------------------------
 !
-CHARACTER(LEN=28),  INTENT(IN)  :: HPRE_REAL1 ! name of the PRE_REAL1 file
-CHARACTER(LEN=28),  INTENT(IN)  :: HFMFILE    ! name of the Mesonh input file
-CHARACTER(LEN=28),  INTENT(IN)  :: HPGDFILE   ! name of the physiographic data file
-CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME! true name of the Mesonh input file
+CHARACTER(LEN=28), INTENT(IN)    :: HPRE_REAL1 ! name of the PRE_REAL1 file
+CHARACTER(LEN=28), INTENT(IN)    :: HFMFILE    ! name of the Mesonh input file
+TYPE(TFILEDATA),   INTENT(IN)    :: TPPGDFILE  ! physiographic data file
+CHARACTER(LEN=*),  INTENT(INOUT) :: HDAD_NAME  ! true name of the Mesonh input file
 !
 !
 !*       0.2   Declaration of local variables
@@ -247,7 +250,7 @@ XRES = ZRES
 !*            2. Reading of physiographic data domain
 !                ------------------------------------
 !
-CALL READ_HGRID(0,HPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
+CALL READ_HGRID(0,TPPGDFILE,YPGD_NAME,YPGD_DAD_NAME,YPGD_TYPE)
 !
 !*            3. Reading of large-scale grid and time
 !                ------------------------------------
@@ -323,15 +326,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(HPGDFILE,'ZS',CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL FMREAD(TPPGDFILE%CNAME,'ZS',CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
 CALL ZS_BOUNDARY(XZS,XZS_LS)
 !
 ALLOCATE(XZSMT(IISUP_LS-IIINF_LS+1,IJSUP_LS-IJINF_LS+1))
-CALL FMREAD(HPGDFILE,'MASDEV',CLUOUT,'XY',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL FMREAD(TPPGDFILE%CNAME,'MASDEV',CLUOUT,'XY',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
 IF (IMASDEV<=46) THEN
   XZSMT = XZS
 ELSE
-  CALL FMREAD(HPGDFILE,'ZSMT',CLUOUT,'XY',XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL FMREAD(TPPGDFILE%CNAME,'ZSMT',CLUOUT,'XY',XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF 
 CALL ZS_BOUNDARY(XZSMT,XZSMT_LS)
 !
diff --git a/src/MNH/read_dummy_gr_fieldn.f90 b/src/MNH/read_dummy_gr_fieldn.f90
index 0a733a324..5732f8fba 100644
--- a/src/MNH/read_dummy_gr_fieldn.f90
+++ b/src/MNH/read_dummy_gr_fieldn.f90
@@ -14,31 +14,19 @@ MODULE MODI_READ_DUMMY_GR_FIELD_n
 !
 INTERFACE
 !
-      SUBROUTINE READ_DUMMY_GR_FIELD_n(HINIFILE,HLUOUT,                     &
+      SUBROUTINE READ_DUMMY_GR_FIELD_n(TPINIFILE,HLUOUT,                    &
                                        KIINF,KISUP,KJINF,KJSUP,             &
                                        OREAD_ALL                            )
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 !
 !*       0.1   declarations of arguments
 !
-!
-CHARACTER (LEN=*),               INTENT(IN)  :: HINIFILE       ! name of the 
-                                                               ! initial file
-CHARACTER (LEN=*),               INTENT(IN)  :: HLUOUT         ! name for
-                                                               ! output-listing
-                                                               !  of nested models
-INTEGER,                         INTENT(IN)  :: KIINF,KISUP    ! Lower and upper
-                                                               ! dimensions in x
-                                                               ! direction  for
-                                                               ! working window
-INTEGER,                         INTENT(IN)  :: KJINF,KJSUP    ! Lower and upper
-                                                               ! dimensions in y
-                                                               ! direction  for
-                                                               ! working window 
-LOGICAL,                         INTENT(IN) :: OREAD_ALL       ! flag to read the
-!                                                              ! entire 2D fields
-!                                                              ! in the file.
-!
+TYPE(TFILEDATA),  INTENT(IN)  :: TPINIFILE    ! Initial file
+CHARACTER(LEN=*), INTENT(IN)  :: HLUOUT       ! Name for output-listing of nested models
+INTEGER,          INTENT(IN)  :: KIINF,KISUP  ! Lower and upper Dimensions in x direction for working window
+INTEGER,          INTENT(IN)  :: KJINF,KJSUP  ! Lower and upper dimensions in y direction for working window
+LOGICAL,          INTENT(IN)  :: OREAD_ALL    ! Flag to read the entire 2D fields in the file.
 !
 END SUBROUTINE READ_DUMMY_GR_FIELD_n
 !
@@ -53,7 +41,7 @@ END MODULE MODI_READ_DUMMY_GR_FIELD_n
 !
 !
 !     #######################################################################
-      SUBROUTINE READ_DUMMY_GR_FIELD_n(HINIFILE,HLUOUT,                     &
+      SUBROUTINE READ_DUMMY_GR_FIELD_n(TPINIFILE,HLUOUT,                    &
                                        KIINF,KISUP,KJINF,KJSUP,             &
                                        OREAD_ALL                            )
 !     #######################################################################
@@ -94,9 +82,11 @@ END MODULE MODI_READ_DUMMY_GR_FIELD_n
 !
 !*       0.    DECLARATIONS
 !
-USE MODD_PARAMETERS
-USE MODD_GRID_n
 USE MODD_DUMMY_GR_FIELD_n
+USE MODE_FIELD, ONLY : TFIELDDATA,TYPEINT,TYPEREAL
+USE MODD_GRID_n
+USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_PARAMETERS
 !
 USE MODE_FMREAD
 USE MODE_FM
@@ -106,32 +96,20 @@ IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
-CHARACTER (LEN=*),               INTENT(IN)  :: HINIFILE       ! name of the 
-                                                               ! initial file
-CHARACTER (LEN=*),               INTENT(IN)  :: HLUOUT         ! name for
-                                                               ! output-listing
-                                                               !  of nested models
-INTEGER,                         INTENT(IN)  :: KIINF,KISUP    ! Lower and upper
-                                                               ! dimensions in x
-                                                               ! direction  for
-                                                               ! working window
-INTEGER,                         INTENT(IN)  :: KJINF,KJSUP    ! Lower and upper
-                                                               ! dimensions in y
-                                                               ! direction  for
-                                                               ! working window
-LOGICAL,                         INTENT(IN) :: OREAD_ALL       ! flag to read the
-!                                                              ! entire 2D fields
-!                                                              ! in the file.
+TYPE(TFILEDATA),  INTENT(IN)  :: TPINIFILE    ! Initial file
+CHARACTER(LEN=*), INTENT(IN)  :: HLUOUT       ! Name for output-listing of nested models
+INTEGER,          INTENT(IN)  :: KIINF,KISUP  ! Lower and upper Dimensions in x direction for working window
+INTEGER,          INTENT(IN)  :: KJINF,KJSUP  ! Lower and upper dimensions in y direction for working window
+LOGICAL,          INTENT(IN)  :: OREAD_ALL    ! Flag to read the entire 2D fields in the file.
 !
 !*       0.2   declarations of local variables
 !
-INTEGER             :: IGRID,ILENCH,IRESP         !   File 
-CHARACTER (LEN=16)  :: YRECFM                     ! management
-CHARACTER (LEN=100) :: YCOMMENT                   ! variables
-CHARACTER (LEN=20 ) :: YSTRING20                  ! string
-CHARACTER (LEN=3  ) :: YSTRING03                  ! string
-INTEGER             :: ILUOUT                     ! Unit number for prints
-INTEGER             :: JDUMMY                     ! Loop index for cover data
+INTEGER             :: IRESP       ! File management
+CHARACTER (LEN=16)  :: YRECFM      ! variables
+CHARACTER (LEN=20 ) :: YSTRING20   ! string
+CHARACTER (LEN=3  ) :: YSTRING03   ! string
+INTEGER             :: ILUOUT      ! Unit number for prints
+INTEGER             :: JDUMMY      ! Loop index for cover data
 !
 INTEGER             :: IMASDEV ! masdev used for creation of input FM file
 !
@@ -142,6 +120,7 @@ INTEGER                           :: IIINF  ! lower I index
 INTEGER                           :: IISUP  ! upper I index
 INTEGER                           :: IJINF  ! lower J index
 INTEGER                           :: IJSUP  ! upper J index
+TYPE(TFIELDDATA)                  :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -150,8 +129,7 @@ CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
 !*       1..   TEST MASDEV VERSION OF INPUT FILE
 !              ---------------------------------
 !
-YRECFM = 'MASDEV'
-CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPINIFILE,'MASDEV',IMASDEV,IRESP)
 IF (IRESP /= 0) IMASDEV=33
 !
 !-------------------------------------------------------------------------------
@@ -180,11 +158,8 @@ ELSE
   IJINF = KJINF
   IJSUP = KJSUP
   !
-  YRECFM='IMAX'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',IIWORK,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='JMAX'
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'--',IJWORK,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'IMAX',IIWORK)
+  CALL IO_READ_FIELD(TPINIFILE,'JMAX',IJWORK)
   !
   ALLOCATE(ZWORK(IIWORK+2*JPHEXT,IJWORK+2*JPHEXT))
 END IF
@@ -196,10 +171,20 @@ END IF
 !
 !
 IF (IMASDEV>=40) THEN
-  CALL FMREAD(HINIFILE,'DUMMY_GR_NBR',HLUOUT,'--', &
-            NDUMMY_GR_NBR,IGRID,ILENCH,YCOMMENT,IRESP)
-  IF (IRESP/=0) THEN
-     !callabortstop
+  TZFIELD%CMNHNAME   = 'DUMMY_GR_NBR'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: DUMMY_GR_NBR'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = 'number of dummy pgd fields chosen by user'
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 0
+  !
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,NDUMMY_GR_NBR,IRESP)
+  !
+  IF (IRESP/=0 .AND. IRESP/=-111) THEN
+    !callabortstop
     CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
     CALL ABORT
     STOP
@@ -216,18 +201,30 @@ ALLOCATE(XDUMMY_GR_FIELDS(SIZE(XXHAT),SIZE(XYHAT),NDUMMY_GR_NBR))
 !
 DO JDUMMY=1,NDUMMY_GR_NBR
   WRITE(YRECFM,'(A8,I3.3,A5)') 'DUMMY_GR',JDUMMY,'     '
-  CALL FMREAD(HINIFILE,YRECFM,HLUOUT,'XY', &
-              ZWORK(:,:),IGRID,ILENCH,YCOMMENT,IRESP)
-  IF (IRESP/=0) THEN
-     !callabortstop
+  TZFIELD%CMNHNAME   = TRIM(YRECFM)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(YRECFM)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  ! Expected comment is not known but is in the following form:
+  ! 'X_Y_'//YRECFM//YSTRING20//YSTRING03
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
+  !
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,ZWORK(:,:))
+  !
+  IF (IRESP/=0 .AND. IRESP/=-111) THEN
+    !callabortstop
     CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
     CALL ABORT
     STOP
   ENDIF
   XDUMMY_GR_FIELDS(:,:,JDUMMY) = ZWORK(IIINF:IISUP,IJINF:IJSUP)
   !
-  YSTRING20=YCOMMENT(21:40)
-  YSTRING03=YCOMMENT(41:43)
+  YSTRING20=TZFIELD%CCOMMENT( 4+LEN(YRECFM)+1                : 4+LEN(YRECFM)+LEN(YSTRING20) )
+  YSTRING03=TZFIELD%CCOMMENT( 4+LEN(YRECFM)+LEN(YSTRING20)+1 : 4+LEN(YRECFM)+LEN(YSTRING20)+LEN(YSTRING03) )
   !
   CDUMMY_GR_NAME(JDUMMY) = YSTRING20
   CDUMMY_GR_AREA(JDUMMY) = YSTRING03
diff --git a/src/MNH/read_field.f90 b/src/MNH/read_field.f90
index a5be8e716..13017f631 100644
--- a/src/MNH/read_field.f90
+++ b/src/MNH/read_field.f90
@@ -238,42 +238,42 @@ END MODULE MODI_READ_FIELD
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODE_FM
-USE MODE_IO_ll, ONLY : UPCASE
 !
-USE MODD_IO_ll, ONLY : TFILEDATA
+USE MODD_2D_FRC
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
 USE MODD_CONF
 USE MODD_CONF_n
-USE MODD_TIME ! for type DATE_TIME
 USE MODD_CST
 USE MODD_CTURB
-USE MODD_NSV
 USE MODD_DUST
-USE MODD_SALT
-USE MODD_PASPOL
+USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
 #ifdef MNH_FOREFIRE
 USE MODD_FOREFIRE
 #endif
-USE MODD_CH_AEROSOL
-!
-USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
 USE MODD_ICE_C1R3_DESCR,  ONLY: C1R3NAMES
-USE MODD_CH_M9_n,         ONLY: CNAMES, CICNAMES
+USE MODD_IO_ll,           ONLY: TFILEDATA
+USE MODD_NSV
+USE MODD_LATZ_EDFLX
 USE MODD_LG,              ONLY: CLGNAMES
-USE MODD_ELEC_DESCR,      ONLY: CELECNAMES
 USE MODD_PARAM_C2R2,      ONLY: LSUPSAT
 !
 USE MODD_PARAM_LIMA     , ONLY: NMOD_CCN, LSCAV, LAERO_MASS,                &
                                 NMOD_IFN, NMOD_IMM, NINDICE_CCN_IMM, LHHONI
-USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
 USE MODD_PARAM_LIMA_COLD, ONLY: CLIMA_COLD_NAMES
+USE MODD_PARAM_LIMA_WARM, ONLY: CLIMA_WARM_NAMES, CAERO_MASS
+USE MODD_PASPOL
+USE MODD_RAIN_C2R2_DESCR, ONLY: C2R2NAMES
+USE MODD_SALT
+USE MODD_TIME ! for type DATE_TIME
 !
+USE MODE_FIELD,           ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FM
 USE MODE_FMREAD
-USE MODI_INI_LS
-USE MODI_INI_LB
+USE MODE_IO_ll,           ONLY: UPCASE
 !
-USE MODD_LATZ_EDFLX
-USE MODD_2D_FRC
+USE MODI_INI_LB
+USE MODI_INI_LS
 !
 IMPLICIT NONE
 !
@@ -403,6 +403,7 @@ REAL, DIMENSION(KIU,KJU,KKU):: XDTH3D,XDRV3D
 !
 CHARACTER(LEN=2)  :: INDICE
 INTEGER           :: I
+TYPE(TFIELDDATA)  :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
@@ -465,12 +466,9 @@ SELECT CASE(HGETTKET)
     ELSE
       YRECFM = 'TKET'
     END IF
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PTKET,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,YRECFM,PTKET)
     IF (KMASDEV>50 .AND. (CCONF == 'RESTA')) THEN
-      YRECFM = 'TKEMS'
-      YDIR='XY'
-      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PRTKEMS,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL IO_READ_FIELD(TPINIFILE,YRECFM,PRTKEMS)
     END IF
   CASE('INIT')
     PTKET(:,:,:)=XTKEMIN
@@ -627,55 +625,64 @@ END DO
 DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
   SELECT CASE(HGETSVT(JSV))
   CASE ('READ')
+    TZFIELD%CSTDNAME   = ''
+    WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CUNITS     = 'kg-1'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
 ! Nc
     IF (JSV .EQ. NSV_LIMA_NC) THEN
-      YRECFM=TRIM(CLIMA_WARM_NAMES(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(1))//'T'
     END IF
 ! Nr
     IF (JSV .EQ. NSV_LIMA_NR) THEN
-      YRECFM=TRIM(CLIMA_WARM_NAMES(2))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(2))//'T'
     END IF
 ! N CCN free
     IF (JSV .GE. NSV_LIMA_CCN_FREE .AND. JSV .LT. NSV_LIMA_CCN_ACTI) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_FREE + 1)
-      YRECFM=TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(3))//INDICE//'T'
     END IF
 ! N CCN acti
     IF (JSV .GE. NSV_LIMA_CCN_ACTI .AND. JSV .LT. NSV_LIMA_CCN_ACTI + NMOD_CCN) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_CCN_ACTI + 1)
-      YRECFM=TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_WARM_NAMES(4))//INDICE//'T'
     END IF
 ! Scavenging
     IF (JSV .EQ. NSV_LIMA_SCAVMASS) THEN
-      YRECFM=TRIM(CAERO_MASS(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CAERO_MASS(1))//'T'
+      TZFIELD%CUNITS     = 'kg kg-1'
     END IF
 ! Ni
     IF (JSV .EQ. NSV_LIMA_NI) THEN
-      YRECFM=TRIM(CLIMA_COLD_NAMES(1))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(1))//'T'
     END IF
 ! N IFN free
     IF (JSV .GE. NSV_LIMA_IFN_FREE .AND. JSV .LT. NSV_LIMA_IFN_NUCL) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_FREE + 1)
-      YRECFM=TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(2))//INDICE//'T'
     END IF
 ! N IFN nucl
     IF (JSV .GE. NSV_LIMA_IFN_NUCL .AND. JSV .LT. NSV_LIMA_IFN_NUCL + NMOD_IFN) THEN
       WRITE(INDICE,'(I2.2)')(JSV - NSV_LIMA_IFN_NUCL + 1)
-      YRECFM=TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(3))//INDICE//'T'
     END IF
 ! N IMM nucl
     I = 0
     IF (JSV .GE. NSV_LIMA_IMM_NUCL .AND. JSV .LT. NSV_LIMA_IMM_NUCL + NMOD_IMM) THEN
     I = I + 1
     WRITE(INDICE,'(I2.2)')(NINDICE_CCN_IMM(I))
-    YRECFM=TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(4))//INDICE//'T'
   END IF
 ! Hom. freez. of CCN
   IF (JSV .EQ. NSV_LIMA_HOM_HAZE) THEN
-    YRECFM=TRIM(CLIMA_COLD_NAMES(5))//'T'
+      TZFIELD%CMNHNAME   = TRIM(CLIMA_COLD_NAMES(5))//'T'
   END IF
 !
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+  CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z3D)
 !
     PSVT(:,:,:,JSV) = Z3D(:,:,:)
   CASE ('INIT')
@@ -1021,16 +1028,7 @@ CALL IO_READ_FIELD(TPINIFILE,'DRYMASST',PDRYMASST) ! dry mass
 !
 SELECT CASE(HGETSRCT)                ! turbulent flux SRC at time t
   CASE('READ')
-    YRECFM='SRCT'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
-    IF( IRESP /= 0 ) THEN
-      YRECFM='SRC'
-      YDIR='XY'
-      CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-    END IF
+    CALL IO_READ_FIELD(TPINIFILE,'SRCT',Z3D)
     PSRCT(:,:,:)=Z3D(:,:,:)
   CASE('INIT')
     PSRCT(:,:,:)=0.
@@ -1038,40 +1036,28 @@ END SELECT
 !
 SELECT CASE(HGETSIGS)                ! subgrid condensation
   CASE('READ')
-    YRECFM='SIGS'
-    YDIR='XY' 
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PSIGS,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'SIGS',PSIGS)
   CASE('INIT')
     PSIGS(:,:,:)=0.
 END SELECT
 !
 SELECT CASE(HGETPHC)             ! pH in cloud water
   CASE('READ')
-    YRECFM='PHC'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPHC,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'PHC',PPHC)
   CASE('INIT')
     PPHC(:,:,:)=0.
 END SELECT
 !
 SELECT CASE(HGETPHR)             ! pH in rainwater
   CASE('READ')
-    YRECFM='PHR'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PPHR,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'PHR',PPHR)
   CASE('INIT')
     PPHR(:,:,:)=0.
 END SELECT
 !
 IRESP=0
 IF(HGETCLDFR=='READ') THEN           ! cloud fraction
-    YRECFM='CLDFR'
-    YDIR='XY' 
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PCLDFR,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'CLDFR',PCLDFR)
 ENDIF
 IF(HGETCLDFR=='INIT' .OR. IRESP /= 0) THEN
   IF(SIZE(PRT,4) > 3) THEN
@@ -1092,9 +1078,7 @@ ENDIF
 !* boundary layer depth
 !
 IF (HGETBL_DEPTH=='READ') THEN
-  YRECFM = 'BL_DEPTH'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'BL_DEPTH',PBL_DEPTH)
 ELSE
   PBL_DEPTH(:,:)=XUNDEF
 END IF
@@ -1102,9 +1086,7 @@ END IF
 !* surface boundary layer depth
 !
 IF (HGETSBL_DEPTH=='READ') THEN
-  YRECFM = 'SBL_DEPTH'
-  YDIR='XY'
-  CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PSBL_DEPTH,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPINIFILE,'SBL_DEPTH',PSBL_DEPTH)
 ELSE
   PSBL_DEPTH(:,:)=0.
 END IF
@@ -1113,9 +1095,7 @@ END IF
 !
 SELECT CASE(HGETTKET)                   
   CASE('READ') 
-    YRECFM = 'WTHVMF'
-    YDIR='XY'
-    CALL FMREAD(TPINIFILE%CNAME,YRECFM,HLUOUT,YDIR,PWTHVMF,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_READ_FIELD(TPINIFILE,'WTHVMF',PWTHVMF)
   CASE('INIT')
     PWTHVMF(:,:,:)=0.
 END SELECT 
diff --git a/src/MNH/read_grid_time_mesonh_case.f90 b/src/MNH/read_grid_time_mesonh_case.f90
index 268b5fdf8..2c99639d3 100644
--- a/src/MNH/read_grid_time_mesonh_case.f90
+++ b/src/MNH/read_grid_time_mesonh_case.f90
@@ -94,20 +94,22 @@ END MODULE MODI_READ_GRID_TIME_MESONH_CASE
 !              ------------
 !
 USE MODD_CONF        ! declaration modules
-USE MODD_LUNIT
 USE MODD_GRID
-USE MODD_TIME_n
-USE MODD_TIME
-USE MODD_PARAMETERS
 USE MODD_GRID_n
+USE MODD_IO_ll,  ONLY: TFILEDATA
+USE MODD_LUNIT
+USE MODD_PARAMETERS
 USE MODD_PREP_REAL
+USE MODD_TIME
+USE MODD_TIME_n
 !
 USE MODE_FM
 USE MODE_FMREAD
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_FIND_BYNAME
 !
-USE MODI_RETRIEVE2_NEST_INFO_n
-USE MODI_READ_HGRID
 USE MODI_DEFAULT_SLEVE
+USE MODI_READ_HGRID
+USE MODI_RETRIEVE2_NEST_INFO_n
 !
 IMPLICIT NONE
 !
@@ -151,6 +153,8 @@ INTEGER :: IYSIZE        ! Y-direction size of atm. file
 INTEGER :: IDXRATIO      ! X-direction grid mesh ratios, MUST be 1
 INTEGER :: IDYRATIO      ! Y-direction grid mesh ratios, MUST be 1
 !
+!
+TYPE(TFILEDATA),POINTER :: TZFMFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !*       1.    INITIALIZATIONS
@@ -208,7 +212,10 @@ END IF
 !*       2.2    Horizontal grid:
 !               ---------------
 !
-CALL READ_HGRID(1,HFMFILE,YMY_NAME,YDAD_NAME,YTYPE)
+!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)
 !
 IF (IDXRATIO/=1 .OR. IDYRATIO/=1) THEN
diff --git a/src/MNH/read_hgrid.f90 b/src/MNH/read_hgrid.f90
index aff3b67d5..8c8ae603e 100644
--- a/src/MNH/read_hgrid.f90
+++ b/src/MNH/read_hgrid.f90
@@ -12,10 +12,12 @@
       MODULE MODI_READ_HGRID
 !     ######################
 INTERFACE
-      SUBROUTINE READ_HGRID(KMI,HFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+      SUBROUTINE READ_HGRID(KMI,TPFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
 !
 INTEGER,           INTENT(IN)  :: KMI          ! model index
-CHARACTER (LEN=*), INTENT(IN)  :: HFMFILE     ! name of the file n
+TYPE(TFILEDATA),   INTENT(IN)  :: TPFMFILE     ! file n
 CHARACTER(LEN=28), INTENT(OUT) :: HMY_NAME     ! True Name of FM-file
 CHARACTER(LEN=28), INTENT(OUT) :: HDAD_NAME    ! Name of father
 CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
@@ -25,7 +27,7 @@ END INTERFACE
 END MODULE MODI_READ_HGRID
 !
 !     ####################################################################
-      SUBROUTINE READ_HGRID(KMI,HFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+      SUBROUTINE READ_HGRID(KMI,TPFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
 !     ####################################################################
 !
 !!****  *READ_HGRID* - to read grid information in FM file into PGD modules
@@ -83,26 +85,27 @@ END MODULE MODI_READ_HGRID
 !
 !*       0.    DECLARATIONS
 !
-USE MODE_MODELN_HANDLER
-USE MODI_READ_HGRID_n
-!
-USE MODD_PGDDIM
-USE MODD_PGDGRID
+USE MODD_CONF, ONLY : CPROGRAM
 USE MODD_GRID
-USE MODD_PARAMETERS
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LUNIT
+USE MODD_PARAMETERS
+USE MODD_PGDDIM
+USE MODD_PGDGRID
 !
 USE MODE_FMREAD
 USE MODE_GRIDPROJ
 USE MODE_IO_ll
-USE MODD_CONF, ONLY : CPROGRAM
+USE MODE_MODELN_HANDLER
+!
+USE MODI_READ_HGRID_n
 !
 IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
 INTEGER,           INTENT(IN)  :: KMI          ! model index
-CHARACTER (LEN=*), INTENT(IN)  :: HFMFILE     ! name of the file n
+TYPE(TFILEDATA),   INTENT(IN)  :: TPFMFILE     ! file n
 CHARACTER(LEN=28), INTENT(OUT) :: HMY_NAME     ! True Name of FM-file
 CHARACTER(LEN=28), INTENT(OUT) :: HDAD_NAME    ! Name of father
 CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
@@ -110,9 +113,7 @@ CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
 !
 !*       0.2   declarations of local variables
 !
-CHARACTER(LEN=16)      :: YRECFM
-INTEGER                :: IGRID,ILENCH,IRESP
-CHARACTER(LEN=100)     :: YCOMMENT
+INTEGER                :: IRESP
 INTEGER                :: IMASDEV
 INTEGER                :: IMI
 LOGICAL                :: G1D,G2D,GPACK
@@ -135,7 +136,7 @@ IF (KMI/=0) THEN
   IMI = GET_CURRENT_MODEL_INDEX()
   CALL GOTO_MODEL(KMI)
   CALL GO_TOMODEL_ll(KMI, IINFO_ll)
-  CALL READ_HGRID_n(HFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+  CALL READ_HGRID_n(TPFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
   CALL GO_TOMODEL_ll(IMI, IINFO_ll)
   CALL GOTO_MODEL(IMI)
   RETURN
@@ -147,27 +148,10 @@ END IF
 !*       2.1    General information :
 !               -------------------
 !
-YRECFM='MY_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',HMY_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DAD_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',HDAD_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='STORAGE_TYPE'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',HSTORAGE_TYPE,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='MASDEV'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
+CALL IO_READ_FIELD(TPFMFILE,'MY_NAME',     HMY_NAME)
+CALL IO_READ_FIELD(TPFMFILE,'DAD_NAME',    HDAD_NAME)
+CALL IO_READ_FIELD(TPFMFILE,'STORAGE_TYPE',HSTORAGE_TYPE)
+CALL IO_READ_FIELD(TPFMFILE,'MASDEV',      IMASDEV)
 !
 !*       2.2    Grid information :
 !               ----------------
@@ -176,14 +160,14 @@ CALL FMREAD(HFMFILE,YRECFM,CLUOUT0,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
 !GET_DIM_PHYS_ll impact => 1st one no visible impact
 CALL GET_DIM_PHYS_ll ( 'B',NPGDIMAX,NPGDJMAX)
 !
-CALL FMREAD(HFMFILE,'LAT0',CLUOUT0,'--',XLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'LON0',CLUOUT0,'--',XLON0,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'RPK',CLUOUT0,'--',XRPK,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'BETA',CLUOUT0,'--',XBETA,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'LATORI',CLUOUT0,'--',XPGDLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'LONORI',CLUOUT0,'--',XPGDLONOR,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'IMAX',CLUOUT0,'--',NPGDIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'JMAX',CLUOUT0,'--',NPGDJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'LAT0',  XLAT0)
+CALL IO_READ_FIELD(TPFMFILE,'LON0',  XLON0)
+CALL IO_READ_FIELD(TPFMFILE,'RPK',   XRPK)
+CALL IO_READ_FIELD(TPFMFILE,'BETA',  XBETA)
+CALL IO_READ_FIELD(TPFMFILE,'LATORI',XPGDLATOR)
+CALL IO_READ_FIELD(TPFMFILE,'LONORI',XPGDLONOR)
+CALL IO_READ_FIELD(TPFMFILE,'IMAX',  NPGDIMAX)
+CALL IO_READ_FIELD(TPFMFILE,'JMAX',  NPGDJMAX)
 !
 !20131010 recompute properly NPGDIMAX NPGDJMAX
 !GET_DIM_PHYS_ll impact 2nd one => prevent run failures
@@ -192,31 +176,31 @@ CALL GET_DIM_PHYS_ll ( 'B',NPGDIMAX,NPGDJMAX)
 IF (.NOT.(ALLOCATED(XPGDXHAT))) ALLOCATE(XPGDXHAT(NPGDIMAX+2*JPHEXT))
 IF (.NOT.(ALLOCATED(XPGDYHAT))) ALLOCATE(XPGDYHAT(NPGDJMAX+2*JPHEXT))
 !20131023 change FMREAD option '--' -> 'XX' ou 'YY' for // reading
-CALL FMREAD(HFMFILE,'XHAT',CLUOUT0,'XX',XPGDXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'YHAT',CLUOUT0,'YY',XPGDYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'XHAT',XPGDXHAT)
+CALL IO_READ_FIELD(TPFMFILE,'YHAT',XPGDYHAT)
 !
 !*       3.   Read the configuration (MODD_CONF)
 !
-CALL FMREAD(HFMFILE,'L1D',CLUOUT0,'--',G1D,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'L1D',G1D)
 IF (IRESP/=0) THEN
   G1D=.FALSE.
   IF( (NPGDIMAX == 1).AND.(NPGDJMAX == 1) ) G1D=.TRUE.
 ENDIF
 !
-CALL FMREAD(HFMFILE,'L2D',CLUOUT0,'--',G2D,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'L2D',G2D)
 IF (IRESP/=0) THEN
   G2D=.FALSE.
   IF( (NPGDIMAX /= 1).AND.(NPGDJMAX == 1) ) G2D=.TRUE.
 ENDIF
 !
-CALL FMREAD(HFMFILE,'PACK',CLUOUT0,'--',GPACK,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'PACK',GPACK)
 IF (IRESP/=0) GPACK=.TRUE.
 !
 CALL SET_FMPACK_ll(G1D,G2D,GPACK)
 !-------------------------------------------------------------------------------
 IF (IMASDEV<=45) THEN
-  CALL FMREAD(HFMFILE,'LATOR',CLUOUT0,'--',XPGDLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'LONOR',CLUOUT0,'--',XPGDLONOR,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'LATOR',XPGDLATOR)
+  CALL IO_READ_FIELD(TPFMFILE,'LONOR',XPGDLONOR)
   ZXHATM = - 0.5 * (XPGDXHAT(1)+XPGDXHAT(2))
   ZYHATM = - 0.5 * (XPGDYHAT(1)+XPGDYHAT(2))
   CALL SM_LATLON(XPGDLATOR,XPGDLONOR,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
diff --git a/src/MNH/read_hgridn.f90 b/src/MNH/read_hgridn.f90
index 91e0c6711..983d599e0 100644
--- a/src/MNH/read_hgridn.f90
+++ b/src/MNH/read_hgridn.f90
@@ -12,9 +12,11 @@
 !     #######################
 !
 INTERFACE
-      SUBROUTINE READ_HGRID_n(HFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+      SUBROUTINE READ_HGRID_n(TPFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
 !
-CHARACTER (LEN=*), INTENT(IN)  :: HFMFILE     ! name of the file n
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),   INTENT(IN)  :: TPFMFILE     ! file n
 CHARACTER(LEN=28), INTENT(OUT) :: HMY_NAME     ! True Name of FM-file
 CHARACTER(LEN=28), INTENT(OUT) :: HDAD_NAME    ! Name of father
 CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
@@ -25,7 +27,7 @@ END INTERFACE
 END MODULE MODI_READ_HGRID_n
 !
 !     #################################################################
-      SUBROUTINE READ_HGRID_n(HFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
+      SUBROUTINE READ_HGRID_n(TPFMFILE,HMY_NAME,HDAD_NAME,HSTORAGE_TYPE)
 !     #################################################################
 !
 !!****  *READ_HGRID_n* - to read grid information in FM file of model $n
@@ -79,25 +81,25 @@ END MODULE MODI_READ_HGRID_n
 !
 !*       0.    DECLARATIONS
 !
-USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT, JPMODELMAX
+USE MODD_CONF
+USE MODD_DIM_n
 USE MODD_GRID
 USE MODD_GRID_n
-USE MODD_DIM_n
+USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_LUNIT_n
-USE MODD_CONF
+USE MODD_PARAMETERS, ONLY : JPHEXT, JPVEXT, JPMODELMAX
 !
 USE MODE_FM
 USE MODE_FMREAD
-USE MODE_MODELN_HANDLER
-USE MODE_IO_ll
-!
 USE MODE_GRIDPROJ
+USE MODE_IO_ll
+USE MODE_MODELN_HANDLER
 !
 IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
 !
-CHARACTER (LEN=*), INTENT(IN)  :: HFMFILE     ! name of the file n
+TYPE(TFILEDATA),   INTENT(IN)  :: TPFMFILE     ! file n
 CHARACTER(LEN=28), INTENT(OUT) :: HMY_NAME     ! True Name of FM-file
 CHARACTER(LEN=28), INTENT(OUT) :: HDAD_NAME    ! Name of father
 CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
@@ -105,23 +107,17 @@ CHARACTER(LEN=2) , INTENT(OUT) :: HSTORAGE_TYPE
 !*       0.2   declarations of local variables
 !
 INTEGER             :: ILUOUT
-CHARACTER (LEN=16)  :: YRECFM
-INTEGER             :: ILENCH, IGRID, IRESP
-CHARACTER (LEN=100) :: YCOMMENT
+INTEGER             :: IRESP
 REAL                :: ZLAT0,ZLON0,ZRPK,ZBETA
 REAL                :: ZEPS = 1.E-10
 INTEGER             :: IMASDEV
 INTEGER             :: IMI
-!$20140506 add YDIR for FMREAD
-CHARACTER(LEN=2)    :: YDIR
-
 !
 !-------------------------------------------------------------------------------
 REAL :: ZLATOR, ZLONOR, ZXHATM, ZYHATM
 !-------------------------------------------------------------------------------
 !JUAN REALZ
 INTEGER             :: IIU,IJU
-INTEGER             :: NIMAX2,NJMAX2
 !JUAN REALZ
 INTEGER             :: IXOR, IYOR, IXEND, IYEND
 INTEGER             :: IJPHEXT
@@ -131,26 +127,10 @@ CALL FMLOOK_ll(CLUOUT,CLUOUT,ILUOUT,IRESP)
 !*       1.     General information :
 !               -------------------
 !
-YRECFM='MY_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT,'--',HMY_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DAD_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT,'--',HDAD_NAME,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='STORAGE_TYPE'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT,'--',HSTORAGE_TYPE,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='MASDEV'
-CALL FMREAD(HFMFILE,YRECFM,CLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'MY_NAME',     HMY_NAME)
+CALL IO_READ_FIELD(TPFMFILE,'DAD_NAME',    HDAD_NAME)
+CALL IO_READ_FIELD(TPFMFILE,'STORAGE_TYPE',HSTORAGE_TYPE)
+CALL IO_READ_FIELD(TPFMFILE,'MASDEV',      IMASDEV)
 !
 !*       2.     Grid information :
 !               ----------------
@@ -158,16 +138,16 @@ CALL FMREAD(HFMFILE,YRECFM,CLUOUT,'--',IMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
 IF(IMASDEV<=45 .AND. HSTORAGE_TYPE == 'PG') THEN
   LCARTESIAN=.FALSE.
 ELSE
-  CALL FMREAD(HFMFILE,'CARTESIAN',CLUOUT,'--',LCARTESIAN,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'CARTESIAN',LCARTESIAN)
 ENDIF
-CALL FMREAD(HFMFILE,'LAT0',CLUOUT,'--',ZLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'LON0',CLUOUT,'--',ZLON0,IGRID,ILENCH,YCOMMENT,IRESP)
-CALL FMREAD(HFMFILE,'BETA',CLUOUT,'--',ZBETA,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'LAT0',ZLAT0)
+CALL IO_READ_FIELD(TPFMFILE,'LON0',ZLON0)
+CALL IO_READ_FIELD(TPFMFILE,'BETA',ZBETA)
 IF(IRESP/=0) ZBETA=0.
 IF (.NOT.LCARTESIAN ) THEN
-  CALL FMREAD(HFMFILE,'RPK',CLUOUT,'--',ZRPK,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'LATORI',CLUOUT,'--',XLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'LONORI',CLUOUT,'--',XLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'RPK',   ZRPK)
+  CALL IO_READ_FIELD(TPFMFILE,'LATORI',XLATORI)
+  CALL IO_READ_FIELD(TPFMFILE,'LONORI',XLONORI)
 ENDIF
 !
 IMI = GET_CURRENT_MODEL_INDEX()
@@ -210,9 +190,9 @@ IF (CPROGRAM/='IDEAL ') THEN
   !            b) and arrays XXHAT, XYHAT, XZS, XZSMT are deallocated after this 
   !               routine (as in ini_size_spawn.f90)
   !$20140506 try 'XX','YY' it is FMREADN0_LL scalar reading so leave '--'
-  CALL FMREAD(HFMFILE,'IMAX',CLUOUT,'--',NIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'JMAX',CLUOUT,'--',NJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'JPHEXT',CLUOUT,'--',IJPHEXT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'IMAX',  NIMAX)
+  CALL IO_READ_FIELD(TPFMFILE,'JMAX',  NJMAX)
+  CALL IO_READ_FIELD(TPFMFILE,'JPHEXT',IJPHEXT)
   IF ( IJPHEXT .NE. JPHEXT ) THEN
      IF (CPROGRAM == 'REAL' ) THEN
         WRITE(ILUOUT,FMT=*) ' READ_HGRID_N : JPHEXT in PRE_REAL1.nam/NAM_REAL_CONF ( or default value )&
@@ -222,7 +202,7 @@ IF (CPROGRAM/='IDEAL ') THEN
            & JPHEXT=',JPHEXT
      END IF
 
-     WRITE(ILUOUT,FMT=*) ' different from PGD files=',HFMFILE ,' value JPHEXT=',IJPHEXT
+     WRITE(ILUOUT,FMT=*) ' different from PGD files=',TPFMFILE%CNAME ,' value JPHEXT=',IJPHEXT
      WRITE(ILUOUT,FMT=*) '-> JOB ABORTED'
      CALL CLOSE_ll(CLUOUT,IOSTAT=IRESP)
      CALL ABORT  
@@ -233,19 +213,19 @@ END IF
 !*       2.1  Read the configuration (MODD_CONF)
 !
 IF (IMI == 1) THEN   
-  CALL FMREAD(HFMFILE,'L1D',CLUOUT,'--',L1D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'L1D',L1D)
   IF (IRESP/=0) THEN
     L1D=.FALSE.
     IF( (NIMAX == 1).AND.(NJMAX == 1) ) L1D=.TRUE.
   ENDIF
 !
-  CALL FMREAD(HFMFILE,'L2D',CLUOUT,'--',L2D,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'L2D',L2D)
   IF (IRESP/=0) THEN
     L2D=.FALSE.
     IF( (NIMAX /= 1).AND.(NJMAX == 1) ) L2D=.TRUE.
   ENDIF
 !
-  CALL FMREAD(HFMFILE,'PACK',CLUOUT,'--',LPACK,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'PACK',LPACK)
   IF (IRESP/=0) LPACK=.TRUE.
 !  CALL SET_FMPACK_ll(L1D,L2D,LPACK)
 END IF
@@ -274,11 +254,8 @@ ELSE
 ENDIF
 !JUAN REALZ
 
-YDIR='XX'
-CALL FMREAD(HFMFILE,'XHAT',CLUOUT,YDIR,XXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YDIR='YY'
-CALL FMREAD(HFMFILE,'YHAT',CLUOUT,YDIR,XYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'XHAT',XXHAT)
+CALL IO_READ_FIELD(TPFMFILE,'YHAT',XYHAT)
 !
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
@@ -288,9 +265,7 @@ IF (.NOT. (ASSOCIATED(XZS))) ALLOCATE(XZS(NIMAX+2*JPHEXT,NJMAX+2*JPHEXT))
 ENDIF
 !JUAN REALZ
 
-!$20140506 replace 'XY' by YDIR !!
-YDIR='XY'
-CALL FMREAD(HFMFILE,'ZS',CLUOUT,YDIR,XZS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_READ_FIELD(TPFMFILE,'ZS',XZS)
 !
 !JUAN REALZ
 IF ( CPROGRAM .EQ. "REAL  " ) THEN
@@ -303,16 +278,14 @@ ENDIF
 IF (IMASDEV<=46) THEN
   XZSMT = XZS
 ELSE
-!$20140506 replace 'XY' by YDIR !!
-YDIR='XY'
-  CALL FMREAD(HFMFILE,'ZSMT',CLUOUT,YDIR,XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'ZSMT',XZSMT)
 !
 END IF
 !
 !-------------------------------------------------------------------------------
 IF (IMASDEV<=45) THEN
-  CALL FMREAD(HFMFILE,'LATOR',CLUOUT,'--',XLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
-  CALL FMREAD(HFMFILE,'LONOR',CLUOUT,'--',XLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_READ_FIELD(TPFMFILE,'LATOR',XLATORI)
+  CALL IO_READ_FIELD(TPFMFILE,'LONOR',XLONORI)
   ZXHATM = - 0.5 * (XXHAT(1)+XXHAT(2))
   ZYHATM = - 0.5 * (XYHAT(1)+XYHAT(2))
   CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
diff --git a/src/MNH/read_precip_field.f90 b/src/MNH/read_precip_field.f90
index a1dd9add8..b05915238 100644
--- a/src/MNH/read_precip_field.f90
+++ b/src/MNH/read_precip_field.f90
@@ -16,37 +16,37 @@
 !
 INTERFACE
 !
-      SUBROUTINE READ_PRECIP_FIELD(HINIFILE,HLUOUT,HPROGRAM,HCONF,                          &
-                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,                      &
-                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D,          &
-                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH )           
+      SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HLUOUT,HPROGRAM,HCONF,                &
+                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,             &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH     )
 !
+USE MODD_IO_ll, ONLY : TFILEDATA
 !
 !*       0.1   declarations of arguments
 !
-CHARACTER (LEN=*),          INTENT(IN)  :: HINIFILE    ! name of the initial file
-CHARACTER (LEN=*),          INTENT(IN)  :: HLUOUT      ! name for output-listing
-                                                       ! of nested models
-CHARACTER (LEN=*),          INTENT(IN)  :: HPROGRAM    ! 
-CHARACTER (LEN=*),          INTENT(IN)  :: HCONF       ! 
+TYPE(TFILEDATA),        INTENT(IN)    :: TPINIFILE ! Initial file
+CHARACTER (LEN=*),      INTENT(IN)    :: HLUOUT    ! name for output-listing of nested models
+CHARACTER (LEN=*),      INTENT(IN)    :: HPROGRAM  !
+CHARACTER (LEN=*),      INTENT(IN)    :: HCONF     !
 !                    
-CHARACTER (LEN=*),          INTENT(IN)  :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT
-                                                 ! Get indicator RCT,RRT,RST,RGT,RHT
-!
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRC! Droplet instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRC! Droplet accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINDEP! Droplet instant deposition
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACDEP! Droplet accumulated dep
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRR3D! Rain precipitation flux 3D
-REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PEVAP3D! Rain evaporation flux 3D
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRR! Rain accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRS! Snow accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRG! Graupel instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRG! Graupel accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRH! Hail instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRH! Hail accumulated precip
+CHARACTER (LEN=*),      INTENT(IN)    :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT
+                                                  ! Get indicator RCT,RRT,RST,RGT,RHT
+!
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRC   ! Droplet instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRC   ! Droplet accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINDEP   ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACDEP   ! Droplet accumulated dep
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D  ! Rain evaporation flux 3D
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRR   ! Rain accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRS   ! Snow accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRG   ! Graupel accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRH   ! Hail accumulated precip
 !
 END SUBROUTINE READ_PRECIP_FIELD
 !
@@ -54,12 +54,12 @@ END INTERFACE
 !
 END MODULE MODI_READ_PRECIP_FIELD 
 !
-!     ################################################################################
-      SUBROUTINE READ_PRECIP_FIELD(HINIFILE,HLUOUT,HPROGRAM,HCONF,                          &
-                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,                      &
-                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D,          &
-                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH )           
-!     ################################################################################
+!     ##############################################################################
+      SUBROUTINE READ_PRECIP_FIELD(TPINIFILE,HLUOUT,HPROGRAM,HCONF,                &
+                              HGETRCT,HGETRRT,HGETRST,HGETRGT,HGETRHT,             &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,PINPRG,PACPRG,PINPRH,PACPRH     )
+!     ##############################################################################
 !
 !!****  *READ_PRECIP_FIELD* - routine to read precipitation surface fields
 !!
@@ -101,61 +101,56 @@ END MODULE MODI_READ_PRECIP_FIELD
 !-----------------------------------------------------------------------------
 !
 !*       0.    DECLARATIONS
-USE MODE_FM
-USE MODD_PARAM_ICE , ONLY : LDEPOSC
+USE MODD_IO_ll,      ONLY : TFILEDATA
+USE MODD_PARAM_ICE,  ONLY : LDEPOSC
 USE MODD_PARAM_C2R2, ONLY : LDEPOC
 !
+USE MODE_FIELD,      ONLY : TFIELDDATA,TFIELDLIST,FIND_FIELD_ID_FROM_MNHNAME
+USE MODE_FM
 USE MODE_FMREAD
 !
 IMPLICIT NONE
 !
 !*       0.1   declarations of 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=*),      INTENT(IN)    :: HLUOUT    ! name for output-listing of nested models
+CHARACTER (LEN=*),      INTENT(IN)    :: HPROGRAM  !
+CHARACTER (LEN=*),      INTENT(IN)    :: HCONF     !
 !                    
-CHARACTER (LEN=*),          INTENT(IN)  :: HGETRCT,HGETRRT, HGETRST, HGETRGT, HGETRHT
-                                                 ! Get indicator RRT,RST,RGT,RHT
-CHARACTER (LEN=*),          INTENT(IN)  :: HPROGRAM    ! 
-CHARACTER (LEN=*),          INTENT(IN)  :: HCONF       ! 
-!
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRC! Droplet instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRC! Droplet accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINDEP! Droplet instant deposition
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACDEP! Droplet accumulated dep
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRR! Rain instant precip
-REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PINPRR3D! Rain precipitation flux 3D
-REAL, DIMENSION(:,:,:), INTENT(INOUT)   :: PEVAP3D! Rain evaporation flux 3D
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRR! Rain accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRS! Snow instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRS! Snow accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRG! Graupel instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRG! Graupel accumulated precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PINPRH! Hail instant precip
-REAL, DIMENSION(:,:), INTENT(INOUT)     :: PACPRH! Hail accumulated precip
+CHARACTER (LEN=*),      INTENT(IN)    :: HGETRCT, HGETRRT, HGETRST, HGETRGT, HGETRHT
+                                                  ! Get indicator RCT,RRT,RST,RGT,RHT
+!
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRC   ! Droplet instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRC   ! Droplet accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINDEP   ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACDEP   ! Droplet accumulated dep
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRR   ! Rain instant precip
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PINPRR3D ! Rain precipitation flux 3D
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PEVAP3D  ! Rain evaporation flux 3D
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRR   ! Rain accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRS   ! Snow instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRS   ! Snow accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRG   ! Graupel instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRG   ! Graupel accumulated precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PINPRH   ! Hail instant precip
+REAL, DIMENSION(:,:),   INTENT(INOUT) :: PACPRH   ! Hail accumulated precip
 !
 !*       0.2   declarations of local variables
 !
 REAL, DIMENSION(SIZE(PINPRR,1),SIZE(PINPRR,2)) :: Z2D ! 2D array to read  data
 REAL, DIMENSION(SIZE(PINPRR3D,1),SIZE(PINPRR3D,2),SIZE(PINPRR3D,3)) :: Z3D ! 3D array to read  data
                                                   ! in initial file 
-INTEGER             :: IGRID,ILENCH,IRESP         !   File 
-CHARACTER (LEN=16)  :: YRECFM                     ! management
-CHARACTER (LEN=100) :: YCOMMENT                   ! variables   
-CHARACTER(LEN=2)    :: YDIR
+INTEGER             :: IID
+INTEGER             :: IRESP
 CHARACTER(LEN=4)    :: YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT                    
-INTEGER             :: ILUOUT                     ! Unit number for prints
+TYPE(TFIELDDATA)    :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
 !*       1..    INITIALIZATION
 !              ----------------
 !
-CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
-!
-YDIR='XY'
-!
 IF ((HPROGRAM == 'MESONH') .AND. (HCONF == 'START')) THEN
   YGETRCT = 'INIT'
   YGETRRT = 'INIT'
@@ -177,11 +172,16 @@ END IF
 IF (SIZE(PINPRC) /= 0 ) THEN
   SELECT CASE(YGETRCT)
   CASE ('READ')
-    YRECFM = 'INPRC'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRC(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'ACPRC'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRC(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINPRC(:,:) = 0.0
@@ -192,11 +192,16 @@ END IF
 IF (SIZE(PINPRC) /= 0 .AND. (LDEPOSC .OR. LDEPOC) ) THEN
   SELECT CASE(YGETRCT)
   CASE ('READ')
-    YRECFM = 'INDEP'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINDEP(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'ACPRC'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACDEP(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINDEP(:,:) = 0.0
@@ -207,17 +212,22 @@ END IF
 IF (SIZE(PINPRR) /= 0 ) THEN
   SELECT CASE(YGETRRT)
   CASE ('READ')
-    YRECFM = 'INPRR'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRR(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'INPRR3D'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL IO_READ_FIELD(TPINIFILE,'INPRR3D',Z3D,IRESP)
     IF (IRESP == 0) PINPRR3D(:,:,:)=Z3D(:,:,:)
-    YRECFM = 'EVAP3D'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL IO_READ_FIELD(TPINIFILE,'EVAP3D',Z3D,IRESP)
     IF (IRESP == 0) PEVAP3D(:,:,:)=Z3D(:,:,:)
-    YRECFM = 'ACPRR'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRR(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINPRR(:,:) = 0.0
@@ -230,11 +240,16 @@ END IF
 IF (SIZE(PINPRS) /= 0 ) THEN
   SELECT CASE(YGETRST)
   CASE ('READ')
-    YRECFM = 'INPRS'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRS(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'ACPRS'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRS(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINPRS(:,:) = 0.0
@@ -245,11 +260,16 @@ END IF
 IF (SIZE(PINPRG) /= 0 ) THEN
   SELECT CASE(YGETRGT)
   CASE ('READ')
-    YRECFM = 'INPRG'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRG(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'ACPRG'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRG(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINPRG(:,:) = 0.0
@@ -260,11 +280,16 @@ END IF
 IF (SIZE(PINPRH) /= 0 ) THEN
   SELECT CASE(YGETRHT)
   CASE ('READ')
-    YRECFM = 'INPRH'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PINPRH(:,:)=Z2D(:,:)/(1000.*3600.)
-    YRECFM = 'ACPRH'
-    CALL FMREAD(HINIFILE,YRECFM,HLUOUT,YDIR,Z2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    !
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_READ_FIELD(TPINIFILE,TZFIELD,Z2D,IRESP)
     IF (IRESP == 0) PACPRH(:,:)=Z2D(:,:)/(1000.)
   CASE ('INIT')
     PINPRH(:,:) = 0.0
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index 74917206e..ed021d611 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -48,11 +48,12 @@ USE MODD_CONF, ONLY : CPROGRAM
 USE MODD_GRID, ONLY: XRPK,XBETA,XLAT0,XLON0
 USE MODD_PARAMETERS, ONLY: JPHEXT, XUNDEF
 !
+USE MODE_FIELD,       ONLY : TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_GRIDPROJ
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, NLUOUT
+USE MODD_IO_SURF_MNH,        ONLY : COUT, TPINFILE, NLUOUT
 !
 USE MODI_GET_SURF_UNDEF
 !
@@ -77,10 +78,11 @@ REAL,DIMENSION(:), ALLOCATABLE :: ZXHAT,ZYHAT
 REAL              :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI
 REAL              :: ZRPK, ZBETA, ZLAT0, ZLON0
 CHARACTER(LEN=100):: YCOMMENT ! comment
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 IF (HREC=='LONORI' .OR. HREC=='LATORI') THEN
-  CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
   IF (IMASDEV<=45) THEN
       ZLATORI = XUNDEF
       ZLONORI = XUNDEF
@@ -90,18 +92,18 @@ IF (HREC=='LONORI' .OR. HREC=='LATORI') THEN
       ZRPK  = XRPK
       ZBETA = XBETA
       !* reads projection and grid data in the file
-      CALL FMREAD(CFILE,'LAT0',COUT,'--',XLAT0,IGRID,ILENCH,HCOMMENT,KRESP)
-      CALL FMREAD(CFILE,'LON0',COUT,'--',XLON0,IGRID,ILENCH,HCOMMENT,KRESP)
-      CALL FMREAD(CFILE,'RPK',COUT,'--',XRPK,IGRID,ILENCH,HCOMMENT,KRESP)
-      CALL FMREAD(CFILE,'BETA',COUT,'--',XBETA,IGRID,ILENCH,HCOMMENT,KRESP)
+      CALL IO_READ_FIELD(TPINFILE,'LAT0',XLAT0)
+      CALL IO_READ_FIELD(TPINFILE,'LON0',XLON0)
+      CALL IO_READ_FIELD(TPINFILE,'RPK', XRPK)
+      CALL IO_READ_FIELD(TPINFILE,'BETA',XBETA)
       !
-      CALL FMREAD(CFILE,'IMAX',COUT,'--',IIMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-      CALL FMREAD(CFILE,'JMAX',COUT,'--',IJMAX,IGRID,ILENCH,YCOMMENT,IRESP)
+      CALL IO_READ_FIELD(TPINFILE,'IMAX',IIMAX)
+      CALL IO_READ_FIELD(TPINFILE,'JMAX',IJMAX)
       ALLOCATE(ZXHAT(IIMAX+2*JPHEXT),ZYHAT(IJMAX+2*JPHEXT))
-      CALL FMREAD(CFILE,'XHAT',COUT,'--',ZXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-      CALL FMREAD(CFILE,'YHAT',COUT,'--',ZYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-      CALL FMREAD(CFILE,'LATOR',COUT,'--',ZLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
-      CALL FMREAD(CFILE,'LONOR',COUT,'--',ZLONOR,IGRID,ILENCH,HCOMMENT,KRESP)
+      CALL IO_READ_FIELD(TPINFILE,'XHAT',ZXHAT)
+      CALL IO_READ_FIELD(TPINFILE,'YHAT',ZYHAT)
+      CALL IO_READ_FIELD(TPINFILE,'LATOR',ZLATOR)
+      CALL IO_READ_FIELD(TPINFILE,'LONOR',ZLONOR)
       ZXHATM = - 0.5 * (ZXHAT(1)+ZXHAT(2))
       ZYHATM = - 0.5 * (ZYHAT(1)+ZYHAT(2))
       DEALLOCATE(ZXHAT,ZYHAT)
@@ -120,9 +122,23 @@ END IF
 
 !-------------------------------------------------------------------------------
 
-CALL FMREAD(CFILE,HREC,COUT,'--',PFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
+IF ( HREC=='LAT0' .OR. HREC=='LON0' .OR. HREC=='RPK' .OR. HREC=='BETA'  &
+                 .OR. HREC=='LATORI'.OR. HREC=='LONORI'                  ) THEN
+  CALL IO_READ_FIELD(TPINFILE,HREC,PFIELD,KRESP)
+ELSE
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
+END IF
 
-IF (KRESP /=0) THEN
+IF (KRESP /=0 .AND. KRESP/=-111) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
   WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -173,6 +189,7 @@ END SUBROUTINE READ_SURFX0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD,       ONLY : TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_ll
@@ -180,7 +197,7 @@ USE MODE_IO_ll
 !
 USE MODD_CST,         ONLY : XPI
 !
-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, &
                              NIU_ALL, NJU_ALL, NIB_ALL,    &
                              NJB_ALL, NIE_ALL, NJE_ALL,    &
@@ -223,6 +240,7 @@ CHARACTER(LEN=2)  :: YSTORAGE_TYPE
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for packing
 REAL              :: ZUNDEF         ! undefined value in SURFEX
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 KRESP = 0
@@ -251,12 +269,12 @@ END IF
 !
 IF (HREC=='LAT') THEN
 
-  CALL FMREAD(CFILE,'LAT0',COUT,'--',ZW,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'LAT0',ZW,KRESP)
   PFIELD(:) = ZW
 
 ELSE IF (HREC=='LON') THEN
 
-  CALL FMREAD(CFILE,'LON0',COUT,'--',ZW,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'LON0',ZW,KRESP)
   PFIELD(:) = ZW
 
 ELSE IF (HREC=='MESH_SIZE') THEN
@@ -269,11 +287,20 @@ ELSE IF (HREC=='XX') THEN
   ALLOCATE(ZWORK1D(IIU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
+  TZFIELD%CMNHNAME   = 'XHAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: XHAT'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
   IF (HDIR/='A') THEN
-    CALL FMREAD(CFILE,'XHAT',COUT,'XX',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = 'XX'
   ELSE
-    CALL FMREAD(CFILE,'XHAT',COUT,'--',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = '--'
   END IF
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK1D,KRESP)
   DO JJ = 1,IJU
     ZWORK(IIB:IIE,JJ) = 0.5 * ZWORK1D(IIB:IIE) + 0.5 * ZWORK1D(IIB+1:IIE+1)
   END DO
@@ -285,11 +312,20 @@ ELSE IF (HREC=='DX') THEN
   ALLOCATE(ZWORK1D(IIU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
+  TZFIELD%CMNHNAME   = 'XHAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: XHAT'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
   IF (HDIR/='A') THEN
-    CALL FMREAD(CFILE,'XHAT',COUT,'XX',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = 'XX'
   ELSE
-    CALL FMREAD(CFILE,'XHAT',COUT,'--',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = '--'
   END IF
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK1D,KRESP)
   DO JJ = 1,IJU
     ZWORK(IIB:IIE,JJ) = - ZWORK1D(IIB:IIE) + ZWORK1D(IIB+1:IIE+1)
   END DO
@@ -301,11 +337,20 @@ ELSE IF (HREC=='YY') THEN
   ALLOCATE(ZWORK1D(IJU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
+  TZFIELD%CMNHNAME   = 'YHAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: YHAT'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
   IF (HDIR/='A') THEN
-    CALL FMREAD(CFILE,'YHAT',COUT,'YY',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = 'YY'
   ELSE
-    CALL FMREAD(CFILE,'YHAT',COUT,'--',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = '--'
   END IF
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK1D,KRESP)
   DO JI = 1,IIU
     ZWORK(JI,IJB:IJE) = 0.5 * ZWORK1D(IJB:IJE) + 0.5 * ZWORK1D(IJB+1:IJE+1)
   END DO
@@ -317,11 +362,20 @@ ELSE IF (HREC=='DY') THEN
   ALLOCATE(ZWORK1D(IJU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
+  TZFIELD%CMNHNAME   = 'YHAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: YHAT'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 1
   IF (HDIR/='A') THEN
-    CALL FMREAD(CFILE,'YHAT',COUT,'YY',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = 'YY'
   ELSE
-    CALL FMREAD(CFILE,'YHAT',COUT,'--',ZWORK1D,IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR       = '--'
   END IF
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK1D,KRESP)
   DO JI = 1,IIU
     ZWORK(JI,IJB:IJE) = - ZWORK1D(IJB:IJE) + ZWORK1D(IJB+1:IJE+1)
   END DO
@@ -336,9 +390,9 @@ ELSE
   YREC = ' '
   YREC(1:LEN(HREC)) = HREC
   IF (HREC(1:8)=='Q_CANYON') THEN
-    CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+    CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
     IF (IMASDEV<=45) THEN
-      CALL FMREAD(CFILE,'STORAGE_TYPE',COUT,'--',YSTORAGE_TYPE,IGRID,ILENCH,HCOMMENT,KRESP)
+      CALL IO_READ_FIELD(TPINFILE,'STORAGE_TYPE',YSTORAGE_TYPE)
       IF (YSTORAGE_TYPE=='TT') THEN
         PFIELD = 0.
         DEALLOCATE(IMASK)
@@ -349,29 +403,42 @@ ELSE
     END IF
   END IF
   IF (HREC(1:8)=='T_CANYON') THEN
-    CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+    CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
     IF (IMASDEV<=45) THEN
-      CALL FMREAD(CFILE,'STORAGE_TYPE',COUT,'--',YSTORAGE_TYPE,IGRID,ILENCH,HCOMMENT,KRESP)
+      CALL IO_READ_FIELD(TPINFILE,'STORAGE_TYPE',YSTORAGE_TYPE)
       IF (YSTORAGE_TYPE=='TT') YREC = 'T_ROAD1             '
     END IF
   END IF
   IF (HREC(1:7)=='SSO_DIR') THEN
-    CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+    CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
     IF (IMASDEV<=45) YREC = 'SSO_DIRECTION       '
   END IF
 !
   ALLOCATE(ZWORK(IIU,IJU))
 !
 
+  TZFIELD%CMNHNAME   = TRIM(YREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(YREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
   IF (HDIR=='H') THEN
-    CALL FMREAD(CFILE,YREC,COUT,'XY',ZWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR     = 'XY'
+    TZFIELD%NDIMS    = 2
+    CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
   ELSEIF (HDIR=='A') THEN
-    CALL FMREAD(CFILE,YREC,COUT,'--',ZWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR     = '--'
+    TZFIELD%NDIMS    = 2
+    CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
   ELSE
-    CALL FMREAD(CFILE,YREC,COUT,'--',PFIELD(:),IGRID,ILENCH,HCOMMENT,KRESP)
+    TZFIELD%CDIR     = '--'
+    TZFIELD%NDIMS    = 1
+    CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
   END IF
 !
-  IF (KRESP /=0) THEN
+  IF (KRESP /=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -441,12 +508,13 @@ END SUBROUTINE READ_SURFX1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_ll
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
-USE MODE_ll
 USE MODE_IO_ll
 !
-USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE , NLUOUT,  NMASK, NIU, NJU, NIB, NJB, NIE, NJE, &
+USE MODD_IO_SURF_MNH, ONLY : COUT, CFILE , NLUOUT, TPINFILE, NMASK, NIU, NJU, NIB, NJB, NIE, NJE, &
                              NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, NIE_ALL, NJE_ALL, NMASK_ALL
 USE MODD_PARAMETERS, ONLY: XUNDEF
 !
@@ -478,7 +546,7 @@ INTEGER           :: JP             ! loop index
 
 REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZWORK  ! work array read in the file
 REAL              :: ZUNDEF         ! undefined value in SURFEX
-
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !
@@ -490,17 +558,30 @@ REAL              :: ZUNDEF         ! undefined value in SURFEX
 !
 !
 !
+TZFIELD%CMNHNAME   = TRIM(HREC)
+TZFIELD%CSTDNAME   = ''
+TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+TZFIELD%CUNITS     = ''
+TZFIELD%CCOMMENT   = '' !Expected comment is not known
+TZFIELD%NGRID      = 4
+TZFIELD%NTYPE      = TYPEREAL
 IF (HDIR=='H') THEN
   ALLOCATE(ZWORK(NIU,NJU,SIZE(PFIELD,2)))
-  CALL FMREAD(CFILE,HREC,COUT,'XY',ZWORK(:,:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CDIR     = 'XY'
+  TZFIELD%NDIMS    = 3
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
 ELSEIF (HDIR=='A') THEN
   ALLOCATE(ZWORK(NIU_ALL,NJU_ALL,SIZE(PFIELD,2)))
-  CALL FMREAD(CFILE,HREC,COUT,'--',ZWORK(:,:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CDIR     = '--'
+  TZFIELD%NDIMS    = 3
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
 ELSE
-  CALL FMREAD(CFILE,HREC,COUT,'--',PFIELD(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CDIR     = '--'
+  TZFIELD%NDIMS    = 2
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
 END IF
 !
- IF (KRESP /=0) THEN
+ IF (KRESP /=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -567,15 +648,16 @@ END SUBROUTINE READ_SURFX2_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_ll
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPELOG,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
-USE MODE_ll
 USE MODE_IO_ll
 !
 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
 USE MODD_CST,         ONLY : XPI
 !
-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, &
                              NIU_ALL, NJU_ALL, NIB_ALL,    &
                              NJB_ALL, NIE_ALL, NJE_ALL,    &
@@ -604,7 +686,6 @@ CHARACTER(LEN=1),    INTENT(IN) :: HDIR     ! type of field :
 INTEGER           :: IGRID          ! IGRID : grid indicator
 INTEGER           :: ILENCH         ! ILENCH : length of comment string
 
-INTEGER           :: IMASDEV
 CHARACTER(LEN=20) :: YREC
 CHARACTER(LEN=2)  :: YDIR
 CHARACTER(LEN=2)  :: YSTORAGE_TYPE
@@ -615,11 +696,14 @@ INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for packing
 INTEGER           :: NCOVER,ICOVER,JL2
 REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
 !JUANZ
+INTEGER  :: IRESP
 INTEGER  :: IVERSION, IBUGFIX
 LOGICAL  :: GCOVER_PACKED ! .T. if COVER are all packed into one field
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 KRESP = 0
+IRESP = 0
 !
 IF (HDIR=='A') THEN
   YDIR="--"
@@ -650,32 +734,57 @@ NCOVER=COUNT(OFLAG)
 ALLOCATE (ZWORK3D(IIU,IJU,NCOVER))
 ZWORK3D(:,:,:) =  0.0
 !
- 
-CALL FMREAD(CFILE,'VERSION',COUT,'--',IVERSION,IGRID,ILENCH,HCOMMENT,KRESP)
-!GAELLE CALL FMREAD(CFILE,'BUGFIX',COUT,'--',IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
-CALL FMREAD(CFILE,'BUG   ',COUT,'--',IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
+CALL IO_READ_FIELD(TPINFILE,'VERSION',IVERSION)
+CALL IO_READ_FIELD(TPINFILE,'BUG',    IBUGFIX)
 
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  CALL FMREAD(CFILE,'COVER_PACKED',COUT,'--',GCOVER_PACKED,IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = 'COVER_PACKED'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: COVER_PACKED'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,GCOVER_PACKED)
 END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
-   ICOVER=0
-   DO JL2=1,SIZE(OFLAG)
-      WRITE(YREC,'(A5,I3.3)') 'COVER',JL2
-      IF (OFLAG(JL2)) THEN
-        ICOVER=ICOVER+1
-        CALL FMREAD(CFILE,YREC,COUT,YDIR,ZWORK3D(:,:,ICOVER),IGRID,ILENCH,HCOMMENT,KRESP)
-      END IF
-   END DO
-
+  ICOVER=0
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
+  DO JL2=1,SIZE(OFLAG)
+    WRITE(YREC,'(A5,I3.3)') 'COVER',JL2
+    TZFIELD%CMNHNAME   = TRIM(YREC)
+    TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(YREC)
+    TZFIELD%CDIR       = YDIR
+    IF (OFLAG(JL2)) THEN
+      ICOVER=ICOVER+1
+      CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK3D(:,:,ICOVER),IRESP)
+    END IF
+    IF (IRESP/=0 .AND. IRESP/=-111) KRESP=IRESP
+  END DO
 ELSE
-  CALL FMREAD(CFILE,HREC,COUT,YDIR,ZWORK3D(:,:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = YDIR
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK3D(:,:,:),KRESP)
 END IF
 !
-IF (KRESP /=0) THEN
+IF (KRESP /=0 .AND. KRESP/=-111) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
   WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -688,8 +797,7 @@ ELSE IF (HDIR=='H' .OR. HDIR=='A') THEN
 END IF
 !
 DEALLOCATE(ZWORK3D)
-
-
+!
 DEALLOCATE(IMASK)
 !-------------------------------------------------------------------------------
 END SUBROUTINE READ_SURFX2COV_MNH
@@ -736,6 +844,7 @@ END SUBROUTINE READ_SURFX2COV_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPELOG,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_ll
@@ -743,7 +852,7 @@ USE MODE_IO_ll
 !
 USE MODD_CST,         ONLY : XPI
 !
-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, &
                              NIU_ALL, NJU_ALL, NIB_ALL,    &
                              NJB_ALL, NIE_ALL, NJE_ALL,    &
@@ -772,7 +881,6 @@ CHARACTER(LEN=1),    INTENT(IN) :: HDIR     ! type of field :
 INTEGER           :: IGRID          ! IGRID : grid indicator
 INTEGER           :: ILENCH         ! ILENCH : length of comment string
 
-INTEGER           :: IMASDEV
 CHARACTER(LEN=20) :: YREC
 CHARACTER(LEN=2)  :: YDIR
 CHARACTER(LEN=2)  :: YSTORAGE_TYPE
@@ -785,7 +893,8 @@ REAL,DIMENSION(:,:), ALLOCATABLE :: ZWORK2D
 !JUANZ
 INTEGER  :: IVERSION, IBUGFIX
 LOGICAL  :: GCOVER_PACKED ! .T. if COVER are all packed into one field
- CHARACTER(LEN=1)   :: YDIR1
+CHARACTER(LEN=1) :: YDIR1
+TYPE(TFIELDDATA) :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 KRESP = 0
@@ -821,30 +930,45 @@ END IF
 ALLOCATE (ZWORK2D(IIU,IJU))
 ZWORK2D(:,:) =  0.0
 !
- 
-CALL FMREAD(CFILE,'VERSION',COUT,'--',IVERSION,IGRID,ILENCH,HCOMMENT,KRESP)
-!GAELLE CALL FMREAD(CFILE,'BUGFIX',COUT,'--',IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
-CALL FMREAD(CFILE,'BUG   ',COUT,'--',IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
+CALL IO_READ_FIELD(TPINFILE,'VERSION',IVERSION)
+CALL IO_READ_FIELD(TPINFILE,'BUG',    IBUGFIX)
 
 IF (IVERSION<7 .OR. (IVERSION==7 .AND. IBUGFIX==0)) THEN
   GCOVER_PACKED = .FALSE.
 ELSE
-  CALL FMREAD(CFILE,'COVER_PACKED',COUT,'--',GCOVER_PACKED,IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = 'COVER_PACKED'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: COVER_PACKED'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,GCOVER_PACKED,KRESP)
 END IF
 !
 IF (.NOT. GCOVER_PACKED) THEN
   WRITE(YREC,'(A5,I3.3)') 'COVER',KCOVER
-  CALL FMREAD(CFILE,YREC,COUT,YDIR1,ZWORK2D(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(YREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(YREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = YDIR1
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 2
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK2D,KRESP)
 ELSE
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
   WRITE(NLUOUT,*) 'error : GCOVER_PACKED = ', GCOVER_PACKED, ' and we try to read the covers one by one '
   WRITE(NLUOUT,*) ' '
   CALL ABORT
-!  CALL FMREAD(CFILE,HREC,COUT,YDIR,ZWORK2D(:,:,:),IGRID,ILENCH,HCOMMENT,KRESP)
 END IF
 !
-IF (KRESP /=0) THEN
+IF (KRESP/=0 .AND. KRESP/=-111) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
   WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -902,10 +1026,11 @@ END SUBROUTINE READ_SURFX2COV_1COV_MNH
 !             ------------
 !
 USE MODE_ll
+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 MODD_CONF,            ONLY : CPROGRAM
 !
@@ -940,11 +1065,14 @@ CHARACTER(LEN=16) :: YRECFM
 INTEGER           :: NCOVER,ICOVER,IKL2
 REAL,DIMENSION(:,:,:), ALLOCATABLE :: ZWORK3D
 !JUANZ
+TYPE(TFIELDDATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
-CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
-CALL FMREAD(CFILE,'BUGFIX',COUT,'--',IBUGFIX,IGRID,ILENCH,HCOMMENT,KRESP)
+KRESP=0
+!
+CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
+CALL IO_READ_FIELD(TPINFILE,'BUGFIX',IBUGFIX)
 !
 IF ((HREC=='DIM_FULL' .OR. HREC=='DIM_NATURE' .OR. HREC=='DIM_SEA'  &
                       .OR. HREC=='DIM_WATER'  .OR. HREC=='DIM_TOWN')&
@@ -1016,13 +1144,22 @@ IF ((HREC=='DIM_FULL' .OR. HREC=='DIM_NATURE' .OR. HREC=='DIM_SEA'  &
 
 ELSE IF (HREC=='DIM_FULL' .AND. ( CPROGRAM=='IDEAL ' .OR.  &
                                   CPROGRAM=='SPAWN ' .OR. CPROGRAM=='ZOOMPG' ))THEN
-   CALL FMREAD(CFILE,'IMAX',COUT,'--',IIMAX,IGRID,ILENCH,HCOMMENT,KRESP)
-   CALL FMREAD(CFILE,'JMAX',COUT,'--',IJMAX,IGRID,ILENCH,HCOMMENT,KRESP)
+   CALL IO_READ_FIELD(TPINFILE,'IMAX',IIMAX)
+   CALL IO_READ_FIELD(TPINFILE,'JMAX',IJMAX)
    KFIELD = IIMAX * IJMAX
 ELSE
-   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   = '' !Expected comment is not known
+   TZFIELD%NGRID      = 0
+   TZFIELD%NTYPE      = TYPEINT
+   TZFIELD%NDIMS      = 0
+   CALL IO_READ_FIELD(TPINFILE,TZFIELD,KFIELD,KRESP)
 
-   IF (KRESP /=0) THEN
+   IF (KRESP/=0 .AND. KRESP/=-111) THEN
       WRITE(NLUOUT,*) 'WARNING'
       WRITE(NLUOUT,*) '-------'
       WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -1116,7 +1253,7 @@ ELSE IF (HDIR=='H') THEN
  CALL FMREAD(CFILE,HREC,COUT,'XY',IWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
 !
 
- IF (KRESP /=0) THEN
+ IF (KRESP /=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -1175,12 +1312,13 @@ END SUBROUTINE READ_SURFN1_MNH
 !             ------------
 !
 USE MODE_ll
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPECHAR
 USE MODE_FM
 USE MODE_FMREAD
 !
 USE MODE_POS
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, NLUOUT
+USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, TPINFILE, NLUOUT
 USE MODD_CONF,               ONLY : LCARTESIAN, CPROGRAM
 USE MODD_LUNIT,              ONLY : CPGDFILE
 !
@@ -1207,11 +1345,14 @@ CHARACTER(LEN=32) :: YDESFM       ! .des file
 LOGICAL           :: GFOUND
 CHARACTER(LEN=4)  :: CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CELEC
 CHARACTER(LEN=6)  :: CSEA_FLUX
+TYPE(TFIELDDATA)  :: TZFIELD
 NAMELIST/NAM_PARAMn/CTURB,CRAD,CGROUND,CCLOUD,CDCONV,CSEA_FLUX, CELEC
 !----------------------------------------------------------------------------
+!
+KRESP = 0
 ! On lit la version de Mesonh usilisée pour fabriquer le fichier
 !
-CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
 
 IF (HREC=='SNOW_VEG_TYPE'.AND.IMASDEV<46) THEN
   HFIELD='D95'
@@ -1262,9 +1403,18 @@ CALL ABORT
      END IF
 
 ELSE
-   CALL FMREAD(CFILE,HREC,COUT,'--',HFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
+   TZFIELD%CMNHNAME   = TRIM(HREC)
+   TZFIELD%CSTDNAME   = ''
+   TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+   TZFIELD%CUNITS     = ''
+   TZFIELD%CDIR       = '--'
+   TZFIELD%CCOMMENT   = '' !Expected comment is not known
+   TZFIELD%NGRID      = 0
+   TZFIELD%NTYPE      = TYPECHAR
+   TZFIELD%NDIMS      = 0
+   CALL IO_READ_FIELD(TPINFILE,TZFIELD,HFIELD,KRESP)
    !
-   IF (KRESP /=0) THEN
+   IF (KRESP/=0 .AND. KRESP/=-111) THEN
       WRITE(NLUOUT,*) 'WARNING'
       WRITE(NLUOUT,*) '-------'
       WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -1321,12 +1471,15 @@ END SUBROUTINE READ_SURFC0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODD_IO_SURF_MNH,     ONLY : COUT, CFILE , TPINFILE, NLUOUT, NMASK, &
+                                 NIU, NJU, NIB, NJB, NIE, NJE
+!
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEINT,TYPELOG
 USE MODE_FM
 USE MODE_FMREAD
+!
 USE MODI_PACK_2D_1D
 !
-USE MODD_IO_SURF_MNH,     ONLY : COUT, CFILE , NLUOUT, NMASK, &
-                                 NIU, NJU, NIB, NJB, NIE, NJE
 !
 !
 IMPLICIT NONE
@@ -1350,41 +1503,57 @@ INTEGER           :: ILENCH         ! ILENCH : length of comment string
 
 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK  ! work array read in the file
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
-
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 
 IF (HDIR=='-') THEN
-   CALL FMREAD(CFILE,HREC,COUT,'--',OFIELD(:),IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = TRIM(HREC)
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = '' !Expected comment is not known
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 1
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,OFIELD,KRESP)
 
-   IF (KRESP /=0) THEN
-      WRITE(NLUOUT,*) 'WARNING'
-      WRITE(NLUOUT,*) '-------'
-      WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
-      WRITE(NLUOUT,*) 'default value may be used, who knows???'
-      WRITE(NLUOUT,*) ' '
-   ENDIF
+  IF (KRESP/=0 .AND. KRESP/=-111) THEN
+    WRITE(NLUOUT,*) 'WARNING'
+    WRITE(NLUOUT,*) '-------'
+    WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
+    WRITE(NLUOUT,*) 'default value may be used, who knows???'
+    WRITE(NLUOUT,*) ' '
+  ENDIF
 ELSE IF (HDIR=='H') THEN
- ALLOCATE(GWORK(NIU,NJU))
- GWORK = .FALSE.
-!
- ALLOCATE(IWORK(NIU,NJU))
- CALL FMREAD(CFILE,HREC,COUT,'XY',IWORK(:,:),IGRID,ILENCH,HCOMMENT,KRESP)
- WHERE (IWORK==1) GWORK = .TRUE.
- DEALLOCATE(IWORK)
-!
-
- IF (KRESP /=0) THEN
+  ALLOCATE(GWORK(NIU,NJU))
+  GWORK = .FALSE.
+!
+  ALLOCATE(IWORK(NIU,NJU))
+  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)
+  WHERE (IWORK==1) GWORK = .TRUE.
+  DEALLOCATE(IWORK)
+!
+  IF (KRESP/=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
     WRITE(NLUOUT,*) 'default value may be used, who knows???'
     WRITE(NLUOUT,*) ' '
- ELSE
+  ELSE
     CALL PACK_2D_1D(NMASK,GWORK(NIB:NIE,NJB:NJE),OFIELD)
- END IF
+  END IF
 !
-
- DEALLOCATE(GWORK)
+  DEALLOCATE(GWORK)
 END IF
 !-------------------------------------------------------------------------------
 END SUBROUTINE READ_SURFL1_MNH
@@ -1429,10 +1598,11 @@ END SUBROUTINE READ_SURFL1_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPELOG
 USE MODE_FM
 USE MODE_FMREAD
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, NLUOUT
+USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, TPINFILE, NLUOUT
 !
 !
 IMPLICIT NONE
@@ -1446,15 +1616,12 @@ CHARACTER(LEN=100), INTENT(OUT) :: HCOMMENT ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
-
 INTEGER           :: IMASDEV        ! MESONH version
-
+TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 
 IF (HREC(1:4)=='BUDC') THEN
-  CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
   IF (IMASDEV<=45) THEN
     OFIELD = .FALSE.
     KRESP = 0
@@ -1463,7 +1630,7 @@ IF (HREC(1:4)=='BUDC') THEN
 END IF
 !
 IF (HREC=='ECOCLIMAP') THEN
-  CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
   IF (IMASDEV<=46) THEN
     OFIELD = .TRUE.
     KRESP = 0
@@ -1471,9 +1638,19 @@ IF (HREC=='ECOCLIMAP') THEN
   END IF
 END IF
 !
-CALL FMREAD(CFILE,HREC,COUT,'--',OFIELD,IGRID,ILENCH,HCOMMENT,KRESP)
-!
-IF (KRESP /=0) THEN
+TZFIELD%CMNHNAME   = TRIM(HREC)
+TZFIELD%CSTDNAME   = ''
+TZFIELD%CLONGNAME  = 'SURFEX: '//TRIM(HREC)
+TZFIELD%CUNITS     = ''
+TZFIELD%CDIR       = '--'
+TZFIELD%CCOMMENT   = '' !Expected comment is not known
+TZFIELD%NGRID      = 0
+TZFIELD%NTYPE      = TYPELOG
+TZFIELD%NDIMS      = 0
+CALL IO_READ_FIELD(TPINFILE,TZFIELD,OFIELD,KRESP)
+HCOMMENT = TZFIELD%CCOMMENT
+!
+IF (KRESP/=0 .AND. KRESP/=-111) THEN
   WRITE(NLUOUT,*) 'WARNING'
   WRITE(NLUOUT,*) '-------'
   WRITE(NLUOUT,*) 'error when reading article ', HREC,'KRESP=',KRESP
@@ -1524,10 +1701,12 @@ END SUBROUTINE READ_SURFL0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR
 USE MODE_FM
 USE MODE_FMREAD
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, NLUOUT
+USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, TPINFILE, NLUOUT
+USE MODD_TYPE_DATE
 !
 !
 IMPLICIT NONE
@@ -1552,14 +1731,25 @@ CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
 CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
 INTEGER, DIMENSION(3)  :: ITDATE
 INTEGER                :: IMASDEV           ! MESONH version
+TYPE(TFIELDDATA)       :: TZFIELD
+TYPE(DATE_TIME)        :: TZDATETIME
 !-------------------------------------------------------------------------------
 !
 !
-CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
 IF (IMASDEV<46) THEN
-  CALL FMREAD(CFILE,'STORAGE_TYPE',COUT,'--',YFILETYPE2,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'STORAGE_TYPE',YFILETYPE2)
 ELSE
-  CALL FMREAD(CFILE,'STORAGETYPE',COUT,'--',YFILETYPE40,IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = 'STORAGETYPE'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: STORAGETYPE'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = '(-)'
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPECHAR
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,YFILETYPE40)
   YFILETYPE2 = YFILETYPE40(1:2)
 END IF
 IF (YFILETYPE2(1:2)=='PG') THEN
@@ -1572,30 +1762,21 @@ IF (YFILETYPE2(1:2)=='PG') THEN
   RETURN
 END IF
 !
-YRECFM=TRIM(HREC)//'%TDATE'
-CALL FMREAD(CFILE,YRECFM,COUT,'--',ITDATE,IGRID,ILENCH,HCOMMENT,KRESP)
-KYEAR  = ITDATE(1)
-KMONTH = ITDATE(2)
-KDAY   = ITDATE(3)
-
-   IF (KRESP /=0) THEN
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
-    WRITE(NLUOUT,*) 'default value may be used, who knows???'
-    WRITE(NLUOUT,*) ' '
-  ENDIF
+CALL IO_READ_FIELD(TPINFILE,HREC,TZDATETIME,KRESP)
+!
+IF (KRESP/=0 .AND. KRESP/=-111) THEN
+  WRITE(NLUOUT,*) 'WARNING'
+  WRITE(NLUOUT,*) '-------'
+  WRITE(NLUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
+  WRITE(NLUOUT,*) 'default value may be used, who knows???'
+  WRITE(NLUOUT,*) ' '
+ENDIF
+!
+KYEAR  = TZDATETIME%TDATE%YEAR
+KMONTH = TZDATETIME%TDATE%MONTH
+KDAY   = TZDATETIME%TDATE%DAY
+PTIME  = TZDATETIME%TIME
 !
-YRECFM=TRIM(HREC)//'%TIME'
-CALL FMREAD(CFILE,YRECFM,COUT,'--',PTIME,IGRID,ILENCH,HCOMMENT,KRESP)
-
-   IF (KRESP /=0) THEN
-    WRITE(NLUOUT,*) 'WARNING'
-    WRITE(NLUOUT,*) '-------'
-    WRITE(NLUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
-    WRITE(NLUOUT,*) 'default value may be used, who knows???'
-    WRITE(NLUOUT,*) ' '
-  ENDIF
 !-------------------------------------------------------------------------------
 END SUBROUTINE READ_SURFT0_MNH
 
@@ -1640,10 +1821,11 @@ END SUBROUTINE READ_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
+USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR
 USE MODE_FM
 USE MODE_FMREAD
 !
-USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, NLUOUT
+USE MODD_IO_SURF_MNH,        ONLY : COUT, CFILE, TPINFILE, NLUOUT
 !
 !
 IMPLICIT NONE
@@ -1670,14 +1852,24 @@ CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
 CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
 INTEGER, DIMENSION(3,KL1)  :: ITDATE
 INTEGER                :: IMASDEV           ! MESONH version
+TYPE(TFIELDDATA)       :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !
-CALL FMREAD(CFILE,'MASDEV',COUT,'--',IMASDEV,IGRID,ILENCH,HCOMMENT,KRESP)
+CALL IO_READ_FIELD(TPINFILE,'MASDEV',IMASDEV)
 IF (IMASDEV<46) THEN
-  CALL FMREAD(CFILE,'STORAGE_TYPE',COUT,'--',YFILETYPE2,IGRID,ILENCH,HCOMMENT,KRESP)
+  CALL IO_READ_FIELD(TPINFILE,'STORAGE_TYPE',YFILETYPE2)
 ELSE
-  CALL FMREAD(CFILE,'STORAGETYPE',COUT,'--',YFILETYPE40,IGRID,ILENCH,HCOMMENT,KRESP)
+  TZFIELD%CMNHNAME   = 'STORAGETYPE'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'SURFEX: STORAGETYPE'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = '(-)'
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPECHAR
+  TZFIELD%NDIMS      = 0
+  CALL IO_READ_FIELD(TPINFILE,TZFIELD,YFILETYPE40)
   YFILETYPE2 = YFILETYPE40(1:2)
 END IF
 !IF (YFILETYPE2(1:2)=='PG') THEN
@@ -1696,7 +1888,7 @@ KYEAR(:)  = ITDATE(1,:)
 KMONTH(:) = ITDATE(2,:)
 KDAY(:)   = ITDATE(3,:)
 
-   IF (KRESP /=0) THEN
+   IF (KRESP/=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
@@ -1707,7 +1899,7 @@ KDAY(:)   = ITDATE(3,:)
 YRECFM=TRIM(HREC)//'%TIME'
 CALL FMREAD(CFILE,YRECFM,COUT,'--',PTIME(:),IGRID,ILENCH,HCOMMENT,KRESP)
 
-   IF (KRESP /=0) THEN
+   IF (KRESP/=0 .AND. KRESP/=-111) THEN
     WRITE(NLUOUT,*) 'WARNING'
     WRITE(NLUOUT,*) '-------'
     WRITE(NLUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index 57dc1b2e1..f994bf162 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -390,7 +390,8 @@ INTEGER,DIMENSION(:,:),ALLOCATABLE   :: IJCOUNT
 !
 REAL                :: ZZS_MAX, ZZS_MAX_ll
 !
-TYPE(TFILEDATA),POINTER :: TZFILE
+TYPE(TFILEDATA),POINTER :: TZFILE      => NULL()
+TYPE(TFILEDATA),POINTER :: TZSONFILE   => NULL()
 TYPE(TFILEDATA),POINTER :: TZFILEDUMMY => NULL()
 !-------------------------------------------------------------------------------
 !
@@ -432,7 +433,6 @@ ZTIME1 = ZSTART
 CALL DEALLOCATE_MODEL1(1)
 CALL DEALLOCATE_MODEL1(2)
 !
-TZFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !
@@ -499,8 +499,9 @@ IF (LEN_TRIM(HSONFILE) /= 0 ) THEN
 !
 !        3.3.1  Opening the son input file and reading the grid
 ! 
-  WRITE(ILUOUT,*) 'SPAWN_MODEL2: spawing with a SON input file :',TRIM(HSONFILE)
-  CALL FMOPEN_ll(HSONFILE,'READ',CLUOUT,0,2,NVERB,ININAR,IRESP)
+  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)
@@ -1368,14 +1369,14 @@ ZPRESSURE2=ZTIME2-ZTIME1
 IF (SIZE(XINPRR) /= 0 ) THEN
   IF (GNOSON) &
     CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,   &
-              XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,                  &
+              XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,    &
               XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,&
               XINPRH,XACPRH )
   IF (.NOT.GNOSON) &
     CALL SPAWN_SURF2_RAIN (NXOR,NYOR,NXEND,NYEND,NDXRATIO,NDYRATIO,  &
-           XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,                    &
+           XINPRC,XACPRC,XINDEP,XACDEP,XINPRR,XINPRR3D,XEVAP3D,      &
            XACPRR,XINPRS,XACPRS,XINPRG,XACPRG,XINPRH,XACPRH,         &
-           HSONFILE,IIUSON,IJUSON,                                   &
+           TZSONFILE,IIUSON,IJUSON,                                  &
            IIB2,IJB2,IIE2,IJE2,                                      &
            IIB1,IJB1,IIE1,IJE1                                       )
 ENDIF
@@ -1510,8 +1511,8 @@ ZSURF2 = ZTIME2 - ZTIME1
 !	       ----------------- 
 !
 CALL IO_FILE_CLOSE_ll(TZFILE,CLUOUT,IRESP)
-IF (LEN_TRIM(HSONFILE) /= 0 ) THEN
-  CALL FMCLOS_ll(HSONFILE,'KEEP',CLUOUT,IRESP)
+IF (ASSOCIATED(TZSONFILE)) THEN
+  CALL IO_FILE_CLOSE_ll(TZSONFILE,CLUOUT,IRESP)
 END IF
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/spawn_surf2_rain.f90 b/src/MNH/spawn_surf2_rain.f90
index 38b6f46d8..aadc0f6e7 100644
--- a/src/MNH/spawn_surf2_rain.f90
+++ b/src/MNH/spawn_surf2_rain.f90
@@ -14,14 +14,15 @@ MODULE MODI_SPAWN_SURF2_RAIN
 !
 INTERFACE
 !
-      SUBROUTINE SPAWN_SURF2_RAIN (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,    &
-                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D,           &
-                              PACPRR,PINPRS,PACPRS,                            &
-                              PINPRG,PACPRG,PINPRH,PACPRH,                     &
-                              HSONFILE,KIUSON,KJUSON,                          &
-                              KIB2,KJB2,KIE2,KJE2,                             &
-                              KIB1,KJB1,KIE1,KJE1                              )
+      SUBROUTINE SPAWN_SURF2_RAIN (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,        &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,                                &
+                              PINPRG,PACPRG,PINPRH,PACPRH,                         &
+                              TPSONFILE,KIUSON,KJUSON,                             &
+                              KIB2,KJB2,KIE2,KJE2,                                 &
+                              KIB1,KJB1,KIE1,KJE1                                  )
 !
+USE MODD_IO_ll, ONLY: TFILEDATA
 !
 IMPLICIT NONE
 !
@@ -31,17 +32,17 @@ INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
 INTEGER,   INTENT(IN)  :: KDYRATIO   ! between model 2 and model 1
 !
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRC,PACPRC   ! Precipitations
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PINDEP          ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PACDEP          ! Droplet accumulated dep
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRR,PACPRR   ! Precipitations
-REAL, DIMENSION(:,:), INTENT(OUT)     :: PINDEP! Droplet instant deposition
-REAL, DIMENSION(:,:), INTENT(OUT)     :: PACDEP! Droplet accumulated dep
-REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D,PEVAP3D  ! Rain precipitation
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D,PEVAP3D! Rain precipitation
                                                        ! and evaporation fluxes
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRS,PACPRS   ! Precipitations
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRG,PACPRG   ! Precipitations
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRH,PACPRH   ! Precipitations
 !
            ! Arguments for spawning with 2 input files (father+son1)
-CHARACTER (LEN=*), OPTIONAL, INTENT(IN) :: HSONFILE  ! name of the input FM-file SON
+TYPE(TFILEDATA),POINTER, 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
@@ -55,15 +56,15 @@ END INTERFACE
 END MODULE MODI_SPAWN_SURF2_RAIN
 !
 !
-!     #########################################################################
-      SUBROUTINE SPAWN_SURF2_RAIN (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,    &
-                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D,           &
-                              PACPRR,PINPRS,PACPRS,                            &
-                              PINPRG,PACPRG,PINPRH,PACPRH,                     &
-                              HSONFILE,KIUSON,KJUSON,                          &
-                              KIB2,KJB2,KIE2,KJE2,                             &
-                              KIB1,KJB1,KIE1,KJE1                              )
-!     #########################################################################
+!     ##############################################################################
+      SUBROUTINE SPAWN_SURF2_RAIN (KXOR,KYOR,KXEND,KYEND,KDXRATIO,KDYRATIO,        &
+                              PINPRC,PACPRC,PINDEP,PACDEP,PINPRR,PINPRR3D,PEVAP3D, &
+                              PACPRR,PINPRS,PACPRS,                                &
+                              PINPRG,PACPRG,PINPRH,PACPRH,                         &
+                              TPSONFILE,KIUSON,KJUSON,                             &
+                              KIB2,KJB2,KIE2,KJE2,                                 &
+                              KIB1,KJB1,KIE1,KJE1                                  )
+!     ##############################################################################
 !
 !!****  *SPAWN_SURF2_RAIN * - subroutine to interpolate surface precipitations
 !
@@ -115,21 +116,20 @@ END MODULE MODI_SPAWN_SURF2_RAIN
 !
 !*       0.     DECLARATIONS
 !               ------------
-USE MODD_LBC_n,   ONLY : LBC_MODEL
+!
 USE MODD_BIKHARDT_n
-USE MODD_LUNIT_n, ONLY : CLUOUT
-USE MODD_FIELD_n, ONLY : XTHT
 USE MODD_CONF,    ONLY : CCONF,CPROGRAM
-!
+USE MODD_FIELD_n, ONLY : XTHT
+USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_LBC_n,   ONLY : LBC_MODEL
+USE MODD_LUNIT_n, ONLY : CLUOUT
 USE MODD_SPAWN
 !
-USE MODI_BIKHARDT         ! Interface modules
-!
 USE MODE_MODELN_HANDLER
 !
+USE MODI_BIKHARDT         ! Interface modules
 USE MODI_READ_PRECIP_FIELD
 !
-!
 IMPLICIT NONE
 !
 !
@@ -142,16 +142,16 @@ INTEGER,   INTENT(IN)  :: KDXRATIO   !  x and y-direction Resolution ratio
 INTEGER,   INTENT(IN)  :: KDYRATIO   ! between model 2 and model 1
 !
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRC,PACPRC   ! Precipitations
-REAL, DIMENSION(:,:), INTENT(OUT)     :: PINDEP! Droplet instant deposition
-REAL, DIMENSION(:,:), INTENT(OUT)     :: PACDEP! Droplet accumulated dep
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PINDEP          ! Droplet instant deposition
+REAL, DIMENSION(:,:),   INTENT(OUT) :: PACDEP          ! Droplet accumulated dep
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRR,PACPRR   ! Precipitations
-REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D,PEVAP3D  ! Rain precipitation
+REAL, DIMENSION(:,:,:), INTENT(OUT) :: PINPRR3D,PEVAP3D! Rain precipitation
                                                        ! and evaporation fluxes
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRS,PACPRS   ! Precipitations
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRG,PACPRG   ! Precipitations
 REAL, DIMENSION(:,:),   INTENT(OUT) :: PINPRH,PACPRH   ! Precipitation!
 ! Arguments for spawning with 2 input files (father+son1)
-CHARACTER (LEN=*), OPTIONAL, INTENT(IN) :: HSONFILE  ! name of the input FM-file SON
+TYPE(TFILEDATA),POINTER, 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
@@ -357,7 +357,7 @@ END IF
 !*       3.3  Informations from model SON1
 !             ----------------------------
 !
-IF (PRESENT(HSONFILE)) THEN
+IF (PRESENT(TPSONFILE)) THEN
   IF (SIZE(XINPRC1) /= 0 ) THEN
     ALLOCATE(ZINPRC1(KIUSON,KJUSON))
     ALLOCATE(ZACPRC1(KIUSON,KJUSON))
@@ -416,11 +416,11 @@ IF (PRESENT(HSONFILE)) THEN
     ALLOCATE(ZACPRH1(0,0))
     YGETRHT='SKIP'
   END IF
-  CALL READ_PRECIP_FIELD(HSONFILE,CLUOUT,CPROGRAM,CCONF,                          &
-                         YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT,                 &
-                         ZINPRC1,ZACPRC1,ZINDEP1,ZACDEP1,ZINPRR1,ZINPRR3D1,ZEVAP3D1,              &
-                         ZACPRR1,ZINPRS1,ZACPRS1,                                 &
-                         ZINPRG1,ZACPRG1,ZINPRH1,ZACPRH1                          )
+  CALL READ_PRECIP_FIELD(TPSONFILE,CLUOUT,CPROGRAM,CCONF,                            &
+                         YGETRCT,YGETRRT,YGETRST,YGETRGT,YGETRHT,                    &
+                         ZINPRC1,ZACPRC1,ZINDEP1,ZACDEP1,ZINPRR1,ZINPRR3D1,ZEVAP3D1, &
+                         ZACPRR1,ZINPRS1,ZACPRS1,                                    &
+                         ZINPRG1,ZACPRG1,ZINPRH1,ZACPRH1                             )
   IF (SIZE(XINPRC1) /= 0 ) THEN
     PINPRC(KIB2:KIE2,KJB2:KJE2) = ZINPRC1(KIB1:KIE1,KJB1:KJE1)
     PACPRC(KIB2:KIE2,KJB2:KJE2) = ZACPRC1(KIB1:KIE1,KJB1:KJE1)
diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90
index e9a817722..36dc95211 100644
--- a/src/MNH/spawning.f90
+++ b/src/MNH/spawning.f90
@@ -201,7 +201,7 @@ CALL CLOSE_ll(YEXSPA)
 CALL INIT_MNH
 !
 CALL FMCLOS_ll(CINIFILE,'KEEP',CLUOUT,IRESP)
-CALL FMCLOS_ll(CINIFILEPGD,'KEEP',CLUOUT,IRESP,OPARALLELIO=.FALSE.)
+CALL IO_FILE_CLOSE_ll(TINIFILEPGD,CLUOUT,IRESP,OPARALLELIO=.FALSE.)
 !-------------------------------------------------------------------------------
 !
 !*       4.    INITIALIZATION OF OUTER POINTS OF MODEL 1
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index c92d7c5b6..72af98fdc 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -654,7 +654,7 @@ END SUBROUTINE WRITE_SURFX2COV_MNH
 !             ------------
 !
 USE MODE_IO_WRITE_FIELD
-USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG,TYPEREAL
+USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
 USE MODE_MSG
 USE MODE_TOOLS_ll
 !
@@ -858,6 +858,9 @@ IF( (HREC=='IMAX' .OR. HREC=='JMAX' .OR. HREC=='KMAX') .AND.  &
     CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN0_MNH',TRIM(HREC)//' not written in file by externalized surface')
     RETURN
 !
+ELSE IF (HREC=='VERSION' .OR. HREC=='BUG') THEN
+  !Field is in fieldlist
+  CALL IO_WRITE_FIELD(TFILE_SURFEX,HREC,KFIELD,KRESP)
 ELSE
   IFIELD = KFIELD
   IF (HREC=='IMAX') IFIELD = NIU_ALL-2*JPHEXT
diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90
index 3bce1fdeb..92bbf157e 100644
--- a/src/MNH/xy_to_latlon.f90
+++ b/src/MNH/xy_to_latlon.f90
@@ -66,16 +66,18 @@
 !*    0.     DECLARATION
 !            -----------
 !
-USE MODE_FM
-USE MODE_IO_ll
 !
 USE MODD_GRID      
+USE MODD_IO_ll,  ONLY: TFILEDATA
 USE MODD_PGDDIM
 USE MODD_PGDGRID
 USE MODD_PARAMETERS
 USE MODD_LUNIT
 !
+USE MODE_FM
 USE MODE_GRIDPROJ
+USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY : IO_FILE_ADD2LIST
 !
 USE MODI_INI_CST
 USE MODI_READ_HGRID
@@ -101,6 +103,7 @@ REAL    :: ZXHAT               ! output conformal coodinate x
 REAL    :: ZYHAT               ! output conformal coodinate y
 REAL    :: ZLAT                ! output latitude
 REAL    :: ZLON                ! output longitude
+TYPE(TFILEDATA),POINTER :: TZINIFILE => NULL()
 !
 !*    0.3    Declaration of namelists
 !            ------------------------
@@ -133,17 +136,18 @@ CALL CLOSE_ll('XY2LATLON1.nam',IOSTAT=IRESP)
 !*    1.     Opening of MESONH file
 !            ----------------------
 !
-CALL FMOPEN_ll(YINIFILE,'READ',CLUOUT0,0,2,2,ININAR,IRESP)
+CALL IO_FILE_ADD2LIST(TZINIFILE,TRIM(YINIFILE),'UNKNOWN','READ',KLFINPRAR=0,KLFITYPE=2,KLFIVERB=2)
+CALL IO_FILE_OPEN_ll(TZINIFILE,CLUOUT0,IRESP)
 !
 !*    2.     Reading of MESONH file
 !            ----------------------
 !
-CALL READ_HGRID(0,YINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
+CALL READ_HGRID(0,TZINIFILE,YNAME,YDAD,YSTORAGE_TYPE)
 !
 !*    3.     Closing of MESONH file
 !            ----------------------
 !
-CALL FMCLOS_ll(YINIFILE,'KEEP',CLUOUT0,IRESP)
+CALL IO_FILE_CLOSE_ll(TZINIFILE,CLUOUT0,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index 0a4335a41..feb30eec2 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -109,7 +109,7 @@ LOGICAL :: GFOUND
 INTEGER            :: IXOR_DAD,IYOR_DAD  ! compared to Dad file, if any
 INTEGER            :: IXOR,IYOR          ! given or computed
 INTEGER            :: IDXRATIO,IDYRATIO
-TYPE(TFILEDATA),POINTER :: TZZOOMFILE
+TYPE(TFILEDATA),POINTER :: TZZOOMFILE,TZPGDFILE
 !
 REAL,  DIMENSION(:,:), ALLOCATABLE :: ZZS1,ZZSMT1,ZZS2,ZZSMT2
 !
@@ -160,12 +160,13 @@ CALL CLOSE_ll(YNAMELIST,IOSTAT=IRESP)
 !*    2.1     Open PGD file
 !             -------------
 !
-CALL FMOPEN_ll(CPGDFILE,'READ',CLUOUT0,1,2,5,ININAR,IRESP)
+CALL IO_FILE_ADD2LIST(TZPGDFILE,TRIM(CPGDFILE),'UNKNOWN','READ',KLFINPRAR=1,KLFITYPE=2,KLFIVERB=5)
+CALL IO_FILE_OPEN_ll(TZPGDFILE,CLUOUT0,IRESP)
 !
 !*    2.2     Reading of initial grid
 !             -----------------------
 !
-CALL READ_HGRID(1,CPGDFILE,YMY_NAME,YDAD_NAME,YSTORAGE_TYPE)
+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))
@@ -265,6 +266,8 @@ CPGDFILE = YZOOMFILE
 !*    3.     CLOSE PARALLELIZED I/O
 !            ----------------------
 !
+CALL IO_FILE_CLOSE_ll(TZPGDFILE,CLUOUT0,IRESP)
+!
 WRITE(ILUOUT0,*)
 WRITE(ILUOUT0,*) '***************************'
 WRITE(ILUOUT0,*) '* ZOOM_PGD ends correctly *'
diff --git a/src/MNH/zsmt_pgd.f90 b/src/MNH/zsmt_pgd.f90
index 6c2ca2c6d..3f306ad07 100644
--- a/src/MNH/zsmt_pgd.f90
+++ b/src/MNH/zsmt_pgd.f90
@@ -92,12 +92,6 @@ INTEGER :: IJMAX      ! number of physical points in Y direction
 INTEGER :: IIU        ! number of points in X direction
 INTEGER :: IJU        ! number of points in Y direction
 !
-INTEGER           :: IRESP    ! return code for I/O
-CHARACTER(LEN=16) :: YRECFM   ! name of record
-INTEGER           :: IGRID    ! grid location
-INTEGER           :: ILENCH   ! length of comment string
-CHARACTER(LEN=100):: YCOMMENT ! comment string
-
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSMOOTH_ZS ! smooth orography
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZFINE_ZS   ! smoothed fine orography
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZSLEVE_ZS  ! smooth orography for sleve coordinate
@@ -129,8 +123,9 @@ ALLOCATE(ZFINE_ZS(IIU,IJU))
 ALLOCATE(ZSLEVE_ZS(IIU,IJU))
 ALLOCATE(ZMASK(IIU,IJU))
 !
-YRECFM = 'ZS              '
-CALL FMREAD(TPFILE%CNAME,YRECFM,CLUOUT0,'XY',ZZS,IGRID,ILENCH,YCOMMENT,IRESP)
+!PW: bug/TODO: read a field in a file opened in WRITE mode
+!There is a test in IO_READ_FIELD_BYFIELD_X2 to allow this if TPFILE%CMODE='LFICDF4'
+CALL IO_READ_FIELD(TPFILE,'ZS',ZZS)
 !
 DO JI=1,JPHEXT
 ZZS(JI,:) = ZZS(IIB,:)
-- 
GitLab