diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 4fd3dbfd711122098d7512aa99dd56802db0ec9a..5c9b6e0a20bcac91c47e209357b4721b710eb95f 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -54,10 +54,10 @@ TYPE TFILEDATA
   CHARACTER(LEN=7)  :: CMODE   = "UNKNOWN" !Opening mode (read, write...)
   LOGICAL           :: LOPENED = .FALSE.   !Is the file opened
   INTEGER           :: NOPEN   = 0         !Number of times the file has been opened (during the current execution)
+  INTEGER           :: NCLOSE  = 0         !Number of times the file has been closed (during the current execution)
   !
   ! Fields for LFI files
   INTEGER :: NLFINPRAR = 0  !Number of predicted articles of the LFI file (non crucial)
-  INTEGER :: NLFININAR = -1 !Number of articles present at opening of the LFI file
   INTEGER :: NLFITYPE  = -1 !Type of the file (used to generate list of files to transfers)
   INTEGER :: NLFIVERB  = 1  !LFI verbosity level
   !
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index dc7d1416bad83cf58c7e2b02052aa1988d6943ca..db092a52354ed9916a8ea6c0b7714ba66c676b19 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -27,6 +27,7 @@ INTEGER, PARAMETER :: JPPIPE = 10
 !INCLUDE 'mpif.h'
 
 PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll
+PUBLIC IO_FILE_OPEN_ll, IO_FILE_CLOSE_ll
 
 CONTAINS 
 
@@ -129,9 +130,32 @@ END IF
 
 END SUBROUTINE FMLOOK_ll
 
+SUBROUTINE IO_FILE_OPEN_ll(TPFILE,HFIPRI,KRESP)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),POINTER,INTENT(IN)  :: TPFILE ! File structure
+CHARACTER(LEN=*),       INTENT(IN)  :: HFIPRI ! File for prints in FM
+INTEGER,                INTENT(OUT) :: KRESP  ! Return code
+!
+INTEGER :: ININAR ! Number of articles present in LFI file (unused here)
+!
+IF (TPFILE%LOPENED) THEN
+  PRINT *,'ERROR: IO_FILE_OPEN_ll: file ',TRIM(TPFILE%CNAME),' already opened'
+  CALL ABORT
+  STOP
+ENDIF
+!
+CALL FMOPEN_ll(TPFILE%CNAME,TPFILE%CMODE,HFIPRI,TPFILE%NLFINPRAR,TPFILE%NLFITYPE,TPFILE%NLFIVERB,ININAR,KRESP,TPFILE=TPFILE)
+!
+TPFILE%LOPENED = .TRUE.
+TPFILE%NOPEN   = TPFILE%NOPEN + 1
+!
+END SUBROUTINE IO_FILE_OPEN_ll
+
 SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR&
-     & ,KRESP,OPARALLELIO)
-USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD
+     & ,KRESP,OPARALLELIO,TPFILE)
+USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD,TFILEDATA
 USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
 USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO
 !JUANZ
@@ -153,8 +177,9 @@ INTEGER,         INTENT(OUT)::KNINAR  ! number of articles
 ! initially
 ! present in the file.
 INTEGER,         INTENT(OUT)::KRESP   ! return-code if a problem
-LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
 ! araised.
+LOGICAL,         INTENT(IN),  OPTIONAL :: OPARALLELIO
+TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure
 !
 !   Local variable
 !
@@ -176,6 +201,13 @@ LOGICAL               :: GPARALLELIO
 #if defined(MNH_IOCDF4)
 INTEGER(KIND=IDCDF_KIND) :: INCERR
 #endif
+CHARACTER(LEN=7) :: YTYPE
+
+IF ( PRESENT(TPFILE) ) THEN
+  YTYPE = TPFILE%CTYPE
+ELSE
+  YTYPE = 'UNKNOWN'
+ENDIF
 
 IF ( PRESENT(OPARALLELIO) ) THEN
   GPARALLELIO = OPARALLELIO
@@ -220,9 +252,13 @@ ELSEIF (IROWF.GT.IFMFNL) THEN
   GOTO 1000
 ENDIF
 
-YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
-CALL OPEN_ll(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',ACTION=HACTION,DELIM&
-     & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO)
+!Do not open '.des' file if OUTPUT
+IF(YTYPE/='OUTPUT') THEN
+  YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
+  CALL OPEN_ll(UNIT=INUMBR,FILE=YFNDES,FORM='FORMATTED',ACTION=HACTION,DELIM&
+       & ='QUOTE',IOSTAT=IRESP,RECL=1024*8,OPARALLELIO=GPARALLELIO)
+ENDIF
+
 IF (IRESP /= 0) GOTO 1000
 
 
@@ -339,15 +375,37 @@ KRESP=IRESP
 RETURN
 END SUBROUTINE FMOPEN_ll
   
-SUBROUTINE FMCLOS_ll(HFILEM,HSTATU,HFIPRI,KRESP,OPARALLELIO)
+SUBROUTINE IO_FILE_CLOSE_ll(TPFILE,HFIPRI,KRESP)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA),POINTER,INTENT(IN)  :: TPFILE ! File structure
+CHARACTER(LEN=*),       INTENT(IN)  :: HFIPRI ! File for prints in FM
+INTEGER,                INTENT(OUT) :: KRESP  ! Return code
+!
+IF (.NOT.TPFILE%LOPENED) THEN
+  PRINT *,'ERROR: IO_FILE_CLOSE_ll: trying to close a file not opened: ',TRIM(TPFILE%CNAME)
+  CALL ABORT
+  STOP
+ENDIF
+!
+CALL FMCLOS_ll(TPFILE%CNAME,'KEEP',HFIPRI,KRESP,TPFILE=TPFILE)
+!
+TPFILE%LOPENED = .FALSE.
+TPFILE%NCLOSE  = TPFILE%NCLOSE + 1
+!
+END SUBROUTINE IO_FILE_CLOSE_ll
+
+SUBROUTINE FMCLOS_ll(HFILEM,HSTATU,HFIPRI,KRESP,OPARALLELIO,TPFILE)
 !
 !!    MODIFICATIONS
 !!    -------------
 !
 !!      J.Escobar   18/10/10   bug with PGI compiler on ADJUSTL
 !-------------------------------------------------------------------------------
-USE MODD_IO_ll, ONLY : ISP
-USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
+USE MODD_IO_ll, ONLY : ISP,TFILEDATA
+!USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
+USE MODE_FD_ll
 USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE
 #if !defined(MNH_SGI)
 USE MODI_SYSTEM_MNH
@@ -360,6 +418,7 @@ CHARACTER(LEN=*),     INTENT(IN) ::HSTATU  ! status for the closed file
 CHARACTER(LEN=*),     INTENT(IN) ::HFIPRI  ! file for prints in FM
 INTEGER,              INTENT(OUT)::KRESP   ! return-code if problems araised
 LOGICAL,              INTENT(IN),  OPTIONAL :: OPARALLELIO
+TYPE(TFILEDATA),POINTER,INTENT(IN),OPTIONAL :: TPFILE ! File structure
 
 INTEGER              ::IRESP,IROWF,IFMFNL
 CHARACTER(LEN=7)     ::YSTATU
@@ -375,6 +434,13 @@ TYPE(FD_ll), POINTER :: TZFDLFI
 INTEGER(KIND=LFI_INT) :: IRESP8,INUM8
 !JUAN
 LOGICAL :: GPARALLELIO
+CHARACTER(LEN=7) :: YTYPE
+
+IF ( PRESENT(TPFILE) ) THEN
+  YTYPE = TPFILE%CTYPE
+ELSE
+  YTYPE = 'UNKNOWN'
+ENDIF
 
 IF ( PRESENT(OPARALLELIO) ) THEN
   GPARALLELIO = OPARALLELIO
@@ -397,8 +463,6 @@ ELSEIF (IROWF.GT.IFMFNL) THEN
   GOTO 1000
 ENDIF
 
-YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
-
 IF (LEN(HSTATU).LE.0) THEN
   IRESP=-41
   GOTO 1000
@@ -411,7 +475,12 @@ ELSE
   ENDIF
 ENDIF
 
-CALL CLOSE_ll(YFNDES,IOSTAT=IRESP,STATUS=YSTATU)
+!Do not close (non-existing) '.des' file if OUTPUT
+IF(YTYPE/='OUTPUT') THEN
+  YFNDES=ADJUSTL(TRIM(HFILEM)//'.des')
+  CALL CLOSE_ll(YFNDES,IOSTAT=IRESP,STATUS=YSTATU)
+ENDIF
+
 IF (IRESP /= 0) GOTO 1000
 
 YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi')
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 5c6fe1f833c468d7cd2a0eee7ebc3bec6a386daa..978c32b84d29dd5aff15ecf99fd4017e0f5dbbd1 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -448,18 +448,26 @@ SUBROUTINE POPULATE_STRUCT(TPFILE_FIRST,TPFILE_LAST,KSTEPS,HFILETYPE,TPBAKOUTN)
         TPBAKOUTN(IPOS)%TFILE%CTYPE=HFILETYPE
         TPBAKOUTN(IPOS)%TFILE%CMODE="WRITE"
         WRITE (YNUMBER,FMT="('.',I3.3)") IPOS
-        TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER)
+        IF (HFILETYPE=='OUTPUT') THEN
+          ! Add a "OUT" suffix for output files
+          TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//'.OUT'//YNUMBER)
+        ELSE IF (HFILETYPE=='BACKUP') THEN
+          TPBAKOUTN(IPOS)%TFILE%CNAME=ADJUSTL(ADJUSTR(IO_SURF_MNH_MODEL(IMI)%COUTFILE)//YNUMBER)
+        ELSE
+          PRINT *,'Error: unknown filetype (',TRIM(HFILETYPE),')'
+          CALL ABORT
+        ENDIF
         TPBAKOUTN(IPOS)%TFILE%NLFITYPE=1 !1: to be transfered
 !PW: TODO: set NLFIVERB only when useful (only if LFI file...)
         TPBAKOUTN(IPOS)%TFILE%NLFIVERB=NVERB
         IF (LIOCDF4) THEN
-          TPBAKOUTN(IPOS)%TFILE%CTYPE='NETCDF4'
+          TPBAKOUTN(IPOS)%TFILE%CFORMAT='NETCDF4'
           IF (LLFIOUT) THEN
             PRINT *,'Warning: LLFIOUT + LIOCDF4 = .TRUE. not yet implemented with new IO data structures'
             TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
           END IF
         ELSE IF (LLFIOUT) THEN
-          TPBAKOUTN(IPOS)%TFILE%CTYPE='LFI'
+          TPBAKOUTN(IPOS)%TFILE%CFORMAT='LFI'
           TPBAKOUTN(IPOS)%TFILE%NLFINPRAR= 22+2*(4+NRR+NSV)
         ELSE
           PRINT *,'Error: unknown backup/output fileformat'
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 7ba4a816a11d002a98f377b4a92fa0df9c73997c..8a1ee6baa7be434c6d24a2b58dc74e8a619eb10e 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -527,8 +527,7 @@ REAL, DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3)) :: ZTMP
 TYPE(LIST_ll), POINTER :: TZFIELDC_ll   ! list of fields to exchange
 TYPE(HALO2LIST_ll), POINTER :: TZHALO2C_ll   ! list of fields to exchange
 !
-TYPE(TFILEDATA),POINTER :: TZFILE
-CHARACTER(LEN=:),ALLOCATABLE :: YMODE
+TYPE(TFILEDATA),POINTER :: TZBAKFILE, TZOUTFILE
 !-------------------------------------------------------------------------------
 !
 !*       0.    MICROPHYSICAL SCHEME
@@ -601,8 +600,9 @@ IF (KTCOUNT == 1) THEN
   ALLOCATE(ZWT_ACT_NUC(SIZE(XWT,1),SIZE(XWT,2),SIZE(XWT,3)))
   ALLOCATE(GMASKkids(SIZE(XWT,1),SIZE(XWT,2)))
 !
-! initialization of the FM file output number
+! initialization of the FM file backup/output number
   IBAK=0
+  IOUT=0
 !
   INPRAR = 50
   CALL FMOPEN_ll(CFMDIAC,'WRITE',CLUOUT,INPRAR,ITYPE,NVERB,ININAR,IRESP)
@@ -911,19 +911,12 @@ IF (IBAK < NBAK_NUMB ) THEN
     IBAK=IBAK+1
     GCLOSE_OUT=.TRUE.
     !
-    TZFILE => TBACKUPN(IBAK)%TFILE
-    YFMFILE  = TZFILE%CNAME
+    TZBAKFILE => TBACKUPN(IBAK)%TFILE
+    YFMFILE  = TZBAKFILE%CNAME
     YDADFILE = TBACKUPN(IBAK)%CDADFILENAME
-    YMODE    = TZFILE%CMODE
-    INPRAR   = TZFILE%NLFINPRAR
-    ITYPE    = TZFILE%NLFITYPE
-    IVERB    = TZFILE%NLFIVERB
+    IVERB    = TZBAKFILE%NLFIVERB
     !
-    CALL FMOPEN_ll(YFMFILE,YMODE,CLUOUT,INPRAR,ITYPE,IVERB,ININAR,IRESP)
-    !
-    TZFILE%NLFININAR = ININAR
-    TZFILE%LOPENED = .TRUE.
-    TZFILE%NOPEN   = TZFILE%NOPEN + 1
+    CALL IO_FILE_OPEN_ll(TZBAKFILE,CLUOUT,IRESP)
     !
     YDESFM=ADJUSTL(ADJUSTR(YFMFILE)//'.des')
     !    
@@ -953,6 +946,19 @@ IF (IBAK < NBAK_NUMB ) THEN
   END IF
 END IF
 !
+IF (IOUT < NOUT_NUMB ) THEN
+  IF (KTCOUNT == TOUTPUTN(IOUT+1)%NSTEP) THEN
+    IOUT=IOUT+1
+    !
+    TZOUTFILE => TOUTPUTN(IOUT)%TFILE
+    !
+    CALL IO_FILE_OPEN_ll(TZOUTFILE,CLUOUT,IRESP)
+    !
+    CALL IO_FILE_CLOSE_ll(TZOUTFILE,CLUOUT,IRESP)
+    !
+  END IF
+END IF
+!
 CALL SECOND_MNH2(ZTIME2)
 !
 XT_STORE = XT_STORE + ZTIME2 - ZTIME1
@@ -1912,8 +1918,7 @@ XT_STEP_BUD = XT_STEP_BUD + ZTIME2 - ZTIME1 + XTIME_BU
 !
 IF (GCLOSE_OUT) THEN
   GCLOSE_OUT=.FALSE.
-  CALL FMCLOS_ll(YFMFILE,'KEEP',CLUOUT,IRESP)
-  TZFILE%LOPENED = .FALSE.
+  CALL IO_FILE_CLOSE_ll(TZBAKFILE,CLUOUT,IRESP)
 END IF
 !
 !-------------------------------------------------------------------------------