From c41bd3262e6562d24edc92265b68c5cd907a670b Mon Sep 17 00:00:00 2001
From: Philippe WAUTELET <philippe.wautelet@aero.obs-mip.fr>
Date: Thu, 16 Nov 2017 11:30:00 +0100
Subject: [PATCH] Philippe 16/11/2017: IO: use IO_FILE_OPEN/CLOSE_ll everywhere
 instead of OPEN_ll/CLOSE_ll + creation of CHEMINPUT, CHEMTAB, GPS, METEO and
 TXT CTYPES for TFILEDATA

---
 src/LIB/SURCOUCHE/src/mode_fm.f90             |  94 ++++++++++--
 .../SURCOUCHE/src/mode_io_manage_struct.f90   |  42 +++++-
 src/MNH/ch_aer_mod_init.f90                   |  66 +++++----
 src/MNH/ch_emission_flux0d.f90                |  15 +-
 src/MNH/ch_field_valuen.f90                   |  23 ++-
 src/MNH/ch_init_constn.f90                    |  25 ++--
 src/MNH/ch_init_meteo.f90                     |  20 +--
 src/MNH/ch_open_input.f90                     |  61 ++++----
 src/MNH/ch_read_chem.f90                      |  10 +-
 src/MNH/ch_read_meteo.f90                     |   6 +-
 src/MNH/ch_surface0d.f90                      |  14 +-
 src/MNH/close_file_mnh.f90                    |   6 +-
 src/MNH/gps_zenith.f90                        |  30 ++--
 src/MNH/ini_aircraft_balloon.f90              |   4 +-
 src/MNH/mnh2lpdm.f90                          |  64 ++++----
 src/MNH/mnh2lpdm_ech.f90                      |  56 +++----
 src/MNH/mnh2lpdm_ini.f90                      | 138 +++++++++---------
 src/MNH/mnhclose_write_cover_tex.f90          |  22 ++-
 src/MNH/mnhopen_aux_io_surf.f90               |   6 +-
 src/MNH/mnhopen_write_cover_tex.f90           |  23 +--
 src/MNH/modd_ch_model0d.f90                   |   4 +-
 src/MNH/radar_scattering.f90                  |  34 +++--
 src/MNH/read_all_data_grib_case.f90           |  15 +-
 src/MNH/read_chem_data_netcdf_case.f90        |  14 +-
 src/MNH/resolved_elecn.f90                    |  50 ++++---
 src/MNH/write_lfifm1_for_diag.f90             |  21 ++-
 src/MNH/write_ts1d.f90                        |  23 ++-
 27 files changed, 564 insertions(+), 322 deletions(-)

diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 23db54929..bc93c55a7 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -132,7 +132,7 @@ END IF
 
 END SUBROUTINE FMLOOK_ll
 
-SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO)
+SUBROUTINE IO_FILE_OPEN_ll(TPFILE,KRESP,OPARALLELIO,HPOSITION,HSTATUS)
 !
 USE MODD_CONF,  ONLY: NMNHVERSION
 USE MODD_IO_ll, ONLY: ISP,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
@@ -145,6 +145,8 @@ USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME
 TYPE(TFILEDATA),POINTER,INTENT(INOUT)         :: TPFILE ! File structure
 INTEGER,                INTENT(OUT), OPTIONAL :: KRESP  ! Return code
 LOGICAL,                INTENT(IN),  OPTIONAL :: OPARALLELIO
+CHARACTER(LEN=*),       INTENT(IN),  OPTIONAL :: HPOSITION
+CHARACTER(LEN=*),       INTENT(IN),  OPTIONAL :: HSTATUS
 !
 INTEGER :: IRESP,IRESP2
 INTEGER :: IMASDEV,IBUGFIX
@@ -172,16 +174,40 @@ CALL IO_FILE_FIND_BYNAME(TRIM(TPFILE%CNAME),TZFILE_DUMMY,IRESP)
 IF (IRESP/=0) CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_OPEN_ll','file '//TRIM(TPFILE%CNAME)//' not in filelist')
 !
 SELECT CASE(TPFILE%CTYPE)
+  !Chemistry input files
+  CASE('CHEMINPUT')
+    CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,FORM='FORMATTED', &
+                 POSITION='REWIND',STATUS='OLD',ACTION=TPFILE%CMODE,MODE='GLOBAL',TPFILE=TPFILE)
+
+
+  !Chemistry tabulation files
+  CASE('CHEMTAB')
+    CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,FORM='FORMATTED', &
+                 ACTION=TPFILE%CMODE,MODE='GLOBAL',TPFILE=TPFILE)
+
+
+  !GPS files
+  CASE('GPS')
+    CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,FORM='FORMATTED', &
+                ACTION=TPFILE%CMODE,MODE='SPECIFIC',TPFILE=TPFILE)
+
+
+  !Meteo files
+  CASE('METEO')
+   CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,FORM='UNFORMATTED', &
+                ACTION=TPFILE%CMODE,MODE='GLOBAL',RECL=100000000,TPFILE=TPFILE)
+
+
   !Namelist files
   CASE('NML')
     CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
-        DELIM='QUOTE',MODE='GLOBAL')
+        DELIM='QUOTE',MODE='GLOBAL',TPFILE=TPFILE)
 
 
   !OUTPUTLISTING files
   CASE('OUTPUTLISTING')
     CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,FORM='FORMATTED', &
-                ACTION=TPFILE%CMODE,MODE='GLOBAL')
+                ACTION=TPFILE%CMODE,MODE='GLOBAL',TPFILE=TPFILE)
 
 
   !SURFACE_DATA files
@@ -189,15 +215,28 @@ SELECT CASE(TPFILE%CTYPE)
     IF (TPFILE%CFORM=='FORMATTED') THEN
       CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
                   FORM=TPFILE%CFORM,                                                   &
-                  MODE='GLOBAL')
+                  MODE='GLOBAL',TPFILE=TPFILE)
     ELSE IF (TPFILE%CACCESS=='DIRECT') THEN
       CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
                   FORM=TPFILE%CFORM,ACCESS=TPFILE%CACCESS,RECL=TPFILE%NRECL,           &
-                  MODE='GLOBAL')
+                  MODE='GLOBAL',TPFILE=TPFILE)
     ELSE
       CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
                   FORM=TPFILE%CFORM,                                                   &
-                  MODE='GLOBAL')
+                  MODE='GLOBAL',TPFILE=TPFILE)
+    END IF
+
+
+  !Text files
+  CASE('TXT')
+    IF(TPFILE%NRECL>0) THEN
+      CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
+                   FORM='FORMATTED',POSITION=HPOSITION,STATUS=HSTATUS,                 &
+                   RECL=TPFILE%NRECL,MODE='GLOBAL',TPFILE=TPFILE)
+    ELSE
+      CALL OPEN_ll(UNIT=TPFILE%NLU,FILE=TPFILE%CNAME,IOSTAT=IRESP,ACTION=TPFILE%CMODE, &
+                   FORM='FORMATTED',POSITION=HPOSITION,STATUS=HSTATUS,                 &
+                   MODE='GLOBAL',TPFILE=TPFILE)
     END IF
 
 
@@ -207,7 +246,7 @@ SELECT CASE(TPFILE%CTYPE)
       CALL IO_FILE_ADD2LIST(TZFILE_DES,TRIM(TPFILE%CNAME)//'.des','DES',TPFILE%CMODE,OOLD=.TRUE.) !OOLD=T because the file may already be in the list
       CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_FILE_OPEN_ll','OPEN_ll for '//TRIM(TPFILE%CNAME)//'.des')
       CALL OPEN_ll(UNIT=TZFILE_DES%NLU,FILE=TRIM(TPFILE%CNAME)//'.des',FORM='FORMATTED',ACTION=TPFILE%CMODE,DELIM&
-        & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=OPARALLELIO)
+        & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=OPARALLELIO,TPFILE=TPFILE)
       TZFILE_DES%LOPENED       = .TRUE.
       TZFILE_DES%NOPEN_CURRENT = TZFILE_DES%NOPEN_CURRENT + 1
       TZFILE_DES%NOPEN         = TZFILE_DES%NOPEN + 1
@@ -424,24 +463,26 @@ IF (ISP == TZFDLFI%OWNER) THEN
         !! Open NetCDF File for reading
         TZFDLFI%CDF => NEWIOCDF()
         CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','NF90_OPEN for '//TRIM(YFILEM)//'.nc')
-        INCERR = NF90_OPEN(ADJUSTL(TRIM(YFILEM))//".nc", NF90_NOWRITE, TZFDLFI%CDF%NCID)
+        INCERR = NF90_OPEN(ADJUSTL(TRIM(YFILEM))//".nc", NF90_NOWRITE, TPFILE%NNCID)
         IF (INCERR /= NF90_NOERR) THEN
            !PRINT *, 'FMOPEN_ll, NF90_OPEN error : ', NF90_STRERROR(INCERR)
            PRINT *, 'Error in opening (FMOPEN_ll/NF90_OPEN) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR)
            STOP
         END IF
+        TZFDLFI%CDF%NCID = TPFILE%NNCID
      END IF
      
      IF (YACTION == 'WRITE') THEN
         TZFDLFI%CDF => NEWIOCDF()
         CALL PRINT_MSG(NVERB_DEBUG,'IO','FMOPEN_ll','NF90_CREATE for '//TRIM(YFILEM)//'.nc')
         INCERR = NF90_CREATE(ADJUSTL(TRIM(YFILEM))//".nc", &
-             &IOR(NF90_CLOBBER,NF90_NETCDF4), TZFDLFI%CDF%NCID)
+             &IOR(NF90_CLOBBER,NF90_NETCDF4), TPFILE%NNCID)
         IF (INCERR /= NF90_NOERR) THEN
            !PRINT *, 'FMOPEN_ll, NF90_CREATE error : ', NF90_STRERROR(INCERR)
            PRINT *, 'Error in opening (FMOPEN_ll/NF90_CREATE) ', TRIM(YFILEM)//'.nc', ' : ', NF90_STRERROR(INCERR)
            STOP
         END IF
+        TZFDLFI%CDF%NCID = TPFILE%NNCID
      END IF
   END IF
 #endif
@@ -535,6 +576,34 @@ IF (TPFILE%NOPEN_CURRENT>1) THEN
 END IF
 !
 SELECT CASE(TPFILE%CTYPE)
+  !Chemistry input files
+  CASE('CHEMINPUT')
+    CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
+    !
+    TPFILE%NLU = -1
+
+
+  !Chemistry tabulation files
+  CASE('CHEMTAB')
+    CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
+    !
+    TPFILE%NLU = -1
+
+
+  !GPS files
+  CASE('GPS')
+    CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
+    !
+    TPFILE%NLU = -1
+
+
+  !Meteo files
+  CASE('METEO')
+    CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
+    !
+    TPFILE%NLU = -1
+
+
   !Namelist files
   CASE('NML')
     CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
@@ -556,6 +625,13 @@ SELECT CASE(TPFILE%CTYPE)
     TPFILE%NLU = -1
 
 
+  !Text files
+  CASE('TXT')
+    CALL CLOSE_ll(TPFILE%CNAME,IOSTAT=IRESP)
+    !
+    TPFILE%NLU = -1
+
+
   CASE DEFAULT
     !Do not close (non-existing) '.des' file if OUTPUT
     IF(TPFILE%CTYPE/='OUTPUT') THEN
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 89bf44b9b..1c5f8a82a 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -663,7 +663,7 @@ ELSE
   ILFIVERB = -1
 END IF
 !
-IF(     PRESENT(KRECL) .AND. TRIM(HTYPE)/='SURFACE_DATA') &
+IF(     PRESENT(KRECL) .AND. TRIM(HTYPE)/='SURFACE_DATA' .AND. TRIM(HTYPE)/='TXT') &
     CALL PRINT_MSG(NVERB_WARNING,'IO','IO_FILE_ADD2LIST','optional argument KRECL is not used by '//TRIM(HTYPE)//' files')
 IF(.NOT.PRESENT(KRECL) .AND. TRIM(HTYPE)=='SURFACE_DATA') THEN
     IF(TRIM(HACCESS)=='DIRECT') &
@@ -692,23 +692,51 @@ END IF
 TPFILE%CMODE = HMODE
 !
 SELECT CASE(TPFILE%CTYPE)
+  !Chemistry input files
+  CASE('CHEMINPUT')
+    IF (TRIM(HMODE)/='READ') & !Invalid because not (yet) necessary
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
+    TPFILE%CFORMAT = 'TEXT'
+
+
+  !Chemistry tabulation files
+  CASE('CHEMTAB')
+    IF (TRIM(HMODE)/='READ') & !Invalid because not (yet) necessary
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
+    TPFILE%CFORMAT = 'TEXT'
+
+
+  !GPS files
+  CASE('GPS')
+    IF (TRIM(HMODE)/='WRITE') & !Invalid because not (yet) necessary
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
+    TPFILE%CFORMAT = 'TEXT'
+
+
+  !Meteo files
+  CASE('METEO')
+    IF (TRIM(HMODE)/='WRITE') & !Invalid because not (yet) necessary
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
+    TPFILE%CFORMAT = 'BINARY'
+
+
   !Namelist files
   CASE('NML')
-    IF (TRIM(HMODE)/='READ') &
+    IF (TRIM(HMODE)/='READ') & !Invalid because not (yet) necessary
       CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
     TPFILE%CFORMAT = 'TEXT'
 
 
   !OUTPUTLISTING files
   CASE('OUTPUTLISTING')
-    IF (TRIM(HMODE)/='WRITE') &
+    IF (TRIM(HMODE)/='WRITE') & !Invalid because not (yet) necessary
       CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
     TPFILE%CFORMAT = 'TEXT'
 
 
   !SURFACE_DATA files
   CASE('SURFACE_DATA')
-    IF (TRIM(HMODE)/='READ') &
+    IF (TRIM(HMODE)/='READ') & !Invalid because not (yet) necessary
       CALL PRINT_MSG(NVERB_ERROR,'IO','IO_FILE_ADD2LIST','invalid mode '//TRIM(HMODE)//' for file '//TRIM(HNAME))
     TPFILE%CFORMAT = 'SURFACE_DATA'
     TPFILE%CFORM   = HFORM
@@ -716,6 +744,12 @@ SELECT CASE(TPFILE%CTYPE)
     IF(TRIM(HACCESS)=='DIRECT') TPFILE%NRECL   = KRECL
 
 
+  !Text files
+  CASE('TXT')
+    TPFILE%CFORMAT = 'TEXT'
+    IF(PRESENT(KRECL)) TPFILE%NRECL = KRECL
+
+
   CASE DEFAULT
     IF (TRIM(HMODE)=='READ') THEN
       IF (LLFIREAD) THEN
diff --git a/src/MNH/ch_aer_mod_init.f90 b/src/MNH/ch_aer_mod_init.f90
index 7b9bf947b..5879105d2 100644
--- a/src/MNH/ch_aer_mod_init.f90
+++ b/src/MNH/ch_aer_mod_init.f90
@@ -53,11 +53,13 @@ END MODULE MODI_CH_AER_MOD_INIT
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
 USE MODD_CH_AEROSOL
-USE MODE_ll
-USE MODE_IO_ll
+USE MODD_GLO
+USE MODD_IO_ll,            ONLY: TFILEDATA
 USE MODD_UNIFACPARAM
+!
+USE MODE_FM,               ONLY: IO_FILE_OPEN_ll,IO_FILE_CLOSE_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 USE MODE_UNIFAC
-USE MODD_GLO
 !
 !
 !*       0.     DECLARATIONS
@@ -73,6 +75,7 @@ INTEGER, PARAMETER :: nc=22, nh=16, nt=11 ! inorganic interpolation
 INTEGER            :: JI, JJ, JK, JL, JM ! loop counter
 INTEGER :: IRESP                   ! return code in FM routines
 INTEGER :: ILU                     ! logical unit
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !---------------------------------------------------------------------------
 !
@@ -80,13 +83,14 @@ INTEGER :: ILU                     ! logical unit
 !
 !        1.1    initialisation
 !
+TZFILE => NULL()
 !
-! Initialize the mineral tablution 
+! Initialize the mineral tabulation 
 IF (CMINERAL == 'NARES') THEN
 !       .. the file ares.w contains the weights of the model
-        CALL OPEN_ll(UNIT=ILU,FILE="ares1A.w",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-        MODE='GLOBAL')
-        !OPEN(1,FILE="ares1A.w",STATUS="OLD") 
+        CALL IO_FILE_ADD2LIST(TZFILE,'ares1A.w','CHEMTAB','READ')
+        CALL IO_FILE_OPEN_ll(TZFILE)
+        ILU = TZFILE%NLU
         READ(ILU,*) I1IA,J1JA,K1KA 
         DO JI=1,I1IA 
           READ(ILU,*) X1MAXA(1,JI),X1MINA(1,JI),X1MODA(1,JI) 
@@ -100,12 +104,12 @@ IF (CMINERAL == 'NARES') THEN
         DO JJ=1,J1JA+1 
           READ(ILU,*) (W1JKA(JJ,JK),JK=1,K1KA) 
         ENDDO
-        CALL CLOSE_ll("ares1A.w",IOSTAT=IRESP)
+        CALL IO_FILE_CLOSE_ll(TZFILE)
+        TZFILE => NULL()
         !
-        !OPEN(1,FILE="ares1C.w",STATUS="OLD") 
-        CALL OPEN_ll(UNIT=ILU,FILE="ares1C.w",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-        MODE='GLOBAL')
-
+        CALL IO_FILE_ADD2LIST(TZFILE,'ares1C.w','CHEMTAB','READ')
+        CALL IO_FILE_OPEN_ll(TZFILE)
+        ILU = TZFILE%NLU
         READ(ILU,*) I1IC,J1JC,K1KC 
         DO JI=1,I1IC 
           READ(ILU,*) X1MAXC(1,JI),X1MINC(1,JI),X1MODC(1,JI) 
@@ -119,11 +123,12 @@ IF (CMINERAL == 'NARES') THEN
         DO JJ=1,J1JC+1 
           READ(ILU,*) (W1JKC(JJ,JK),JK=1,K1KC) 
         ENDDO
-        CALL CLOSE_ll("ares1C.w",IOSTAT=IRESP)
+        CALL IO_FILE_CLOSE_ll(TZFILE)
+        TZFILE => NULL()
         !
-        CALL OPEN_ll(UNIT=ILU,FILE="ares2A.w",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-        MODE='GLOBAL')
-        !OPEN(1,FILE="ares2A.w",STATUS="OLD") 
+        CALL IO_FILE_ADD2LIST(TZFILE,'ares2A.w','CHEMTAB','READ')
+        CALL IO_FILE_OPEN_ll(TZFILE)
+        ILU = TZFILE%NLU
         READ(ILU,*) I2IA,J2JA,K2KA 
         DO JI=1,I2IA 
           READ(ILU,*) X2MAXA(1,JI),X2MINA(1,JI),X2MODA(1,JI) 
@@ -137,11 +142,12 @@ IF (CMINERAL == 'NARES') THEN
         DO JJ=1,J2JA+1 
           READ(ILU,*) (W2JKA(JJ,JK),JK=1,K2KA) 
         ENDDO
-        CALL CLOSE_ll("ares2A.w",IOSTAT=IRESP)
+        CALL IO_FILE_CLOSE_ll(TZFILE)
+        TZFILE => NULL()
         !
-        CALL OPEN_ll(UNIT=ILU,FILE="ares2B.w",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-        MODE='GLOBAL')
-        !OPEN(1,FILE="ares2B.w",STATUS="OLD") 
+        CALL IO_FILE_ADD2LIST(TZFILE,'ares2B.w','CHEMTAB','READ')
+        CALL IO_FILE_OPEN_ll(TZFILE)
+        ILU = TZFILE%NLU
         READ(ILU,*) I2IB,J2JB,K2KB 
         DO JI=1,I2IB 
           READ(ILU,*) X2MAXB(1,JI),X2MINB(1,JI),X2MODB(1,JI) 
@@ -155,11 +161,12 @@ IF (CMINERAL == 'NARES') THEN
         DO JJ=1,J2JB+1 
           READ(ILU,*) (W2JKB(JJ,JK),JK=1,K2KB) 
         ENDDO
-        CALL CLOSE_ll("ares2B.w",IOSTAT=IRESP)
+        CALL IO_FILE_CLOSE_ll(TZFILE)
+        TZFILE => NULL()
         !
-        CALL OPEN_ll(UNIT=ILU,FILE="ares2C.w",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-        MODE='GLOBAL')
-        !OPEN(1,FILE="ares2C.w",STATUS="OLD") 
+        CALL IO_FILE_ADD2LIST(TZFILE,'ares2C.w','CHEMTAB','READ')
+        CALL IO_FILE_OPEN_ll(TZFILE)
+        ILU = TZFILE%NLU
         READ(ILU,*) I2IC,J2JC,K2KC 
         DO JI=1,I2IC 
           READ(ILU,*) X2MAXC(1,JI),X2MINC(1,JI),X2MODC(1,JI) 
@@ -173,7 +180,8 @@ IF (CMINERAL == 'NARES') THEN
         DO JJ=1,J2JC+1 
           READ(ILU,*) (W2JKC(JJ,JK),JK=1,K2KC) 
         ENDDO
-        CALL CLOSE_ll("ares2C.w",IOSTAT=IRESP)
+        CALL IO_FILE_CLOSE_ll(TZFILE)
+        TZFILE => NULL()
         !
 END IF
 !
@@ -184,8 +192,9 @@ IF (CMINERAL == 'TABUL') THEN
   IF(.NOT.ALLOCATED(znh)) ALLOCATE(znh(22))
   IF(.NOT.ALLOCATED(zni)) ALLOCATE(zni(22))
   IF(.NOT.ALLOCATED(zf)) ALLOCATE(zf(16,11,22,22,22,3))
-  CALL OPEN_ll(UNIT=ILU,FILE="AEROMIN_NEW",IOSTAT=IRESP,FORM='FORMATTED',ACTION='READ', &
-     MODE='GLOBAL')
+  CALL IO_FILE_ADD2LIST(TZFILE,'AEROMIN_NEW','CHEMTAB','READ')
+  CALL IO_FILE_OPEN_ll(TZFILE)
+  ILU = TZFILE%NLU
 
   WRITE(*,*) 'LOADING MINERAL AEROSOL DATA ...'
   DO JI=1,nh
@@ -215,7 +224,8 @@ IF (CMINERAL == 'TABUL') THEN
   ENDDO
   ENDDO
   WRITE(*,*) 'END LOADING'
-  CALL CLOSE_ll("AEROMIN_NEW",IOSTAT=IRESP)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
 ENDIF
 
 IF(TRIM(CORGANIC).eq."MPMPO")THEN
diff --git a/src/MNH/ch_emission_flux0d.f90 b/src/MNH/ch_emission_flux0d.f90
index 405f40324..c0eb26e43 100644
--- a/src/MNH/ch_emission_flux0d.f90
+++ b/src/MNH/ch_emission_flux0d.f90
@@ -77,8 +77,11 @@ END MODULE MODI_CH_EMISSION_FLUX0D
 !!
 !!    EXTERNAL
 !!    --------
-USE MODI_CH_OPEN_INPUT
+USE MODD_IO_ll,         ONLY: TFILEDATA
+USE MODE_FM,            ONLY: IO_FILE_CLOSE_ll
 USE MODE_IO_ll
+!
+USE MODI_CH_OPEN_INPUT
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -120,6 +123,7 @@ CHARACTER(LEN=32), ALLOCATABLE, DIMENSION(:)  :: YNAMEIN
 REAL,             ALLOCATABLE, DIMENSION(:,:) :: ZFLUXIN 
                              ! fluxes as given in file:
                              ! first index is the species,second index the time
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !*       0.3  declaration of saved local variables
 !
@@ -135,19 +139,22 @@ REAL,    SAVE, ALLOCATABLE, DIMENSION(:,:) :: ZSFLUX
 INTEGER, SAVE                              :: ISACT = 1 
                                            ! actual record (for interpolation)
 LOGICAL, SAVE                              :: LSFIRSTCALL = .TRUE.  
-                                           ! flag to identify first call 
+                                           ! flag to identify first call
 !
 !------------------------------------------------------------------------------
 !
 !*    EXECUTABLE STATEMENTS
 !     ---------------------
 !
+TZFILE => NULL()
+!
 IF (LSFIRSTCALL) THEN
 !
 !*       1.   READ DATA 
 !        --------------
 !
-  CALL CH_OPEN_INPUT(HINPUTFILE, "EMISDATA", IIO, KLUOUT, KVERB)
+  CALL CH_OPEN_INPUT(HINPUTFILE, "EMISDATA", TZFILE, KLUOUT, KVERB)
+  IIO = TZFILE%NLU
 !
 ! read unit identifier
   READ(IIO,'(A3)') YUNIT
@@ -196,7 +203,7 @@ IF (LSFIRSTCALL) THEN
 !
 ! close file
 !
-  CALL CLOSE_ll(HINPUTFILE,IOSTAT=IFAIL)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
 !
 !*       2.   MAP DATA ONTO PROGNOSTIC VARIABLES
 !        ---------------------------------------
diff --git a/src/MNH/ch_field_valuen.f90 b/src/MNH/ch_field_valuen.f90
index 17b759944..21906d4d3 100644
--- a/src/MNH/ch_field_valuen.f90
+++ b/src/MNH/ch_field_valuen.f90
@@ -78,7 +78,8 @@ END MODULE MODI_CH_FIELD_VALUE_n
 !!    EXTERNAL
 !!    --------
 USE MODI_CH_OPEN_INPUT  ! open general purpose ASCII input file
-USE MODE_IO_ll
+USE MODD_IO_ll,         ONLY: TFILEDATA
+USE MODE_FM,            ONLY: IO_FILE_CLOSE_ll
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -118,7 +119,9 @@ INTEGER :: IZINDEX   ! lower index for interpolation
 !
 REAL    :: ZRETURN   ! return value for function
 !
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
+TZFILE => NULL()
 !
 !*       1.    READ DATA FROM GENERAL PURPOSE INPUT FILE
 !              -----------------------------------------
@@ -137,7 +140,8 @@ firstcall: IF (GSFIRSTCALL) THEN
 !
 ! open input file
   IF (KVERB >= 5) WRITE(KLUOUT,*) "CH_FIELD_VALUE_n: reading form-profiles"
-  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "FORMPROF", ICHANNEL, KLUOUT, KVERB)
+  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "FORMPROF", TZFILE, KLUOUT, KVERB)
+  ICHANNEL = TZFILE%NLU
 !
 ! read number of profiles ISPROF and number of levels ISLEVEL
   READ(ICHANNEL,*) ISPROF, ISLEVEL
@@ -169,7 +173,8 @@ firstcall: IF (GSFIRSTCALL) THEN
   END IF
 !
 ! close file
-  CALL CLOSE_ll (CCHEM_INPUT_FILE, IOSTAT=IFAIL)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
 !
 ! check if Z-profile is given in increasing order, otherwise stop
   ZINF = ZSZPROF(1) ; IINF=1
@@ -191,7 +196,8 @@ firstcall: IF (GSFIRSTCALL) THEN
 ! open input file
   IF (KVERB >= 5) WRITE(KLUOUT,*) &
      "CH_FIELD_VALUE_n: reading species <--> form-profile association"
-  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "PROFASSO", ICHANNEL, KLUOUT, KVERB)
+  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "PROFASSO", TZFILE, KLUOUT, KVERB)
+  ICHANNEL = TZFILE%NLU
 !
 ! read number of associations ISASSO
   READ(ICHANNEL, *) ISASSO
@@ -212,14 +218,16 @@ firstcall: IF (GSFIRSTCALL) THEN
   ENDDO
 !
 ! close file
-  CALL CLOSE_ll (CCHEM_INPUT_FILE, IOSTAT=IFAIL)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
 !
 !
 !*       1.3   read norm-initial values
 !
 ! open input file
   IF (KVERB >= 5) WRITE(KLUOUT,*) "CH_FIELD_VALUE_n:reading norm-initial values"
-  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "NORMINIT", ICHANNEL, KLUOUT, KVERB)
+  CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "NORMINIT", TZFILE, KLUOUT, KVERB)
+  ICHANNEL = TZFILE%NLU
 !
 ! read units for initial data (may be "CON" for molec./cm3 or "MIX" for ppp)
   READ(ICHANNEL,"(A)") HUNIT
@@ -257,7 +265,8 @@ firstcall: IF (GSFIRSTCALL) THEN
   ENDDO
 !
 ! close file
-  CALL CLOSE_ll (CCHEM_INPUT_FILE, IOSTAT=IFAIL)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
 !
 ENDIF firstcall
 !
diff --git a/src/MNH/ch_init_constn.f90 b/src/MNH/ch_init_constn.f90
index 0bf1a6b7f..f8af935b6 100644
--- a/src/MNH/ch_init_constn.f90
+++ b/src/MNH/ch_init_constn.f90
@@ -64,8 +64,9 @@ END MODULE MODI_CH_INIT_CONST_n
 
 !!    EXTERNAL
 !!    --------
-USE MODE_IO_ll
 USE MODI_CH_OPEN_INPUT  ! open the general purpose ASCII input file
+USE MODD_IO_ll,         ONLY: TFILEDATA
+USE MODE_FM,            ONLY: IO_FILE_CLOSE_ll
 
 !!
 !!    IMPLICIT ARGUMENTS
@@ -114,13 +115,12 @@ CHARACTER(LEN=40), DIMENSION(:), ALLOCATABLE :: YHENRYNAME !species names
 REAL             , DIMENSION(:,:), ALLOCATABLE :: ZHENRYVAL
                           !chemical Henry constant value
 !
-
 INTEGER :: IFAIL          ! return code from CLOSE_ll
 INTEGER :: JI, JN, JNREAL ! loop control variables
 INTEGER :: INACT          ! array pointer
-
-
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
+TZFILE => NULL()
 !
 !*       1.    ALLOCATE FIELD
 !              --------------
@@ -134,7 +134,8 @@ IF (.NOT. ASSOCIATED(XSREALHENRYVAL))   ALLOCATE( XSREALHENRYVAL(NEQ,2) )
 ! open input file
 IF (KVERB >= 5) WRITE(KLUOUT,*) &
    "CH_INIT_CONST: reading  molar mass"
-CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "MASS_MOL", ICHANNEL, KLUOUT, KVERB)
+CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "MASS_MOL", TZFILE, KLUOUT, KVERB)
+ICHANNEL = TZFILE%NLU
 !
 ! read number of molecular diffusivity IMASS
 READ(ICHANNEL, *) IMASS
@@ -155,7 +156,8 @@ DO JI = 1, IMASS
 END DO
 !
 ! close file
-CALL CLOSE_ll(CCHEM_INPUT_FILE,IOSTAT=IFAIL)
+CALL IO_FILE_CLOSE_ll(TZFILE)
+TZFILE => NULL()
 !
 !
 IF (KVERB >= 10) THEN
@@ -187,7 +189,8 @@ END DO
 ! open input file
 IF (KVERB >= 5) WRITE(KLUOUT,*) &
    "CH_INIT_CONST: reading  reactivity factor "
-CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "REA_FACT", ICHANNEL, KLUOUT, KVERB)
+CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "REA_FACT", TZFILE, KLUOUT, KVERB)
+ICHANNEL = TZFILE%NLU
 !
 ! read number of molecular diffusivity IREACT
 READ(ICHANNEL, *) IREACT
@@ -207,7 +210,8 @@ DO JI = 1, IREACT
 END DO
 !
 ! close file
-CALL CLOSE_ll(CCHEM_INPUT_FILE,IOSTAT=IFAIL)
+CALL IO_FILE_CLOSE_ll(TZFILE)
+TZFILE => NULL()
 !
 !
 IF (KVERB >= 10) THEN
@@ -240,7 +244,7 @@ END DO
 IF (KVERB >= 5) WRITE(KLUOUT,*) &
    "CH_INIT_CONST: reading effective Henry constant", &
    " and its temperature correction "
-CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "HENRY_SP", ICHANNEL, KLUOUT, KVERB)
+CALL CH_OPEN_INPUT(CCHEM_INPUT_FILE, "HENRY_SP", TZFILE, KLUOUT, KVERB)
 !
 ! read number of molecular diffusivity IHENRY
 READ(ICHANNEL, *) IHENRY
@@ -263,7 +267,8 @@ DO JNREAL = 1, IHENRY
 END DO
 !
 ! close file
-CALL CLOSE_ll(CCHEM_INPUT_FILE,IOSTAT=IFAIL)
+CALL IO_FILE_CLOSE_ll(TZFILE)
+TZFILE => NULL()
 !
 IF (KVERB >= 10) THEN
   WRITE(KLUOUT,'(A)') '----------------------------------------------------'
diff --git a/src/MNH/ch_init_meteo.f90 b/src/MNH/ch_init_meteo.f90
index 9a20af67c..5a0414197 100644
--- a/src/MNH/ch_init_meteo.f90
+++ b/src/MNH/ch_init_meteo.f90
@@ -62,11 +62,12 @@ END MODULE MODI_CH_INIT_METEO
 !!    EXTERNAL
 !!    --------
 USE MODI_CH_OPEN_INPUT
+USE MODE_FM,         ONLY: IO_FILE_CLOSE_ll
 USE MODE_IO_ll
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
-USE MODD_CH_MODEL0D, ONLY: CMETEOFILE, NMETEOIO, NVERB
+USE MODD_CH_MODEL0D, ONLY: CMETEOFILE, NVERB, TMETEOFILE
 USE MODD_CH_M9_n,    ONLY: NMETEOVARS, METEOTRANSTYPE
 USE MODD_CH_METEO,   ONLY: NMETEORECS, XMETEOTIME, XMETEODATA
 !!
@@ -86,20 +87,21 @@ INTEGER      :: JI, JJ      ! loop control
 CHARACTER*80 :: YCOMMENT    ! comment line in meteo update file
 INTEGER      :: IMETEOVARS  ! number of meteovars to be read from file and
 			    ! checked against NMETEOVARS
-INTEGER      :: IFAIL       ! return code from CLOSE_LL
+INTEGER      :: ILUMETEO
 !
 !------------------------------------------------------------------------------
 !
 !*    EXECUTABLE STATEMENTS
 !     ---------------------
 !
-CALL CH_OPEN_INPUT(CMETEOFILE, "METEOVAR", NMETEOIO, 6, NVERB)
+CALL CH_OPEN_INPUT(CMETEOFILE, "METEOVAR", TMETEOFILE, 6, NVERB)
+ILUMETEO = TMETEOFILE%NLU
 !
 ! read number of variables NMETEOVARS
-READ(NMETEOIO,*) IMETEOVARS
+READ(ILUMETEO,*) IMETEOVARS
 !
 ! read number of records
-READ(NMETEOIO,*) NMETEORECS
+READ(ILUMETEO,*) NMETEORECS
 !
 ! check if number of meteovars in file corresponds to what the CCS expects
 IF (IMETEOVARS .NE. NMETEOVARS) THEN
@@ -115,7 +117,7 @@ END IF
 
 ! read names for TPM%CMETEOVAR
 DO JI = 1, NMETEOVARS
-  READ(NMETEOIO,*) TPM%CMETEOVAR(JI)
+  READ(ILUMETEO,*) TPM%CMETEOVAR(JI)
 END DO
 !
 ! print names of meteo variables
@@ -134,12 +136,12 @@ ALLOCATE(XMETEOTIME(NMETEORECS))
 ALLOCATE(XMETEODATA(NMETEOVARS,NMETEORECS))
 !
 DO JJ = 1, NMETEORECS
-  READ(NMETEOIO,*) XMETEOTIME(JJ)
-  READ(NMETEOIO,*) (XMETEODATA(JI,JJ), JI = 1, NMETEOVARS)
+  READ(ILUMETEO,*) XMETEOTIME(JJ)
+  READ(ILUMETEO,*) (XMETEODATA(JI,JJ), JI = 1, NMETEOVARS)
 END DO
 !
 ! close file
 !
-CALL CLOSE_LL(CMETEOFILE, IOSTAT=IFAIL)
+CALL IO_FILE_CLOSE_ll(TMETEOFILE)
 !
 END SUBROUTINE CH_INIT_METEO
diff --git a/src/MNH/ch_open_input.f90 b/src/MNH/ch_open_input.f90
index c3b9001fb..b602ea6f9 100644
--- a/src/MNH/ch_open_input.f90
+++ b/src/MNH/ch_open_input.f90
@@ -14,13 +14,17 @@
 !!
 INTERFACE
 !!
-SUBROUTINE CH_OPEN_INPUT(HCHEM_INPUT_FILE,HKEYWORD,KCHANNEL,KLUOUT,KVERB)
+SUBROUTINE CH_OPEN_INPUT(HCHEM_INPUT_FILE,HKEYWORD,TPFILE,KLUOUT,KVERB)
+!
+USE MODD_IO_ll,            ONLY: TFILEDATA
+!
 IMPLICIT NONE
-CHARACTER(LEN=*), INTENT(IN) :: HCHEM_INPUT_FILE ! general purpose input file
-CHARACTER(LEN=*), INTENT(IN) :: HKEYWORD         ! keyword for positioning
-INTEGER         , INTENT(OUT):: KCHANNEL         ! I/O channel to choose
-INTEGER,          INTENT(IN) :: KLUOUT           ! output listing channel
-INTEGER,          INTENT(IN) :: KVERB            ! verbosity level
+!
+CHARACTER(LEN=*),        INTENT(IN)  :: HCHEM_INPUT_FILE ! general purpose input file
+CHARACTER(LEN=*),        INTENT(IN)  :: HKEYWORD         ! keyword for positioning
+TYPE(TFILEDATA),POINTER, INTENT(OUT) :: TPFILE           ! Newly opened file
+INTEGER,                 INTENT(IN)  :: KLUOUT           ! output listing channel
+INTEGER,                 INTENT(IN)  :: KVERB            ! verbosity level
 END SUBROUTINE CH_OPEN_INPUT
 !!
 END INTERFACE
@@ -28,7 +32,7 @@ END INTERFACE
 END MODULE MODI_CH_OPEN_INPUT
 !!
 !!    ######################################################################### 
-      SUBROUTINE CH_OPEN_INPUT(HCHEM_INPUT_FILE,HKEYWORD,KCHANNEL,KLUOUT,KVERB)
+SUBROUTINE CH_OPEN_INPUT(HCHEM_INPUT_FILE,HKEYWORD,TPFILE,KLUOUT,KVERB)
 !!    #########################################################################
 !!
 !!*** *CH_OPEN_INPUT*
@@ -62,10 +66,6 @@ END MODULE MODI_CH_OPEN_INPUT
 !!    05/08/96 (K. Suhre) restructured
 !!    11/08/98 (N. Asencio) add parallel code
 !!
-!!    EXTERNAL
-!!    --------
-!!    OPEN_ll  ! attribute a free I/O unit
-USE MODE_IO_ll
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -76,34 +76,43 @@ USE MODE_IO_ll
 !
 !*       0.     DECLARATIONS
 !               ------------
+!
+USE MODD_IO_ll,            ONLY: TFILEDATA
+!
+USE MODE_FM,               ONLY: IO_FILE_OPEN_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+!
 IMPLICIT NONE
 !
 !*      0.1    declarations of arguments
 !
-CHARACTER(LEN=*), INTENT(IN) :: HCHEM_INPUT_FILE ! general purpose input file
-CHARACTER(LEN=*), INTENT(IN) :: HKEYWORD         ! keyword for positioning
-INTEGER         , INTENT(OUT):: KCHANNEL         ! I/O channel to choose
-INTEGER,          INTENT(IN) :: KLUOUT           ! output listing channel
-INTEGER,          INTENT(IN) :: KVERB            ! verbosity level
+CHARACTER(LEN=*),        INTENT(IN)  :: HCHEM_INPUT_FILE ! general purpose input file
+CHARACTER(LEN=*),        INTENT(IN)  :: HKEYWORD         ! keyword for positioning
+TYPE(TFILEDATA),POINTER, INTENT(OUT) :: TPFILE           ! Newly opened file
+INTEGER,                 INTENT(IN)  :: KLUOUT           ! output listing channel
+INTEGER,                 INTENT(IN)  :: KVERB            ! verbosity level
 !
 !*      0.2    declarations of local variables
 !
 CHARACTER(LEN=79) :: YIN ! character string for line-by-line read
-INTEGER :: IFAIL         ! return code from OPEN_ll
+INTEGER :: ILU
+INTEGER :: IRESP         ! return code from OPEN_ll
 !
 !-------------------------------------------------------------------------------
 !
+TPFILE => NULL()
 !
 !*       1.    FIND A FREE I/O CHANNEL
 !              -----------------------
 !
 IF (KVERB >= 5) WRITE(KLUOUT,*) "CH_OPEN_INPUT: opening file ", HCHEM_INPUT_FILE
-CALL OPEN_ll(UNIT=KCHANNEL,FILE=HCHEM_INPUT_FILE,IOSTAT=IFAIL ,MODE='GLOBAL',  &
-             POSITION='REWIND', ACTION='READ', STATUS='OLD', FORM='FORMATTED')
+CALL IO_FILE_ADD2LIST(TPFILE,HCHEM_INPUT_FILE,'CHEMINPUT','READ',OOLD=.TRUE.)
+CALL IO_FILE_OPEN_ll(TPFILE,KRESP=IRESP)
+ILU = TPFILE%NLU
 !
-IF (IFAIL /= 0) THEN
+IF (IRESP /= 0) THEN
   WRITE(KLUOUT,*) "CH_OPEN_INPUT ERROR: unable to open file", HCHEM_INPUT_FILE
-  WRITE(KLUOUT,*) "                     OPEN_ll return code is: ", IFAIL
+  WRITE(KLUOUT,*) "                     IO_FILE_OPEN_ll return code is: ", IRESP
   WRITE(KLUOUT,*) "                     the program will be stopped now"
   ! callabortstop
   CALL ABORT
@@ -116,23 +125,23 @@ END IF
 !              --------------------------------------
 !
 ! open the input file
-REWIND(KCHANNEL)
-WRITE(KLUOUT,*) "CH_OPEN_INPUT: opened channel ", KCHANNEL, &
+REWIND(ILU)
+WRITE(KLUOUT,*) "CH_OPEN_INPUT: opened channel ", ILU, &
                 " for file ", HCHEM_INPUT_FILE
 !
 ! read general comment line and print it
-READ(KCHANNEL,"(A)") YIN
+READ(ILU,"(A)") YIN
 IF (KVERB >= 5) WRITE(KLUOUT, *) YIN
 !
 search_key : DO
-  READ(KCHANNEL,"(A8)", END=100) YIN
+  READ(ILU,"(A8)", END=100) YIN
   IF (HKEYWORD(1:8) .EQ. YIN(1:8)) EXIT search_key
 ENDDO search_key
 !
 ! read specific comment line and print it
 IF (KVERB >= 5) WRITE(KLUOUT,*) &
    "Keyword ", HKEYWORD(1:8), " has been found, the specific comment is:"
-READ(KCHANNEL,"(A)") YIN
+READ(ILU,"(A)") YIN
 IF (KVERB >= 5) WRITE(KLUOUT, *) YIN
 !
 RETURN
diff --git a/src/MNH/ch_read_chem.f90 b/src/MNH/ch_read_chem.f90
index edf49a458..b37d01f02 100644
--- a/src/MNH/ch_read_chem.f90
+++ b/src/MNH/ch_read_chem.f90
@@ -65,7 +65,8 @@ END MODULE MODI_CH_READ_CHEM
 !!    --------
 USE MODI_CH_OPEN_INPUT
 USE MODI_CH_READ_VECTOR
-USE MODE_IO_ll
+USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_FM,    ONLY: IO_FILE_CLOSE_ll
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
@@ -89,10 +90,12 @@ CHARACTER(LEN=80) :: YINPUT
 INTEGER :: JI, JJ, IIN
 REAL :: ZMD
 REAL, DIMENSION(NSP+NCARB+NSOA) :: ZMI ! aerosol molecular mass in g/mol
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !*    EXECUTABLE STATEMENTS
 !     ---------------------
 !
+TZFILE => NULL()
 !
 ! if the namelist file is the input file, position file pointer after keyword
 !
@@ -102,12 +105,13 @@ IF (HFILE(1:14) .EQ. "CHCONTROL1.nam") THEN
 !
 ! open the namelist file for input
 !
-  CALL CH_OPEN_INPUT("CHCONTROL1.nam", "INITCHEM", IIN, 6, NVERB)
+  CALL CH_OPEN_INPUT("CHCONTROL1.nam", "INITCHEM", TZFILE, 6, NVERB)
+  IIN = TZFILE%NLU
 !
   CALL CH_READ_VECTOR(NEQ, CNAMES, PCONC, 0.0, IIN, 6, NVERB)
   IF (LORILAM) CALL CH_READ_VECTOR(SIZE(PAERO,1), CAERONAMES, PAERO, 0.0, IIN, 6, NVERB)
 !
-  CALL CLOSE_LL("CHCONTROL1.nam")
+  CALL IO_FILE_CLOSE_ll(TZFILE)
 !
 ELSE
 !
diff --git a/src/MNH/ch_read_meteo.f90 b/src/MNH/ch_read_meteo.f90
index 845924b36..f0132c59c 100644
--- a/src/MNH/ch_read_meteo.f90
+++ b/src/MNH/ch_read_meteo.f90
@@ -47,7 +47,7 @@ END MODULE MODI_CH_READ_METEO
 !!
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
-USE MODD_CH_MODEL0D,  ONLY: NMETEOIO, XTNEXTMETEO, NVERB
+USE MODD_CH_MODEL0D,  ONLY: TMETEOFILE, XTNEXTMETEO, NVERB
 USE MODD_CH_M9_n,     ONLY: NMETEOVARS, METEOTRANSTYPE
 !!
 !------------------------------------------------------------------------------
@@ -70,8 +70,8 @@ INTEGER :: JI   ! loop control
 !     ---------------------
 !
 ! read meteo variables and time of next update
-READ(NMETEOIO,*) (TPM%XMETEOVAR(JI), JI = 1, NMETEOVARS)
-READ(NMETEOIO,*) XTNEXTMETEO
+READ(TMETEOFILE%NLU,*) (TPM%XMETEOVAR(JI), JI = 1, NMETEOVARS)
+READ(TMETEOFILE%NLU,*) XTNEXTMETEO
 !
 ! print what has been read
 IF (NVERB >= 7) THEN
diff --git a/src/MNH/ch_surface0d.f90 b/src/MNH/ch_surface0d.f90
index 4a58b3e56..ca58d61ae 100644
--- a/src/MNH/ch_surface0d.f90
+++ b/src/MNH/ch_surface0d.f90
@@ -253,7 +253,10 @@ CONTAINS
 !
 SUBROUTINE CH_SURFACE0D_SETPARAM
 !
-IMPLiCIT NONE
+USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_FM,    ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
+!
+IMPLICIT NONE
 !
 ! set the input parameters for CH_DEPOSITION_FLUX that are given
 ! in the 3-D model by MesoNH
@@ -286,6 +289,7 @@ LOGICAL, SAVE :: LSFIRSTCALL = .TRUE.
 REAL, SAVE :: USTAR_PATCH, USTAR_SEA, USTAR_WATER, USTAR_TOWN,&
               RESA_SEA, RESA_WATER, RESA_TOWN,                &
               HU_PATCH, PSN_PATCH
+TYPE(TFILEDATA),POINTER,SAVE :: TZFILE => NULL()
 !
 NAMELIST /NAM_SURF/ VMOD, RHODREF, RS, THT2D, PABST2D, CD,              &
                     CLAY, SAND, LAND, VEG, LAI, SST, TS, HU,            &
@@ -297,13 +301,17 @@ NAMELIST /NAM_SURF/ VMOD, RHODREF, RS, THT2D, PABST2D, CD,              &
 IF (LSFIRSTCALL) THEN
 !
   LSFIRSTCALL = .FALSE.
-  CALL CH_OPEN_INPUT("SURFACE.nam", "SURFDATA", ISURFIO, 6, NVERB)
+  CALL CH_OPEN_INPUT("SURFACE.nam", "SURFDATA", TZFILE, 6, NVERB)
+  ISURFIO = TZFILE%NLU
+  CALL IO_FILE_CLOSE_ll(TZFILE)
 !
 END IF
 !
 IF (PTSIMUL .GE. TNEXTUPDATE) THEN
-  PRINT *, "updating surface variables from file CHCONTROL1.nam"
+  PRINT *, "updating surface variables from file ",TRIM(TZFILE%CNAME)
+  CALL IO_FILE_OPEN_ll(TZFILE)
   READ(ISURFIO,NAM_SURF)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
   ! PRINT *, "current setting is:"
   ! WRITE(*,NAM_SURF)
   TNEXTUPDATE = PTSIMUL + TVALID
diff --git a/src/MNH/close_file_mnh.f90 b/src/MNH/close_file_mnh.f90
index 59b5f2c27..e3a76b891 100644
--- a/src/MNH/close_file_mnh.f90
+++ b/src/MNH/close_file_mnh.f90
@@ -58,6 +58,7 @@ END MODULE MODI_CLOSE_FILE_MNH
 !              ------------
 !
 USE MODD_CONF,             ONLY: CPROGRAM
+USE MODD_IO_ll,            ONLY: TFILEDATA
 USE MODD_IO_NAM,           ONLY: TFILE
 USE MODD_LUNIT,            ONLY: CLUOUT0
 !
@@ -83,6 +84,7 @@ INTEGER           :: IRESP          ! IRESP  : return-code if a problem appears
 INTEGER           :: IMI            ! model index
 INTEGER           :: ILUOUT         ! output listing logical unit
 CHARACTER(LEN=16) :: YLUOUT         ! output listing file name
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
 !
 SELECT CASE(CPROGRAM)
@@ -103,7 +105,9 @@ END SELECT
 CALL FMLOOK_ll(YLUOUT,YLUOUT,ILUOUT,IRESP)
 IF (ILUOUT==KUNIT) THEN
   CALL PRINT_MSG(NVERB_DEBUG,'IO','CLOSE_FILE_MNH','called for '//TRIM(YLUOUT))
-  CALL CLOSE_ll(YLUOUT,IRESP)
+  TZFILE => NULL()
+  CALL IO_FILE_FIND_BYNAME(YLUOUT,TZFILE,IRESP)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
   RETURN
 END IF
 !
diff --git a/src/MNH/gps_zenith.f90 b/src/MNH/gps_zenith.f90
index 7bfd24d9c..7e2654538 100644
--- a/src/MNH/gps_zenith.f90
+++ b/src/MNH/gps_zenith.f90
@@ -77,20 +77,23 @@ END MODULE MODI_GPS_ZENITH
 !              ------------
 !
 !
-USE MODD_PARAMETERS
-USE MODD_LUNIT
 USE MODD_CST
-USE MODE_FM
-USE MODD_GR_FIELD_n
 USE MODD_DIAG_FLAG
-USE MODD_GRID, ONLY: XLONORI,XLATORI
+USE MODD_GR_FIELD_n
+USE MODD_GRID,             ONLY: XLONORI,XLATORI
 USE MODD_GRID_n
 USE MODE_GRIDPROJ
-USE MODE_IO_ll
-USE MODE_ll
+USE MODD_IO_ll,            ONLY: TFILEDATA
+USE MODD_LUNIT
+USE MODD_PARAMETERS
+!
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+USE MODE_TOOLS_ll,         ONLY: LWEST_ll, LEAST_ll, LNORTH_ll, LSOUTH_ll
 !
 USE MODI_INTERPOL_STATION
 !
+!
 IMPLICIT NONE
 !
 !
@@ -150,13 +153,15 @@ REAL, DIMENSION(:), ALLOCATABLE ::ZXHAT_GPS, ZYHAT_GPS
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZZ_STA
 REAL, DIMENSION(:),ALLOCATABLE :: ZGPS_ZTD, ZGPS_ZHD, ZGPS_ZWD
 REAL, DIMENSION(:),ALLOCATABLE :: ZE_STA, ZP_STA, ZT_STA, ZTV_STA
-!  
+!--------- Misc --------------------------------------------------------------
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
 !
 !*       1.     INTIALIZE DIMENSIONS AND ALLOCATE ARRAYS
 !               ----------------------------------------
 !
-CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
+ILUOUT0 = TLUOUT0%NLU
+TZFILE => NULL()
 CALL GET_INDICE_ll(IIB,IJB,IIE,IJE)
 IIU = SIZE (PTEMP,1)
 IJU = SIZE (PTEMP,2)
@@ -273,8 +278,9 @@ PRINT *,'Number of GPS STATIONS ', ISTATIONS
 !
 IF (ISTATIONS >0 ) THEN 
 !
-  CALL OPEN_ll(UNIT=IFGRI,FILE=HFGRI,IOSTAT=IRESP,FORM='FORMATTED', &
-               ACTION='WRITE',MODE='SPECIFIC') 
+  CALL IO_FILE_ADD2LIST(TZFILE,HFGRI,'GPS','WRITE')
+  CALL IO_FILE_OPEN_ll(TZFILE)
+  IFGRI = TZFILE%NLU
   PRINT *,'File ',TRIM(HFGRI),' opened with unit= ',IFGRI,' IRESP= ',IRESP
   WRITE(IFGRI,*,IOSTAT=IRESP) 'Number of STATIONS', ISTATIONS
 ! 
@@ -429,7 +435,7 @@ IF (ISTATIONS >0 ) THEN
 !
   1000 FORMAT('STATION ',A10,' ZHD: ',F8.5,' ZWD: ',F8.5,' ZTD: ',F8.5)
 ! 
-  CALL CLOSE_ll(HFGRI,IRESP)
+  CALL IO_FILE_CLOSE_ll(TZFILE,IRESP)
   PRINT *,'File ',TRIM(HFGRI),' closed, IRESP= ',IRESP
 !
   DEALLOCATE(ZXHATM)
diff --git a/src/MNH/ini_aircraft_balloon.f90 b/src/MNH/ini_aircraft_balloon.f90
index 2fb8a7241..c9cd97b66 100644
--- a/src/MNH/ini_aircraft_balloon.f90
+++ b/src/MNH/ini_aircraft_balloon.f90
@@ -620,9 +620,7 @@ IF (TPFLYER%SEG==0) THEN
   WRITE(ILUOUT,*) 'TPAIRCRAFT%SEG=',TPFLYER%SEG
   WRITE(ILUOUT,*) 'Check your INI_AIRCRAFT routine'
 !callabortstop
-  CALL CLOSE_ll(HLUOUT,IOSTAT=IRESP)
-  CALL ABORT
-  STOP
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','INI_FLIGHT','')
 END IF
 !
 IF ( ANY(TPFLYER%SEGLAT(:)==XUNDEF) .OR. ANY(TPFLYER%SEGLON(:)==XUNDEF) ) THEN
diff --git a/src/MNH/mnh2lpdm.f90 b/src/MNH/mnh2lpdm.f90
index 5222ada3e..16535735c 100644
--- a/src/MNH/mnh2lpdm.f90
+++ b/src/MNH/mnh2lpdm.f90
@@ -22,18 +22,18 @@
 !
 !*	0.1 Modules.
 !
+USE MODD_CONF,             ONLY : CPROGRAM
+USE MODD_IO_ll,            ONLY : TFILEDATA,TPTR2FILE
 USE MODD_MNH2LPDM
-USE MODD_CONF, ONLY : CPROGRAM
-USE MODD_IO_ll,ONLY : TFILEDATA,TPTR2FILE
 !
-USE MODE_FM
-USE MODE_IO_ll
+USE MODE_FM,               ONLY: IO_FILE_OPEN_ll,IO_FILE_CLOSE_ll
+USE MODE_IO_ll,            ONLY: INITIO_ll,SET_CONFIO_ll
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 USE MODE_MODELN_HANDLER
 USE MODE_POS
 !
-USE MODI_MNH2LPDM_INI
 USE MODI_MNH2LPDM_ECH
+USE MODI_MNH2LPDM_INI
 !
 USE MODN_CONFIO
 !
@@ -42,13 +42,19 @@ USE MODN_CONFIO
 !
 IMPLICIT NONE
 !
-CHARACTER(LEN=28) :: YFNML,YFLOG        ! Nom   NAMELIST et LOG.
-INTEGER           :: IFNML,IFLOG        ! Unite NAMELIST et LOG.
-INTEGER           :: IFMTO,IFGRI,IFDAT  ! Unite METEO et GRILLE.
-INTEGER           :: IREP,IVERB,JFIC
-LOGICAL :: GFOUND         ! Return code when searching namelist
+CHARACTER(LEN=*),PARAMETER :: YFLOG = 'METEO.log'     ! Log filename
+CHARACTER(LEN=*),PARAMETER :: YFNML = 'MNH2LPDM1.nam' ! Namelist filename
+INTEGER,         PARAMETER :: IVERB = 5
+!
+INTEGER :: IFNML  ! Unit of namelist
+INTEGER :: JFIC
+LOGICAL :: GFOUND ! Return code when searching namelist
 TYPE(TPTR2FILE),DIMENSION(JPMNHMAX) :: TZFMNH  ! MesoNH files
-TYPE(TFILEDATA),POINTER :: TZNMLFILE  => NULL() ! Namelist file
+TYPE(TFILEDATA),POINTER :: TZDATEFILE  => NULL() ! Date file
+TYPE(TFILEDATA),POINTER :: TZGRIDFILE  => NULL() ! Grid file
+TYPE(TFILEDATA),POINTER :: TZMETEOFILE => NULL() ! Meteo file
+TYPE(TFILEDATA),POINTER :: TZLOGFILE   => NULL() ! Log file
+TYPE(TFILEDATA),POINTER :: TZNMLFILE   => NULL() ! Namelist file
 !
 !
 !
@@ -61,10 +67,7 @@ CALL GOTO_MODEL(1)
 !
 !*	1.1 Variables generales.
 !
-YFLOG    = 'METEO.log'
-YFNML    = 'MNH2LPDM1.nam'
-IVERB    =  5
- CFMNH(:) = 'VIDE'
+ CFMNH(:) = ''
 !
 !
 !*	1.2 Initialisation routines LL.
@@ -74,8 +77,8 @@ CALL INITIO_ll()
 !
 !*	1.3 Ouverture du fichier log.
 !
-CALL OPEN_LL(UNIT=IFLOG,FILE=YFLOG,IOSTAT=IREP,FORM='FORMATTED', &
-     ACTION='WRITE',MODE='GLOBAL')
+CALL IO_FILE_ADD2LIST(TZLOGFILE,YFLOG,'TXT','WRITE')
+CALL IO_FILE_OPEN_ll(TZLOGFILE)
 !
 !
 !*	1.4 Lecture des namelists.
@@ -101,7 +104,7 @@ CALL IO_FILE_CLOSE_ll(TZNMLFILE)
 !
 !*	1.5 Comptage des FM a traiter.
 !
-IF (CFMNH(1).NE.'VIDE') THEN
+IF (LEN_TRIM(CFMNH(1))>0) THEN
    NBMNH=1
    CALL IO_FILE_ADD2LIST(TZFMNH(1)%TZFILE,TRIM(CFMNH(1)),'UNKNOWN','READ',KLFITYPE=2,KLFIVERB=IVERB)
    DO WHILE (CFMNH(NBMNH+1).NE.'VIDE')
@@ -121,34 +124,35 @@ ENDIF
 !
 !*	2.1 Ouverture des fichiers METEO et GRILLE et DATE.
 !
-CALL OPEN_LL(UNIT=IFGRI,FILE=CFGRI,IOSTAT=IREP,FORM='FORMATTED', &
-  ACTION='WRITE',MODE='GLOBAL')
-CALL OPEN_LL(UNIT=IFDAT,FILE=CFDAT,IOSTAT=IREP,FORM='FORMATTED', &
-  ACTION='WRITE',MODE='GLOBAL')
+CALL IO_FILE_ADD2LIST(TZGRIDFILE,CFGRI,'TXT','WRITE')
+CALL IO_FILE_OPEN_ll(TZGRIDFILE)
+CALL IO_FILE_ADD2LIST(TZDATEFILE,CFDAT,'TXT','WRITE')
+CALL IO_FILE_OPEN_ll(TZDATEFILE)
 !
 !
 !*	2.2 Preparation du couplage.
 !
-CALL MNH2LPDM_INI(TZFMNH(1)%TZFILE,TZFMNH(NBMNH)%TZFILE,YFLOG,IFLOG,IFGRI,IFDAT)
+CALL MNH2LPDM_INI(TZFMNH(1)%TZFILE,TZFMNH(NBMNH)%TZFILE,TZLOGFILE,TZGRIDFILE,TZDATEFILE)
 !
 !
 !*	2.3 Traitement des echeances.
 !
 DO JFIC=1,NBMNH
    print*,"CFMTO(JFIC)=",CFMTO(JFIC)
-   CALL OPEN_LL(UNIT=IFMTO,FILE=CFMTO(JFIC),IOSTAT=IREP,FORM='UNFORMATTED', &
-      ACTION='WRITE',MODE='GLOBAL',RECL=100000000)
-   CALL MNH2LPDM_ECH(TZFMNH(JFIC)%TZFILE,IFMTO,YFLOG)
+   CALL IO_FILE_ADD2LIST(TZMETEOFILE,CFMTO(JFIC),'METEO','WRITE')
+   CALL IO_FILE_OPEN_ll(TZMETEOFILE)
+   CALL MNH2LPDM_ECH(TZFMNH(JFIC)%TZFILE,TZMETEOFILE)
    print*,"CLOSE_LL(CFMTO(JFIC)"
-   CALL CLOSE_LL(CFMTO(JFIC),IREP,'KEEP')
+   CALL IO_FILE_CLOSE_ll(TZMETEOFILE)
+   TZMETEOFILE => NULL()
 END DO
 !
 !
 !*	2.4 Fermeture des fichiers, METEO, GRILLE et LOG.
 !
-CALL CLOSE_LL(CFGRI,IREP,'KEEP')
-CALL CLOSE_LL(CFDAT,IREP,'KEEP')
-CALL CLOSE_LL(YFLOG,IREP,'KEEP')
+CALL IO_FILE_CLOSE_ll(TZGRIDFILE)
+CALL IO_FILE_CLOSE_ll(TZDATEFILE)
+CALL IO_FILE_CLOSE_ll(TZLOGFILE)
 !
 !
 !
diff --git a/src/MNH/mnh2lpdm_ech.f90 b/src/MNH/mnh2lpdm_ech.f90
index 5e572edb5..d93a11bc7 100644
--- a/src/MNH/mnh2lpdm_ech.f90
+++ b/src/MNH/mnh2lpdm_ech.f90
@@ -3,7 +3,7 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ######spl
-        SUBROUTINE MNH2LPDM_ECH(TPFILE,KFMTO,HFLOG)
+        SUBROUTINE MNH2LPDM_ECH(TPFILE,TPMETEOFILE)
 !	##################################################
 !-----------------------------------------------------------------------
 !****	MNH2S2_ECH TRAITEMENT D'UNE ECHEANCE.
@@ -30,9 +30,9 @@ USE MODD_TIME
 !
 USE MODD_MNH2LPDM
 !
-USE MODE_FM
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
 USE MODE_FMREAD
-USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 !
 USE MODI_INI_CST
 !
@@ -42,19 +42,19 @@ IMPLICIT NONE
 !*	0.2 Arguments.
 !
 TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE
-CHARACTER(LEN=*),       INTENT(IN)    :: HFLOG
-INTEGER,                INTENT(IN)    :: KFMTO
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPMETEOFILE
 !
 !
 !*	0.3 Variables locales.
 !
 CHARACTER(LEN=100)   :: YFTURB                       ! Stockage champs de turbulence.
-INTEGER              :: KFTURB
-INTEGER              :: IREP
+INTEGER              :: IFTURB
+INTEGER              :: IFMTO,IREP
 INTEGER              :: ICURAA,ICURMM,ICURJJ         ! Date  courante.
 INTEGER              :: ICURHH,ICURMN,ICURSS         ! Heure courante.
 INTEGER              :: JI,JJ,JK
 TYPE(DATE_TIME)      :: TZDTCUR
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !
 !
@@ -64,6 +64,8 @@ TYPE(DATE_TIME)      :: TZDTCUR
 !
 !*	1.1 Blabla.
 !
+TZFILE => NULL()
+IFMTO = TPMETEOFILE%NLU
 !
 !*	2.  LECTURE DES DONNEES MESO-NH DE BASE.
 !	    ------------------------------------
@@ -370,29 +372,29 @@ XSSFV(:,:) = XSFV(NSIB:NSIE,NSJB:NSJE)
   !
      IF (IGRILLE.EQ.2) THEN
      WRITE(YFTURB,'("TURB_LPDM",5I2.2)') ICURAA,ICURMM,ICURJJ,ICURHH,ICURMN
-     KFTURB=50
-     CALL OPEN_LL(UNIT=KFTURB,FILE=YFTURB,IOSTAT=IREP,FORM='FORMATTED', &
-      ACTION='WRITE',MODE='GLOBAL')
-     WRITE(UNIT=KFTURB,FMT='(5A12)') "WSTAR       ","USTAR       ", &
+     CALL IO_FILE_ADD2LIST(TZFILE,YFTURB,'TXT','WRITE')
+     CALL IO_FILE_OPEN_ll(TZFILE)
+     IFTURB = TZFILE%NLU
+     WRITE(UNIT=IFTURB,FMT='(5A12)') "WSTAR       ","USTAR       ", &
                                      "HMIX        ","LMO         ", &
                                      "WPTHP"
-     WRITE(UNIT=KFTURB,FMT='(5F12.5)') XSWSTAR(15,15),XSUSTAR(15,15), &
+     WRITE(UNIT=IFTURB,FMT='(5F12.5)') XSWSTAR(15,15),XSUSTAR(15,15), &
                                        XSHMIX(15,15),XSLMO(15,15),    &
                                        XSWPTHP(15,15,1)
 
 
-     WRITE(UNIT=KFTURB,FMT='(8A12)') "HAUT          ","TKE           ", &
+     WRITE(UNIT=IFTURB,FMT='(8A12)') "HAUT          ","TKE           ", &
                                      "DISS          ","THETA         ", &
                                      "SIGU          ","SIGW          ", &
                                      "TIMEU         ","TIMEW         "
      DO JK=1,NKMAX
-     WRITE(UNIT=KFTURB,FMT='(6F12.5,2F12.1)') XSHAUT(JK),XSTKE(15,15,JK), &
+     WRITE(UNIT=IFTURB,FMT='(6F12.5,2F12.1)') XSHAUT(JK),XSTKE(15,15,JK), &
                                     XSDISSIP(15,15,JK),XSTH(15,15,JK), &
                                     XSSIGU(15,15,JK),XSSIGW(15,15,JK), &
                                     XSTIMEU(15,15,JK),XSTIMEW(15,15,JK)
   
      ENDDO
-     CALL CLOSE_LL(YFTURB,IREP,'KEEP')
+     CALL IO_FILE_CLOSE_ll(TZFILE)
      ENDIF
 !
                
@@ -403,38 +405,38 @@ XSSFV(:,:) = XSFV(NSIB:NSIE,NSJB:NSJE)
 !
 !
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSU(:,:,JK)        ! Composante zonale du vent.
+WRITE(IFMTO) XSU(:,:,JK)        ! Composante zonale du vent.
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSV(:,:,JK)        ! Composante meridienne du vent.
+WRITE(IFMTO) XSV(:,:,JK)        ! Composante meridienne du vent.
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSW(:,:,JK)        ! Vitesse verticale.
+WRITE(IFMTO) XSW(:,:,JK)        ! Vitesse verticale.
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSTH(:,:,JK)     ! Temperature potentielle.
+WRITE(IFMTO) XSTH(:,:,JK)     ! Temperature potentielle.
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSTKE(:,:,JK)       ! Energie cinetique Turbulence
+WRITE(IFMTO) XSTKE(:,:,JK)       ! Energie cinetique Turbulence
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) (XSSIGU(:,:,JK))**2       ! SigmaU
+WRITE(IFMTO) (XSSIGU(:,:,JK))**2       ! SigmaU
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) (XSSIGU(:,:,JK))**2       ! SigmaV
+WRITE(IFMTO) (XSSIGU(:,:,JK))**2       ! SigmaV
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) (XSSIGW(:,:,JK))**2       ! SigmaW
+WRITE(IFMTO) (XSSIGW(:,:,JK))**2       ! SigmaW
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien U
+WRITE(IFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien U
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien V
+WRITE(IFMTO) XSTIMEU(:,:,JK)       ! Temps lagrangien V
 ENDDO
 DO JK = 1,NKMAX
-WRITE(KFMTO) XSTIMEW(:,:,JK)       ! Dissipation de TKE
+WRITE(IFMTO) XSTIMEW(:,:,JK)       ! Dissipation de TKE
 ENDDO
-WRITE(KFMTO) XSINRT
+WRITE(IFMTO) XSINRT
 !
 END SUBROUTINE MNH2LPDM_ECH
diff --git a/src/MNH/mnh2lpdm_ini.f90 b/src/MNH/mnh2lpdm_ini.f90
index 2f559062e..d91ef88d9 100644
--- a/src/MNH/mnh2lpdm_ini.f90
+++ b/src/MNH/mnh2lpdm_ini.f90
@@ -3,7 +3,7 @@
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt  
 !MNH_LIC for details. version 1.
 !     ######spl
-        SUBROUTINE MNH2LPDM_INI(TPFILE1,TPFILE2,HFLOG,KFLOG,KFGRI,KFDAT)
+        SUBROUTINE MNH2LPDM_INI(TPFILE1,TPFILE2,TPLOGFILE,TPGRIDFILE,TPDATEFILE)
 !--------------------------------------------------------------------------
 !* MNH2S2_INI    : INITIALISATION DU COUPLAGE MESO-NH / LPDM.
 !
@@ -13,11 +13,10 @@
 !
 !	Arguments explicites.
 !	---------------------
-!	HFM1,HFM2     Nom du premier et du dernier Fichier FM à traiter.
-!	HFLOG   Nom du fichier-log.
-!	KFLOG   Unite logique du fichier-log.
-!	IFGRI   Unite logique du fichier GRILLE.
-!       IFDAT   Unite logique du fichier DATE
+! TPFILE1,TPFILE2 First and last files to treat
+! TPLOGFILE       Log file
+! TPGRIDFILE      Grid file
+! TPDATEFILE      Date file
 !
 !--------------------------------------------------------------------------
 !
@@ -55,8 +54,9 @@ USE MODI_TEMPORAL_DIST
 IMPLICIT NONE
 !
 TYPE(TFILEDATA),POINTER,INTENT(INOUT) :: TPFILE1,TPFILE2
-CHARACTER(LEN=*),       INTENT(IN)    :: HFLOG
-INTEGER,                INTENT(IN)    :: KFLOG,KFGRI,KFDAT
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPLOGFILE
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPGRIDFILE
+TYPE(TFILEDATA),POINTER,INTENT(IN)    :: TPDATEFILE
 !
 !
 !*	0.3 Variables locales.
@@ -70,7 +70,6 @@ INTEGER               :: IHHCUR1,IMNCUR1,ISSCUR1
 INTEGER               :: IHHCUR2,IMNCUR2,ISSCUR2
 CHARACTER(LEN=14)     :: YDATMDL,YDATCUR1,YDATCUR2
 !
-INTEGER               :: IREP
 REAL                  :: XLATOR,XLONOR,XPTLAT,XPTLON
 REAL                  :: XXPTSOMNH,XYPTSOMNH
 INTEGER               :: JI,JJ,JK,a
@@ -78,12 +77,17 @@ INTEGER               :: b,c,I
 INTEGER, DIMENSION(:),   ALLOCATABLE   :: TAB1D
 INTEGER, DIMENSION(:,:), ALLOCATABLE   :: TAB2D
 TYPE(DATE_TIME)         :: TZDTCUR1,TZDTCUR2,TZDTEXP1
+INTEGER                :: IFDAT,IFGRI,IFLOG
 !
 !
 !
 !*	1.  INITIALISATION.
 !	    ---------------
 !
+IFDAT = TPDATEFILE%NLU
+IFGRI = TPGRIDFILE%NLU
+IFLOG = TPLOGFILE%NLU
+!
 CALL INI_CST
 !
 CALL GOTO_MODEL(1)
@@ -163,7 +167,7 @@ NJE=NJU-JPHEXT
 !*	2.4 Nombre de niveaux-verticaux.
 !
 CALL IO_READ_FIELD(TPFILE1,'KMAX',NKMAX)
-!WRITE(KFLOG,*) '%%% MNH2S2_INI Lecture du nombre de niveau OK.'
+!WRITE(IFLOG,*) '%%% MNH2S2_INI Lecture du nombre de niveau OK.'
 !
 NKU = NKMAX+2*JPVEXT
 NKB = 1+JPVEXT
@@ -225,36 +229,36 @@ NSJMAX = NSJE-NSJB+1
 !           Domaine horizontal Meso-NH.
 !modif 12.2014 : passage a 1 seul domaine MesoNH
 !           ---------------------------
-WRITE(KFLOG,'(I1,a12)') IGRILLE,'      ngrid '
-!WRITE(KFLOG,'(a13)') '2      ngrids'
-WRITE(KFLOG,'(a13)') '1      ngrids'
-WRITE(KFLOG,'(i4,3x,a6)') NSIMAX,'nx    '
-WRITE(KFLOG,'(i4,3x,a6)') NSJMAX,'ny    '
-WRITE(KFLOG,'(i4,3x,a6)') NKU-2,'nz    '
-WRITE(KFLOG,'(i4,3x,a6)') NKU-3,'nzg   ' 
-WRITE(KFLOG,'(a13)') '12     npatch'
-WRITE(KFLOG,'(a13)') '0      icloud'
-WRITE(KFLOG,'(a11)') '0.0  wlon  '
-WRITE(KFLOG,'(a11)') '45.0 rnlat '
-WRITE(KFLOG,'(f10.1,3x,a6)') XZHAT(NKE),'s     '
-WRITE(KFLOG,'(f8.0,a8)') ZECHEANCE1,'  time1 '
-WRITE(KFLOG,'(f8.0,a8)') ZECHEANCE2,'  time2 '
-WRITE(KFLOG,'(a13)') '3600    dtmet '
-WRITE(KFLOG,'(a13)') 'm       tunits'
-WRITE(KFLOG,'(a13)') '12     nvout '
-WRITE(KFLOG,'(6x,a8,i4)') 'u       ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'v       ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'w       ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'tp      ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'tke     ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'uu      ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'vv      ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'ww      ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'tlx     ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'tly     ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'tlz     ',1
-WRITE(KFLOG,'(6x,a8,i4)') 'intopr  ',1
-WRITE(KFLOG,*) '  grid structure'
+WRITE(IFLOG,'(I1,a12)') IGRILLE,'      ngrid '
+!WRITE(IFLOG,'(a13)') '2      ngrids'
+WRITE(IFLOG,'(a13)') '1      ngrids'
+WRITE(IFLOG,'(i4,3x,a6)') NSIMAX,'nx    '
+WRITE(IFLOG,'(i4,3x,a6)') NSJMAX,'ny    '
+WRITE(IFLOG,'(i4,3x,a6)') NKU-2,'nz    '
+WRITE(IFLOG,'(i4,3x,a6)') NKU-3,'nzg   ' 
+WRITE(IFLOG,'(a13)') '12     npatch'
+WRITE(IFLOG,'(a13)') '0      icloud'
+WRITE(IFLOG,'(a11)') '0.0  wlon  '
+WRITE(IFLOG,'(a11)') '45.0 rnlat '
+WRITE(IFLOG,'(f10.1,3x,a6)') XZHAT(NKE),'s     '
+WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE1,'  time1 '
+WRITE(IFLOG,'(f8.0,a8)') ZECHEANCE2,'  time2 '
+WRITE(IFLOG,'(a13)') '3600    dtmet '
+WRITE(IFLOG,'(a13)') 'm       tunits'
+WRITE(IFLOG,'(a13)') '12     nvout '
+WRITE(IFLOG,'(6x,a8,i4)') 'u       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'v       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'w       ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tp      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tke     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'uu      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'vv      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'ww      ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tlx     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tly     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'tlz     ',1
+WRITE(IFLOG,'(6x,a8,i4)') 'intopr  ',1
+WRITE(IFLOG,*) '  grid structure'
 !
 !*	4.  FICHIER METEO.
 !	    --------------
@@ -341,9 +345,9 @@ print*,MINVAL(XSZ0),MAXVAL(XSZ0)
 !* 5   FICHIER DATES.
 !      -------------
 !
-WRITE(KFDAT,'(A14)') YDATMDL 
-WRITE(KFDAT,'(A14)') YDATCUR1 
-WRITE(KFDAT,'(A14)') YDATCUR2
+WRITE(IFDAT,'(A14)') YDATMDL 
+WRITE(IFDAT,'(A14)') YDATCUR1 
+WRITE(IFDAT,'(A14)') YDATCUR2
 !
 !* 5.  FICHIER GRILLE.
 !      --------------
@@ -351,21 +355,21 @@ WRITE(KFDAT,'(A14)') YDATCUR2
 !
 !* 5.1 Infos franchement utiles.
 !
-WRITE(KFGRI,'(F15.8,1X,A)') &
+WRITE(IFGRI,'(F15.8,1X,A)') &
                   XLON0,   'XLON0   Longitude reference (deg.deci.)'
-WRITE(KFGRI,'(F15.8,1X,A)') &
+WRITE(IFGRI,'(F15.8,1X,A)') &
                   XLAT0,   'XLAT0   Latitude  reference (deg.deci.)'
-WRITE(KFGRI,'(F15.8,1X,A)') &
+WRITE(IFGRI,'(F15.8,1X,A)') &
                   XBETA,   'XBETA   Rotation  grille    (deg.deci.)'
-WRITE(KFGRI,'(F15.8,1X,A)') XRPK,    'XRPK    Facteur de conicite'
-WRITE(KFGRI,'(F15.8,1X,A)') &
+WRITE(IFGRI,'(F15.8,1X,A)') XRPK,    'XRPK    Facteur de conicite'
+WRITE(IFGRI,'(F15.8,1X,A)') &
                   XLONOR,  'XLONOR  Longitude origine   (deg.deci.)'
-WRITE(KFGRI,'(F15.8,1X,A)') &
+WRITE(IFGRI,'(F15.8,1X,A)') &
                   XLATOR,  'XLATOR  Latitude  origine   (deg.deci.)'
-WRITE(KFGRI,'(F15.1,1X,A)') XXHAT(1),'XHAT(1) Coord. Cartesienne  (m)'
-WRITE(KFGRI,'(F15.1,1X,A)') XXHAT(2),'XHAT(2) Coord. Cartesienne  (m)'
-WRITE(KFGRI,'(F15.1,1X,A)') XYHAT(1),'YHAT(1) Coord. Cartesienne  (m)'
-WRITE(KFGRI,'(F15.1,1X,A)') XYHAT(2),'YHAT(2) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(1),'XHAT(1) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XXHAT(2),'XHAT(2) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(1),'YHAT(1) Coord. Cartesienne  (m)'
+WRITE(IFGRI,'(F15.1,1X,A)') XYHAT(2),'YHAT(2) Coord. Cartesienne  (m)'
 !
 print*,"GRILLE"
 print*,"LON0 : ",XLON0
@@ -377,19 +381,19 @@ print*,"LATOR: ",XLATOR
 !
 !* 5.2  Points de grille x y z zg
 !
-WRITE(KFLOG,*)NSIMAX,' gridpoints in x direction'
-WRITE(KFLOG,'(8f10.0)')XXHAT(NSIB:NSIE)
-WRITE(KFLOG,*)NSJMAX,' gridpoints y direction'
-WRITE(KFLOG,'(8f10.0)')XYHAT(NSJB:NSJE)
-WRITE(KFLOG,*)NKMAX,'  main gridpoints in z direction'
-WRITE(KFLOG,'(8f10.2)')XSHAUT(1:NKMAX)
-WRITE(KFLOG,'(i4,3x,a38)')NKU-2,'intermediate gridpoints in z direction'
-WRITE(KFLOG,'(8f10.2)')XZHAT(2:NKU-1)
-WRITE(KFLOG,*)'   =================================================='
+WRITE(IFLOG,*)NSIMAX,' gridpoints in x direction'
+WRITE(IFLOG,'(8f10.0)')XXHAT(NSIB:NSIE)
+WRITE(IFLOG,*)NSJMAX,' gridpoints y direction'
+WRITE(IFLOG,'(8f10.0)')XYHAT(NSJB:NSJE)
+WRITE(IFLOG,*)NKMAX,'  main gridpoints in z direction'
+WRITE(IFLOG,'(8f10.2)')XSHAUT(1:NKMAX)
+WRITE(IFLOG,'(i4,3x,a38)')NKU-2,'intermediate gridpoints in z direction'
+WRITE(IFLOG,'(8f10.2)')XZHAT(2:NKU-1)
+WRITE(IFLOG,*)'   =================================================='
 !
 !     Topographie
 !
-WRITE(KFLOG,*) 'TERRAIN TOPOGRAPHY'
+WRITE(IFLOG,*) 'TERRAIN TOPOGRAPHY'
 c=1
 a=0
 !modif 12/2014 : passage a une grille haute resolution MesoNH, on depasse 99
@@ -409,16 +413,16 @@ DO WHILE (c.lt.(NSIMAX+1))
   DO b=NSJB,NSJE
      IF ((c+17).LT.(NSIMAX+1)) then
         a=NSJMAX-b+NSJB
-        WRITE(KFLOG,300) a,TAB2D(c:c+17,a)
+        WRITE(IFLOG,300) a,TAB2D(c:c+17,a)
      ELSE  
         a=NSJMAX-b+NSJB
-        WRITE(KFLOG,300) a,TAB2D(c:NSIMAX,a)
+        WRITE(IFLOG,300) a,TAB2D(c:NSIMAX,a)
      ENDIF
   ENDDO
 IF ((c+17).LT.(NSIMAX+1)) then
-   WRITE(KFLOG,301) TAB1D(c:c+17)
+   WRITE(IFLOG,301) TAB1D(c:c+17)
 ELSE
-   WRITE(KFLOG,301) TAB1D(c:NSIMAX)
+   WRITE(IFLOG,301) TAB1D(c:NSIMAX)
 ENDIF
 
 c=c+18
diff --git a/src/MNH/mnhclose_write_cover_tex.f90 b/src/MNH/mnhclose_write_cover_tex.f90
index fd3671101..fd1903d5a 100644
--- a/src/MNH/mnhclose_write_cover_tex.f90
+++ b/src/MNH/mnhclose_write_cover_tex.f90
@@ -43,8 +43,12 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CONF, ONLY : CPROGRAM
-USE MODE_IO_ll
+USE MODD_CONF,             ONLY: CPROGRAM
+USE MODD_IO_ll,            ONLY: TFILEDATA
+!
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_FIND_BYNAME
+!
 USE MODI_TRANSFER_FILE
 !
 !
@@ -58,16 +62,20 @@ IMPLICIT NONE
 !*       0.2   Declarations of local variables
 !              -------------------------------
 !
-CHARACTER(LEN=20) :: YTEX           ! name of tex file
+CHARACTER(LEN=*),PARAMETER :: YTEX = 'class_cover_data.tex' ! name of tex file
+!
+INTEGER                 :: IRESP
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
 !
 !*       5.     Prints of cover parameters in a tex file
 !               ----------------------------------------
 !
-IF (CPROGRAM =='PGD   ') THEN
-  YTEX='class_cover_data.tex'
-  !
-  CALL CLOSE_ll(YTEX)
+TZFILE => NULL()
+!
+IF (TRIM(CPROGRAM)=='PGD') THEN
+  CALL IO_FILE_FIND_BYNAME(YTEX,TZFILE,IRESP)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
   CALL TRANSFER_FILE('fujitransfer.x','NIL',YTEX)
 END IF
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/mnhopen_aux_io_surf.f90 b/src/MNH/mnhopen_aux_io_surf.f90
index 8ba814072..e8a9f1d2d 100644
--- a/src/MNH/mnhopen_aux_io_surf.f90
+++ b/src/MNH/mnhopen_aux_io_surf.f90
@@ -69,6 +69,7 @@ USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll
 USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME
+USE MODE_MSG
 !
 USE MODI_GET_1D_MASK
 USE MODI_MNH_SURF_GRID_IO_INIT
@@ -147,10 +148,7 @@ IF ( IJPHEXT .NE. JPHEXT ) THEN
    WRITE(NLUOUT,FMT=*) ' MNHOPEN_AUX_IO : JPHEXT in PRE_PGD1.nam/NAM_CONF_PGD ( or default value )&
       & JPHEXT=',JPHEXT
    WRITE(NLUOUT,FMT=*) ' different from PGD files=',HFILE ,' value JPHEXT=',IJPHEXT
-   WRITE(NLUOUT,FMT=*) '-> JOB ABORTED'
-   CALL CLOSE_ll(COUT,IOSTAT=IRESP)
-   CALL ABORT  
-   STOP   
+   CALL PRINT_MSG(NVERB_FATAL,'IO','MNHOPEN_AUX_IO_SURF','')
 END IF
 !
 NIU_ALL = (IIMAX+2*JPHEXT)
diff --git a/src/MNH/mnhopen_write_cover_tex.f90 b/src/MNH/mnhopen_write_cover_tex.f90
index 0a7a89941..eca219526 100644
--- a/src/MNH/mnhopen_write_cover_tex.f90
+++ b/src/MNH/mnhopen_write_cover_tex.f90
@@ -43,9 +43,11 @@
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODD_CONF, ONLY : CPROGRAM
-USE MODE_ll
-USE MODE_IO_ll
+USE MODD_CONF,             ONLY: CPROGRAM
+USE MODD_IO_ll,            ONLY: TFILEDATA
+!
+USE MODE_FM,               ONLY: IO_FILE_OPEN_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 !
 !
 IMPLICIT NONE
@@ -58,17 +60,20 @@ INTEGER, INTENT(OUT) :: KTEX ! logical unit of Tex file
 !*       0.2   Declarations of local variables
 !              -------------------------------
 !
-INTEGER           :: IRESP
-CHARACTER(LEN=20) :: YTEX           ! name of tex file
+CHARACTER(LEN=*),PARAMETER :: YTEX = 'class_cover_data.tex' ! name of tex file
+!
+TYPE(TFILEDATA),POINTER :: TZFILE
 !-------------------------------------------------------------------------------
 !
 !*       5.     Prints of cover parameters in a tex file
 !               ----------------------------------------
 !
-IF (CPROGRAM =='PGD   ') THEN
-  YTEX='class_cover_data.tex'
-  CALL OPEN_ll(unit=KTEX,file=YTEX,iostat=IRESP,action='WRITE', &
-               form='FORMATTED',position="REWIND",mode='GLOBAL')
+TZFILE => NULL()
+!
+IF (TRIM(CPROGRAM)=='PGD') THEN
+  CALL IO_FILE_ADD2LIST(TZFILE,YTEX,'TXT','WRITE')
+  CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='REWIND')
+  KTEX = TZFILE%NLU
 ELSE
   KTEX=0
 END IF
