diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index 6c3bf214526370f5adf677c180f472cec9497323..526a972e83265a2f80dc273e1ef7b8445e1e38d7 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -998,7 +998,7 @@ CONTAINS
     !*      0.2   Declarations of local variables
     !
     CHARACTER(LEN=28)                        :: YFILEM   ! FM-file name
-    CHARACTER(LEN=16)                        :: YRECFM   ! name of the article to write
+    CHARACTER(LEN=NMNHNAMELGTMAX)            :: YRECFM   ! name of the article to write
     CHARACTER(LEN=2)                         :: YDIR     ! field form
     CHARACTER(LEN=JPFINL)                    :: YFNLFI
     INTEGER                                  :: IERR
diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index 0d04fa9bccdeb40bde9a680e248dd25a536aa348..4d4fd98dcf7090b79279cb4f7c555fadaeaf3033 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -44,6 +44,7 @@ TYPE TOUTBAK
   INTEGER           :: NOUTDAD = -1 !Index of the corresponding dad file (file with same time)
   CHARACTER(LEN=28) :: CDADFILENAME !Filename of dad
   TYPE(TFILEDATA),POINTER :: TFILE => NULL() !Corresponding file
+  INTEGER,DIMENSION(:),POINTER :: NFIELDLIST => NULL() !List of the fields to read or write
 END TYPE TOUTBAK
 
 !Structure describing the characteristics of a file
diff --git a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90 b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
index 5f8a70bdd7d68f853a4c9141bb02ce45c54a52a1..e08d5a6af3732791683db36924fb69de7fd4e9c6 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_manage_struct.f90
@@ -30,6 +30,7 @@ USE MODD_NESTING,    ONLY : CDAD_NAME,NDAD
 USE MODD_NSV,        ONLY: NSV
 USE MODD_OUT_n,      ONLY : OUT_MODEL
 USE MODD_VAR_ll,     ONLY : IP
+USE MODE_FIELD
 !
 IMPLICIT NONE
 !
@@ -39,9 +40,11 @@ REAL,    INTENT(IN) :: PSEGLEN ! segment duration (in seconds)
 !
 INTEGER           :: IMI              ! Model number for loop
 INTEGER           :: IBAK_NUMB, IOUT_NUMB ! Number of backups/outputs
+INTEGER           :: IVAR             ! Number of variables
 INTEGER           :: ISTEP_MAX        ! Number of timesteps
-INTEGER           :: IPOS             ! Index
+INTEGER           :: IPOS,IFIELD      ! Indices
 INTEGER           :: JOUT,IDX         ! Loop indices
+INTEGER           :: IRESP
 INTEGER, DIMENSION(:), ALLOCATABLE :: IBAK_STEP, IOUT_STEP
 ! Arrays to store list of backup/output steps (intermediate array)
 CHARACTER (LEN=4) :: YDADNUMBER       ! Character string for the DAD model file number
@@ -219,6 +222,40 @@ DO IMI = 1, NMODEL
     END DO
   END IF
   !
+  !Determine the list of the fields to write in each output
+  IF (IOUT_NUMB>0) THEN
+    !Count the number of fields to output
+    IVAR = 0
+    DO IPOS = 1,JPOUTVARMAX
+      IF (COUT_VAR(IMI,IPOS)/='') IVAR = IVAR + 1
+    END DO
+    IF (IVAR==0) THEN
+      PRINT *,'ERROR: no fields chosen for output'
+    END IF
+    ALLOCATE(OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(IVAR))
+    !Determine the list of the outputs to do (by field number)
+    IVAR = 1
+    !Set the NFIELDLIST for the 1st output
+    !All the others will use the same list (for the moment)
+    DO IPOS = 1,JPOUTVARMAX
+      IF (COUT_VAR(IMI,IPOS)/='') THEN
+        CALL FIND_FIELD_ID_FROM_MNHNAME(COUT_VAR(IMI,IPOS),IFIELD,IRESP)
+        OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(IVAR) = IFIELD
+        IF (IRESP/=0) THEN
+          PRINT *,'FATAL: unknown field for output: ',TRIM(COUT_VAR(IMI,IPOS))
+          !MNH is killed to prevent problems with wrong values in NFIELDLIST
+          STOP
+        END IF
+        !
+        IVAR=IVAR+1
+      END IF
+    END DO
+    !All the outputs use the same field list (for the moment)
+    DO IPOS = 2,IOUT_NUMB
+      OUT_MODEL(IMI)%TOUTPUTN(IPOS)%NFIELDLIST => OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST
+    END DO
+  END IF  
+  !
   DEALLOCATE(IBAK_STEP)
   DEALLOCATE(IOUT_STEP)
   !
@@ -237,6 +274,11 @@ DO IMI = 1, NMODEL
   DO JOUT = 1,IOUT_NUMB
     WRITE(*,'( I9 F12.3 )'  ) OUT_MODEL(IMI)%TOUTPUTN(JOUT)%NSTEP,OUT_MODEL(IMI)%TOUTPUTN(JOUT)%XTIME
   END DO
+  PRINT *,'Field list:'
+  DO JOUT = 1,SIZE(OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST)
+    IDX=OUT_MODEL(IMI)%TOUTPUTN(1)%NFIELDLIST(JOUT)
+    PRINT *,'  ',TRIM(TFIELDLIST(IDX)%CMNHNAME)
+  END DO
   PRINT *,'-------------------------'
   END IF
   !