diff --git a/src/MNH/modd_ch_model0d.f90 b/src/MNH/modd_ch_model0d.f90
index 6b5cdf84c..e688bd58e 100644
--- a/src/MNH/modd_ch_model0d.f90
+++ b/src/MNH/modd_ch_model0d.f90
@@ -46,6 +46,8 @@
 !*       0.   DECLARATIONS
 !        -----------------
 !
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
 IMPLICIT NONE
 SAVE
 !
@@ -66,6 +68,7 @@ REAL :: XTNEXTMETEO   ! time of next meteo update
 !
 CHARACTER*128 :: CINITFILE  = "CHCONTROL1.nam" ! name of initial value file
 CHARACTER*128 :: CMETEOFILE = "CHCONTROL1.nam" ! meteo update file
+TYPE(TFILEDATA),POINTER :: TMETEOFILE => NULL() ! meteo update file
 !
 CHARACTER*128 :: COUTFILE    = "BOX.OUT"      ! name of final output file 
 CHARACTER*128 :: CRESULTFILE = "BOX.RESULT"   ! regular output file 
@@ -76,7 +79,6 @@ CHARACTER*40  :: CRESULTFORMAT = "(5E16.8)" ! Format for results
 CHARACTER*40  :: CDIAGFORMAT   = "(5E16.8)" ! Format for diagnostics
 !
 INTEGER :: NFILEIO   = 42 ! channel to be used for all intermediate file I/O
-INTEGER :: NMETEOIO  = 43 ! channel to be used for all meteo I/O
 INTEGER :: NRESULTIO = 44 ! channel to be used for all regular result file I/O
 INTEGER :: NDIAGIO   = 45 ! channel to be used for all diagnostics file I/O
 !
diff --git a/src/MNH/radar_scattering.f90 b/src/MNH/radar_scattering.f90
index 0d9437165..6ea401981 100644
--- a/src/MNH/radar_scattering.f90
+++ b/src/MNH/radar_scattering.f90
@@ -104,6 +104,7 @@ END MODULE MODI_RADAR_SCATTERING
 !              ------------
 !
 USE MODD_CST
+USE MODD_IO_ll,           ONLY: TFILEDATA
 USE MODD_LUNIT
 USE MODD_PARAMETERS
 !!LIMA         
@@ -131,8 +132,9 @@ USE MODD_TMAT
 ! 
 USE MODE_ARF
 USE MODE_FGAU , ONLY:GAULAG
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
 USE MODE_FSCATTER
-USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
 USE MODE_MSG
 USE MODE_READTMAT
 !
@@ -274,10 +276,12 @@ REAL ::  ZCCG,ZLBG,ZLBEXG,ZDG,ZALPHAG,ZNUG,ZAG,ZBG,ZCXG
 REAL ::       ZLBI,ZLBEXI,ZDI,ZALPHAI,ZNUI,ZAI,ZBI
 REAL,DIMENSION(:),ALLOCATABLE :: ZRTMIN
 CHARACTER(LEN=100) :: YMSG
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 !*       1.     INITIALISATION 
 !--------------
 ILUOUT0 = TLUOUT0%NLU
+TZFILE => NULL()
 ! 
 IF (PRESENT(PCR_RAY)) THEN
   GLIMA=.TRUE.
@@ -625,7 +629,9 @@ DO JI=1,INBRAD
                  E12.5,2X,E12.5,2X,E12.5,2X,E12.5,2X,E12.5)
 
     !rain
-    CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(1),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE='GLOBAL')
+    CALL IO_FILE_ADD2LIST(TZFILE,YFILE_COEFINT(1),'TXT','READ')
+    CALL IO_FILE_OPEN_ll(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
     IF ( IRESP /= 0 ) THEN       
       WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(1))
       CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
@@ -637,7 +643,8 @@ DO JI=1,INBRAD
       ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE) 
       ILINE=ILINE+1
     ENDDO
-    CALL CLOSE_ll(YFILE_COEFINT(1),IOSTAT=IRESP) 
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     WRITE(ILUOUT0,*) "NLIGNE rain",ILINE      
     ILINE=2
     WRITE(ILUOUT0,*) "ILINE=",ILINE
@@ -649,7 +656,9 @@ DO JI=1,INBRAD
     ZIM_S22S11_T_R(ILINE),ZRE_S22FMS11FT_T_R(ILINE),ZIM_S22FT_T_R(ILINE),ZIM_S11FT_T_R(ILINE)
    
     !snow
-    CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(2),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE='GLOBAL')
+    CALL IO_FILE_ADD2LIST(TZFILE,YFILE_COEFINT(2),'TXT','READ')
+    CALL IO_FILE_OPEN_ll(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
     IF ( IRESP /= 0 ) THEN       
       WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(2))
       CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
@@ -661,7 +670,8 @@ DO JI=1,INBRAD
       ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)
       ILINE=ILINE+1
     ENDDO
-    CALL CLOSE_ll(YFILE_COEFINT(2),IOSTAT=IRESP) 
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     WRITE(ILUOUT0,*) "NLIGNE snow",ILINE    
     ILINE=2
     WRITE(ILUOUT0,*) "ILINE=",ILINE
@@ -673,7 +683,9 @@ DO JI=1,INBRAD
     ZIM_S22S11_T_S(ILINE),ZRE_S22FMS11FT_T_S(ILINE),ZIM_S22FT_T_S(ILINE),ZIM_S11FT_T_S(ILINE)
  
     !graupel
-    CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(3),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE='GLOBAL')
+    CALL IO_FILE_ADD2LIST(TZFILE,YFILE_COEFINT(3),'TXT','READ')
+    CALL IO_FILE_OPEN_ll(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
     IF ( IRESP /= 0 ) THEN       
       WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(3))
       CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
@@ -685,7 +697,8 @@ DO JI=1,INBRAD
       ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)
       ILINE=ILINE+1
     ENDDO
-    CALL CLOSE_ll(YFILE_COEFINT(3),IOSTAT=IRESP) 
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     WRITE(ILUOUT0,*) "NLIGNE graupel",ILINE    
     ILINE=2
     WRITE(ILUOUT0,*) "ILINE=",ILINE
@@ -697,7 +710,9 @@ DO JI=1,INBRAD
     ZIM_S22S11_T_G(ILINE),ZRE_S22FMS11FT_T_G(ILINE),ZIM_S22FT_T_G(ILINE),ZIM_S11FT_T_G(ILINE)
 
     !wet graupel
-    CALL OPEN_ll(UNIT=IUNIT,FILE=YFILE_COEFINT(4),FORM="FORMATTED",ACCESS="SEQUENTIAL",ACTION="READ",IOSTAT=IRESP,MODE='GLOBAL')
+    CALL IO_FILE_ADD2LIST(TZFILE,YFILE_COEFINT(4),'TXT','READ')
+    CALL IO_FILE_OPEN_ll(TZFILE,KRESP=IRESP)
+    IUNIT = TZFILE%NLU
     IF ( IRESP /= 0 ) THEN       
       WRITE(YMSG,*) "problem opening file ",TRIM(YFILE_COEFINT(4))
       CALL PRINT_MSG(NVERB_FATAL,'GEN','RADAR_SCATTERING',YMSG)
@@ -709,7 +724,8 @@ DO JI=1,INBRAD
       ZIM_S22S11_T_W(ILINE),ZRE_S22FMS11FT_T_W(ILINE),ZIM_S22FT_T_W(ILINE),ZIM_S11FT_T_W(ILINE)
       ILINE=ILINE+1
     ENDDO
-    CALL CLOSE_ll(YFILE_COEFINT(4),IOSTAT=IRESP) 
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     WRITE(ILUOUT0,*) "NLIGNE wet graupel",ILINE    
     ILINE=2
     WRITE(ILUOUT0,*) "ILINE=",ILINE
diff --git a/src/MNH/read_all_data_grib_case.f90 b/src/MNH/read_all_data_grib_case.f90
index 8065c2f60..8ff5fda92 100644
--- a/src/MNH/read_all_data_grib_case.f90
+++ b/src/MNH/read_all_data_grib_case.f90
@@ -318,9 +318,12 @@ REAL, DIMENSION(:), ALLOCATABLE     :: ZPV      ! vertical level in grib file
 INTEGER                             :: IPVPRESENT ,IPV
 REAL, DIMENSION(:,:,:,:), ALLOCATABLE :: ZR_DUM
 INTEGER                            :: IMI
+TYPE(TFILEDATA),POINTER             :: TZFILE
 !
 !---------------------------------------------------------------------------------------
 !
+TZFILE => NULL()
+!
 IMI = GET_CURRENT_MODEL_INDEX()
 !
 !* 1. READ PGD FILE
@@ -1006,7 +1009,8 @@ IF (IMODEL==5) THEN
 !*       2.6.1  read mocage species
 !
 ! open input file
-  CALL CH_OPEN_INPUT(YPRE_MOC, "MOC2MESONH", ICHANNEL, ILUOUT0, KVERB)
+  CALL CH_OPEN_INPUT(YPRE_MOC, "MOC2MESONH", TZFILE, ILUOUT0, KVERB)
+  ICHANNEL = TZFILE%NLU
 !
 ! read number of mocage species to transfer into mesonh
   READ(ICHANNEL, *) IMOC
@@ -1035,7 +1039,8 @@ IF (IMODEL==5) THEN
   ENDIF
   !
   ! close file
-  CALL CLOSE_ll(YPRE_MOC,IOSTAT=IRET)
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
   !
   !*  2.6.2   exchange mocage values onto prognostic variables XSV_LS
   !
@@ -1404,7 +1409,8 @@ IF (ODUMMY_REAL) THEN
   ! close file
   CALL IO_FILE_CLOSE_ll(TPPRE_REAL1)
   ! open input file
-  CALL CH_OPEN_INPUT(TPPRE_REAL1%CNAME, "DUMMY_2D", ICHANNEL, ILUOUT0, KVERB)
+  CALL CH_OPEN_INPUT(TPPRE_REAL1%CNAME, "DUMMY_2D", TZFILE, ILUOUT0, KVERB)
+  ICHANNEL = TZFILE%NLU
   !
   ! read number of dummy 2D fields to transfer into mesonh
   READ(ICHANNEL, *) IMOC
@@ -1468,6 +1474,9 @@ IF (ODUMMY_REAL) THEN
     !
   END DO
   !
+  CALL IO_FILE_CLOSE_ll(TZFILE)
+  TZFILE => NULL()
+  !
   IF (NVERB>=10) THEN
     WRITE(ILUOUT0,*) CDUMMY_2D(1:IVAR)
     WRITE(ILUOUT0,*) INUMGRIB(1:IVAR)
diff --git a/src/MNH/read_chem_data_netcdf_case.f90 b/src/MNH/read_chem_data_netcdf_case.f90
index 20537716f..b62c8eea5 100644
--- a/src/MNH/read_chem_data_netcdf_case.f90
+++ b/src/MNH/read_chem_data_netcdf_case.f90
@@ -184,6 +184,7 @@ end type TZMOZ
 type(TZMOZ), DIMENSION(:,:),ALLOCATABLE       :: TZSTOC
 ! model indice
 INTEGER                           :: IMI
+TYPE(TFILEDATA),POINTER                       :: TZFILE
 !
 ! For netcdf 
 !
@@ -210,6 +211,7 @@ REAL, DIMENSION(:,:), ALLOCATABLE     :: PSMOZ
 real ::a,b
 
 !----------------------------------------------------------------------
+TZFILE => NULL()
 !
 IMI = GET_CURRENT_MODEL_INDEX()
 !
@@ -449,7 +451,8 @@ ALLOCATE(ZOUT1D(INO))
 !*       2.6.1  read MOZART species from the file MOZ1.nam
 !
 ! open input file
-CALL CH_OPEN_INPUT(YMOZ,"MOZ2MESONH",ICHANNEL,ILUOUT0,KVERB)
+CALL CH_OPEN_INPUT(YMOZ,"MOZ2MESONH",TZFILE,ILUOUT0,KVERB)
+ICHANNEL = TZFILE%NLU
 !
 !read number of mocage species to transfer into mesonh
 READ(ICHANNEL, *) IMOZ
@@ -725,7 +728,7 @@ if (status /= nf90_noerr) call handle_err(status)
 
 ! close
 ! file
-CALL CLOSE_ll(YMOZ,IOSTAT=IRET)
+CALL IO_FILE_CLOSE_ll(TZFILE)
 
 
 !-------------------------------------------------------------
@@ -774,6 +777,7 @@ CONTAINS
 !
 !       Small routine used to store a linear array into a 2 dimension array
 !
+USE MODE_MSG
 IMPLICIT NONE
 INTEGER,                INTENT(IN)  :: KN1
 REAL,DIMENSION(KN1),    INTENT(IN)  :: P1
@@ -785,11 +789,7 @@ INTEGER                 :: JLOOP2_A1T2
 INTEGER                 :: JPOS_A1T2
 !
 IF (KN1 < KL1*KL2) THEN
-  WRITE (ILUOUT0,'(A)') ' | Error in "ARRAY_1D_TO_2D", sizes do not match - abort'
- !callabortstop
-  CALL CLOSE_ll(CLUOUT0,IOSTAT=IRESP)
-  CALL ABORT
-  STOP
+  CALL PRINT_MSG(NVERB_FATAL,'GEN','ARRAY_1D_TO_2D','sizes do not match')
 END IF
 JPOS_A1T2 = 1
 DO JLOOP2_A1T2 = 1, KL2
diff --git a/src/MNH/resolved_elecn.f90 b/src/MNH/resolved_elecn.f90
index f1bebd4ba..499776fdb 100644
--- a/src/MNH/resolved_elecn.f90
+++ b/src/MNH/resolved_elecn.f90
@@ -173,15 +173,16 @@ END MODULE MODI_RESOLVED_ELEC_n
 !*       0.    DECLARATIONS
 !              ------------
 !
-USE MODE_ll
-USE MODE_FM
 USE MODE_ELEC_ll
-USE MODE_IO_ll, ONLY : CLOSE_ll, OPEN_ll
+USE MODE_FM,               ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
+USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST,IO_FILE_FIND_BYNAME
+USE MODE_ll
 !
 USE MODD_METRICS_n, ONLY : XDXX, XDYY, XDZX, XDZY, XDZZ 
 USE MODD_FIELD_n, ONLY : XRSVS
 USE MODD_CONF, ONLY : L1D, L2D, CEXP
 USE MODD_CST
+USE MODD_IO_ll,            ONLY: TFILEDATA
 USE MODD_PARAMETERS, ONLY : JPVEXT
 USE MODD_ELEC_DESCR
 USE MODD_ELEC_n          
@@ -342,8 +343,10 @@ CHARACTER (LEN=32) :: YASCFILE
 REAL               :: ZTEMP_DIST
 CHARACTER (LEN=18) :: YNAME
 LOGICAL            :: GLMA_FILE
+TYPE(TFILEDATA),POINTER :: TZFILE
 !
 NULLIFY(TZFIELDS_ll)
+TZFILE => NULL()
 !
 !------------------------------------------------------------------------------
 !
@@ -836,9 +839,9 @@ ENDIF
 IF (KTCOUNT .EQ. 1) THEN
   IF (LFLASH_GEOM) THEN
     YASCFILE = CEXP//"_fgeom_diag.asc"
-    CALL OPEN_ll (FILE=YASCFILE, ACTION="WRITE", STATUS="NEW",                 &
-                  FORM="FORMATTED", POSITION="APPEND",                         &
-                  UNIT=NLU_fgeom_diag, IOSTAT= NIOSTAT_fgeom_diag              )
+    CALL IO_FILE_ADD2LIST(TZFILE,YASCFILE,'TXT','WRITE')
+    CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='APPEND',HSTATUS='NEW',KRESP=NIOSTAT_fgeom_diag)
+    NLU_fgeom_diag = TZFILE%NLU
     IF ( IPROC .EQ. 0) THEN
       WRITE (NLU_fgeom_diag, FMT='(A)') '--------------------------------------------------------'
       WRITE (NLU_fgeom_diag, FMT='(A)') '*FLASH CHARACTERISTICS FROM FLASH_GEOM_ELEC*'
@@ -859,14 +862,15 @@ IF (KTCOUNT .EQ. 1) THEN
       WRITE (NLU_fgeom_diag, FMT='(A)') '--------------------------------------------'
     END IF
 !  
-    CALL CLOSE_ll (YASCFILE)
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     CALL MPI_BCAST (NLU_fgeom_diag,1, MPI_INTEGER, 0, NMNH_COMM_WORLD, IERR)
 !
     IF (LSAVE_COORD) THEN
       YASCFILE = CEXP//"_fgeom_coord.asc"
-      CALL OPEN_ll (FILE=YASCFILE, ACTION="WRITE", STATUS="NEW",&
-                    FORM="FORMATTED", POSITION="APPEND",                        &
-                    UNIT=NLU_fgeom_coord, IOSTAT= NIOSTAT_fgeom_coord     )
+      CALL IO_FILE_ADD2LIST(TZFILE,YASCFILE,'TXT','WRITE')
+      CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='APPEND',HSTATUS='NEW',KRESP=NIOSTAT_fgeom_coord)
+      NLU_fgeom_coord = TZFILE%NLU
       IF ( IPROC .EQ. 0) THEN
         WRITE (NLU_fgeom_coord,FMT='(A)') '------------------------------------------'
         WRITE (NLU_fgeom_coord,FMT='(A)') '*****FLASH COORD. FROM FLASH_GEOM_ELEC****'
@@ -879,16 +883,17 @@ IF (KTCOUNT .EQ. 1) THEN
         WRITE (NLU_fgeom_coord,FMT='(A)') '------------------------------------------'
       END IF
 !
-      CALL CLOSE_ll (YASCFILE)
+      CALL IO_FILE_CLOSE_ll(TZFILE)
+      TZFILE => NULL()
       CALL MPI_BCAST (NLU_fgeom_coord,1, MPI_INTEGER, 0, NMNH_COMM_WORLD, IERR)
     END IF
   END IF
 !
   IF (LSERIES_ELEC) THEN
     YASCFILE = CEXP//"_series_cloud_elec.asc"                              
-    CALL OPEN_ll (FILE=YASCFILE, ACTION="WRITE", STATUS="NEW", &
-                  FORM="FORMATTED", POSITION="APPEND",         &
-                  UNIT=NLU_series_cloud_elec, IOSTAT= NIOSTAT_series_cloud_elec)
+    CALL IO_FILE_ADD2LIST(TZFILE,YASCFILE,'TXT','WRITE')
+    CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='APPEND',HSTATUS='NEW',KRESP=NIOSTAT_series_cloud_elec)
+    NLU_series_cloud_elec = TZFILE%NLU
     IF ( IPROC .EQ. 0) THEN
       WRITE (NLU_series_cloud_elec, FMT='(A)') '----------------------------------------------------'
       WRITE (NLU_series_cloud_elec, FMT='(A)') '********* RESULTS FROM of LSERIES_ELEC *************'
@@ -915,7 +920,8 @@ IF (KTCOUNT .EQ. 1) THEN
       WRITE (NLU_series_cloud_elec, FMT='(A)') '----------------------------------------------------'
     END IF
 !
-    CALL CLOSE_ll (YASCFILE)
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     CALL MPI_BCAST (NLU_series_cloud_elec,1, MPI_INTEGER, 0, NMNH_COMM_WORLD, IERR)
   END IF
 END IF
@@ -936,8 +942,10 @@ IF (LFLASH_GEOM .AND. LLMA) THEN
   END IF
 !
   IF (GLMA_FILE) THEN
-    IF(CLMA_FILE(1:5) /= "BEGIN") THEN ! close preceeding file when existing
-      CALL CLOSE_ll (CLMA_FILE)
+    IF(CLMA_FILE(1:5) /= "BEGIN") THEN ! close previous file if exists
+      CALL IO_FILE_FIND_BYNAME(CLMA_FILE,TZFILE,IERR)
+      CALL IO_FILE_CLOSE_ll(TZFILE)
+      TZFILE => NULL()
     ENDIF
 !
     TDTLMA%TIME = TDTLMA%TIME - XDTLMA
@@ -948,8 +956,9 @@ IF (LFLASH_GEOM .AND. LLMA) THEN
     TDTLMA%TIME = MOD(TDTLMA%TIME + XDTLMA,86400.)
     CLMA_FILE = CEXP//"_SIMLMA_"//YNAME//".dat"
 !
-    CALL OPEN_ll (FILE=CLMA_FILE, ACTION="WRITE",    FORM="FORMATTED", STATUS="NEW", &
-                  UNIT=ILMA_UNIT, POSITION="APPEND", IOSTAT=ILMA_IOSTAT )
+    CALL IO_FILE_ADD2LIST(TZFILE,CLMA_FILE,'TXT','WRITE')
+    CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='APPEND',HSTATUS='NEW',KRESP=ILMA_IOSTAT)
+    ILMA_UNIT = TZFILE%NLU
     IF ( IPROC .EQ. 0 ) THEN
       WRITE (UNIT=ILMA_UNIT,FMT='(A)') '----------------------------------------'
       WRITE (UNIT=ILMA_UNIT,FMT='(A)') '*** FLASH COORD. FROM LMA SIMULATOR ****'
@@ -972,7 +981,8 @@ IF (LFLASH_GEOM .AND. LLMA) THEN
       WRITE (UNIT=ILMA_UNIT,FMT='(A)') '-- Column 17 : negative ions neut     --'
       WRITE (UNIT=ILMA_UNIT,FMT='(A)') '----------------------------------------'
     END IF
-    CALL CLOSE_ll (CLMA_FILE)
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     CALL MPI_BCAST (ILMA_UNIT,1, MPI_INTEGER, 0, NMNH_COMM_WORLD, IERR)
   END IF
 END IF
diff --git a/src/MNH/write_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 600e0385a..74e07c987 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -234,6 +234,7 @@ USE MODE_FMWRIT
 USE MODE_GATHER_ll
 USE MODE_ll
 USE MODE_IO_ll
+USE MODE_IO_MANAGE_STRUCT,ONLY: IO_FILE_ADD2LIST
 USE MODE_THERMO
 USE MODE_MODELN_HANDLER
 USE MODI_LIDAR
@@ -297,6 +298,7 @@ REAL,DIMENSION(:,:,:), ALLOCATABLE  :: ZRHOT, ZTMP ! work array
 
 !ECRITURE DANS UN FICHIER ASCII DE RESULTATS 
 !INITIALISATION DU NOM DE FICHIER CREE EN PARALLELE AVEC CELUI LFI
+TYPE(TFILEDATA),POINTER :: TZRSFILE
 INTEGER :: ILURS
 CHARACTER(LEN=32) :: YRS
 CHARACTER(LEN=3),DIMENSION(:),ALLOCATABLE  :: YRAD
@@ -329,9 +331,6 @@ REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
 REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZZ_GRID1
 REAL,DIMENSION(:,:),ALLOCATABLE :: ZTHVSOL,ZSHMIX
 REAL,DIMENSION(:,:,:),ALLOCATABLE :: ZZONWIND,ZMERWIND,ZFFWIND2,ZRIB
-
-  !
-
 !
 !-------------------------------------------------------------------------------
 !
@@ -345,6 +344,7 @@ IKE=IKU-JPVEXT
 
 IMI = GET_CURRENT_MODEL_INDEX()
 ILUOUT0 = TLUOUT0%NLU
+TZRSFILE => NULL()
 !-------------------------------------------------------------------------------
 !
 !*       1.     WRITES IN THE LFI FILE
@@ -3376,8 +3376,9 @@ IF(LRADAR .AND. LUSERR) THEN
           WRITE(YGRID_SIZE,'(I3.3)') 2*NMAX
           DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5)
             YRS=YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//YGRID_SIZE//TRIM(TPFILE%CNAME)
-            CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,STATUS="NEW",ACTION='WRITE', &
-                         FORM="FORMATTED",RECL=8192)
+            CALL IO_FILE_ADD2LIST(TZRSFILE,YRS,'TXT','WRITE',KRECL=8192)
+            CALL IO_FILE_OPEN_ll(TZRSFILE,HSTATUS='NEW')
+            ILURS = TZRSFILE%NLU
             WRITE(ILURS,'(A,4F12.6,2I5)') '**domaine LATLON ',ZWORK43(JI,1,1),ZWORK43(JI,4*NMAX-1,2*NMAX), &
                   ZWORK43(JI,2,1),ZWORK43(JI,4*NMAX,2*NMAX),2*NMAX,2*NMAX !! HEADER
             DO JV=2*NMAX,1,-1
@@ -3390,7 +3391,8 @@ IF(LRADAR .AND. LUSERR) THEN
             DO JV=2*NMAX,1,-1
               WRITE(ILURS,*) CLATLON(JV)
             END DO                  
-            CALL CLOSE_ll(HFILE=YRS)
+            CALL IO_FILE_CLOSE_ll(TZRSFILE)
+            TZRSFILE => NULL()
           END DO               
         END DO
         DEALLOCATE(CLATLON)
@@ -3404,13 +3406,16 @@ IF(LRADAR .AND. LUSERR) THEN
                 INT(ANINT(10.*XELEV(JI,JEL))-10*INT(XELEV(JI,JEL)))
           DO JJ=1,SIZE(ZWORK42(:,:,:,:,:),5)
             YRS="P"//YRAD(JJ)//CNAME_RAD(JI)(1:3)//YELEV//TRIM(TPFILE%CNAME)
-            CALL OPEN_ll(UNIT=ILURS,FILE=YRS,IOSTAT=IRESP,ACTION='WRITE',MODE='GLOBAL')
+            CALL IO_FILE_ADD2LIST(TZRSFILE,YRS,'TXT','WRITE')
+            CALL IO_FILE_OPEN_ll(TZRSFILE)
+            ILURS = TZRSFILE%NLU
             DO JH=1,NBAZIM
               DO JV=1,NBSTEPMAX+1
                 WRITE(ILURS,"(F15.7)") ZWORK42_BIS(JI,JEL,JH,JV,JJ)
               END DO
             END DO                                    
-            CALL CLOSE_ll(HFILE=YRS)
+            CALL IO_FILE_CLOSE_ll(TZRSFILE)
+            TZRSFILE => NULL()
           END DO
         END DO
       END DO
diff --git a/src/MNH/write_ts1d.f90 b/src/MNH/write_ts1d.f90
index 51b1d2945..4bf731346 100644
--- a/src/MNH/write_ts1d.f90
+++ b/src/MNH/write_ts1d.f90
@@ -79,6 +79,8 @@
 !!    IMPLICIT ARGUMENTS
 !!    ------------------
 
+USE MODE_FM,              ONLY: IO_FILE_CLOSE_ll,IO_FILE_OPEN_ll
+USE MODE_IO_MANAGE_STRUCT,ONLY: IO_FILE_ADD2LIST
 USE MODE_IO_ll
 USE MODE_GRIDPROJ
 USE MODE_ll
@@ -88,6 +90,7 @@ USE MODD_NSV,             ONLY: NSV,NSV_CHEMBEG,NSV_CHEMEND,  &
 USE MODD_CH_AEROSOL,      ONLY: CAERONAMES, LORILAM
 USE MODD_DYN_n,           ONLY: XTSTEP       ! time-step of the model
 USE MODD_DIM_n,           ONLY: NKMAX        ! # of points in Z of the physical grid
+USE MODD_IO_ll,           ONLY: TFILEDATA
 USE MODD_PARAMETERS,      ONLY: JPVEXT   ! vertical external points number
 USE MODD_GRID,      ONLY: XLATORI,XLONORI
 USE MODD_GRID_n,    ONLY: XXHAT,XYHAT,XZZ
@@ -132,7 +135,6 @@ IMPLICIT NONE
 REAL  :: ZTIME
 LOGICAL, SAVE     :: GSFIRSTCALL = .TRUE.
 INTEGER, SAVE     :: ISIO1D                 ! IO-channel 
-INTEGER           :: IFAIL                  ! return code from OPEN_ll
 CHARACTER(LEN=80), SAVE :: YSIO1DDEF        ! name of def-file
 CHARACTER(LEN=80), SAVE :: YSIO1DDAT        ! name of dat-file
 CHARACTER(LEN=40) :: YFORM = "(E15.8)"      ! data output format
@@ -146,7 +148,7 @@ INTEGER           :: IINDEX, JINDEX         ! index of each profile
 REAL              :: ZXINDEX, ZYINDEX       ! distance from origin of each profile
 REAL              :: ZX, ZY                 ! poisition of each profile
 REAL, DIMENSION(SIZE(XCHEMLAT)) ::  ZLAT, ZLON
-
+TYPE(TFILEDATA),POINTER,SAVE :: TZFILE
 !
 CHARACTER*8  :: YDATE  ! for retrieval of date and time
 CHARACTER*10 :: YTIME  ! dito
@@ -160,6 +162,7 @@ CHARACTER*5  :: YCTIME  ! current time
 !!    EXECUTABLE STATEMENTS
 !!    ---------------------
 !
+TZFILE => NULL()
 NBPROF = 0
 
 CALL TEMPORAL_DIST (   TDTCUR%TDATE%YEAR,TDTCUR%TDATE%MONTH,              &
@@ -235,8 +238,9 @@ DO JN=1,NBPROF
       (JINDEX >= 1).AND.(JINDEX <= IJU)) THEN  
   ! write picasso def-file
     IF (GSFIRSTCALL) THEN
-      CALL OPEN_ll(UNIT=ISIO1D,FILE=YSIO1DDEF,IOSTAT=IFAIL ,MODE='GLOBAL',  &
-             POSITION='REWIND',ACTION='WRITE',STATUS='NEW',FORM='FORMATTED')
+      CALL IO_FILE_ADD2LIST(TZFILE,YSIO1DDEF,'TXT','WRITE')
+      CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='REWIND',HSTATUS='NEW')
+      ISIO1D = TZFILE%NLU
 
     ! write comment
       CALL DATE_AND_TIME(YDATE, YTIME)
@@ -278,12 +282,14 @@ DO JN=1,NBPROF
       END IF
     END DO
   
-    CALL CLOSE_ll(YSIO1DDEF)
+    CALL IO_FILE_CLOSE_ll(TZFILE)
+    TZFILE => NULL()
     CALL TRANSFER_FILE('fujitransfer.x','NIL',YSIO1DDEF)
 
     ! open picasso dat-file
-    CALL OPEN_ll(UNIT=ISIO1D,FILE=YSIO1DDAT,IOSTAT=IFAIL ,MODE='GLOBAL',  &
-               POSITION='REWIND',ACTION='WRITE',STATUS='NEW',FORM='FORMATTED')
+    CALL IO_FILE_ADD2LIST(TZFILE,YSIO1DDAT,'TXT','WRITE')
+    CALL IO_FILE_OPEN_ll(TZFILE,HPOSITION='REWIND',HSTATUS='NEW')
+    ISIO1D = TZFILE%NLU
 
     ! calculate ISSKIP
     IF (L1D) THEN
@@ -390,7 +396,8 @@ DO JN=1,NBPROF
     ENDDO
 
     IF ((CPROGRAM =='DIAG  ').AND.(LCHEMDIAG)) THEN
-      CALL CLOSE_ll(YSIO1DDAT)
+      CALL IO_FILE_CLOSE_ll(TZFILE)
+      TZFILE => NULL()
       CALL TRANSFER_FILE('fujitransfer.x','NIL',YSIO1DDAT)
     END IF
  
-- 
GitLab