@@ -246,6 +288,7 @@ DEALLOCATE(NBAK_STEP)
 DEALLOCATE(NOUT_STEP)
 DEALLOCATE(XBAK_TIME)
 DEALLOCATE(XOUT_TIME)
+DEALLOCATE(COUT_VAR)
 !
 CONTAINS
 !
diff --git a/src/MNH/modd_fmout.f90 b/src/MNH/modd_fmout.f90
index d43402d8e0145162885b0862a59e53fc42e25490..d9811f75ebe21c1c0358cbe9ae23d41787e95281 100644
--- a/src/MNH/modd_fmout.f90
+++ b/src/MNH/modd_fmout.f90
@@ -68,6 +68,7 @@ REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ = XNEGUNDEF, XOUT_TIME_FREQ =
 ! Time between 2 backups/outputs for each model
 REAL,SAVE,DIMENSION(JPMODELMAX) :: XBAK_TIME_FREQ_FIRST = 0., XOUT_TIME_FREQ_FIRST = 0.
 ! Time for first backup/output for each model (if XBAK/OUT_TIME_FREQ is set)
+CHARACTER(LEN=NMNHNAMELGTMAX),SAVE,ALLOCATABLE,DIMENSION(:,:) :: COUT_VAR ! Name of the fields to output
 !
 !
 END MODULE MODD_FMOUT
diff --git a/src/MNH/modd_parameters.f90 b/src/MNH/modd_parameters.f90
index b2c7421d875e9b4c7ff2fdee102d5ad9ab51106f..ae029c22da06e185d07b13ed797afa8fed7c5187 100644
--- a/src/MNH/modd_parameters.f90
+++ b/src/MNH/modd_parameters.f90
@@ -77,7 +77,10 @@ INTEGER, PARAMETER :: NNEGUNDEF = -999  ! default value for undefined or unused
 !                                       ! field (negative value guaranteed)
 INTEGER, PARAMETER :: JPDUMMY  = 20   ! Size of dummy array
 !
-INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files
+INTEGER, PARAMETER :: JPOUTMAX = 192    ! Maximum allowed number of OUTput files
+INTEGER, PARAMETER :: JPOUTVARMAX = 192 ! Maximum allowed number of variables in an output file
+!
+INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32 ! Maximum length of a MNH variable name
 !
 INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA
 INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA
diff --git a/src/MNH/modn_fmout.f90 b/src/MNH/modn_fmout.f90
index 7793d94cb0c2c481414fdabec9a4d3720debb885..f67f995a93912b972eeb64da51a3de70b1660613 100644
--- a/src/MNH/modn_fmout.f90
+++ b/src/MNH/modn_fmout.f90
@@ -52,6 +52,7 @@ NAMELIST/NAM_FMOUT/LBAK_BEG,LBAK_END,&
                    LOUT_BEG,LOUT_END,&
                    XOUT_TIME,NOUT_STEP,&
                    NOUT_STEP_FREQ,NOUT_STEP_FREQ_FIRST,&
-                   XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST
+                   XOUT_TIME_FREQ,XOUT_TIME_FREQ_FIRST, &
+                   COUT_VAR
 !
 END MODULE MODN_FMOUT
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 287f5f8e61f15a6150da2b5d99456280c40b6936..4e727b307add875fb8c958d8a5957ace84e882cb 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -429,11 +429,13 @@ IF (KMI == 1) THEN
     IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX))
     IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX))
     IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX))
+    IF (.NOT.ALLOCATED(COUT_VAR))  ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
     READ(UNIT=ILUDES,NML=NAM_FMOUT)
     XBAK_TIME(:,:) = XNEGUNDEF
     XOUT_TIME(:,:) = XNEGUNDEF
     NBAK_STEP(:,:) = NNEGUNDEF
     NOUT_STEP(:,:) = NNEGUNDEF
+    COUT_VAR(:,:)  = ''
   END IF
   CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 4ac2f3ed812ec73a77d88fe5161725ae5475b782..1e4695d867fd8c098c615f4e0029e5a42574237e 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -501,10 +501,12 @@ IF (KMI == 1) THEN
     IF (.NOT.ALLOCATED(XOUT_TIME)) ALLOCATE(XOUT_TIME(NMODEL,JPOUTMAX))
     IF (.NOT.ALLOCATED(NBAK_STEP)) ALLOCATE(NBAK_STEP(NMODEL,JPOUTMAX))
     IF (.NOT.ALLOCATED(NOUT_STEP)) ALLOCATE(NOUT_STEP(NMODEL,JPOUTMAX))
+    IF (.NOT.ALLOCATED(COUT_VAR))  ALLOCATE(COUT_VAR (NMODEL,JPOUTVARMAX))
     XBAK_TIME(:,:) = XNEGUNDEF
     XOUT_TIME(:,:) = XNEGUNDEF
     NBAK_STEP(:,:) = NNEGUNDEF
     NOUT_STEP(:,:) = NNEGUNDEF
+    COUT_VAR(:,:)  = ''
     READ(UNIT=ILUSEG,NML=NAM_FMOUT)
   END IF
   CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT)