diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 72df0987661f4e4b9b8106ae0b154da3af730cc2..86251adb153d0bbcf7e401e5a5b4142e6a54d9eb 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -1150,6 +1150,58 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'SUPSATMAX'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: SUPSATMAX'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Supersaturation'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'NACT'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: NACT'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Nact'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'SSPRO'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: SSPRO'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Supersaturation'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'NPRO'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: NPRO'
+TFIELDLIST(IDX)%CUNITS     = ''
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Nact'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'PHC'
 TFIELDLIST(IDX)%CSTDNAME   = ''
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: PHC'
@@ -2709,8 +2761,12 @@ IF (CONF_MODEL(KFROM)%IDX_RHT>0) THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('RHT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA=>XRT(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
 END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSRCT
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSIGS
+CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSUPSAT
+CALL FIND_FIELD_ID_FROM_MNHNAME('NACT',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNACT
+CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSSPRO
+CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XNPRO
+CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSRCT
+CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XSIGS
 !
 IF (CPROGRAM == 'MESONH') THEN
   !
@@ -2946,8 +3002,12 @@ IF (CONF_MODEL(KTO)%IDX_RHT>0) THEN
   TFIELDLIST(IID2)%TFIELD_X3D(KTO)%DATA => TFIELDLIST(IID)%TFIELD_X4D(KTO)%DATA(:,:,:,CONF_MODEL(KTO)%IDX_RHT)
 END IF
 !
-CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',IID,IRESP); XSRCT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',IID,IRESP); XSIGS => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('SUPSATMAX',IID,IRESP); XSUPSAT => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('NACT',     IID,IRESP); XNACT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('SSPRO',    IID,IRESP); XSSPRO  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('NPRO',     IID,IRESP); XNPRO   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('SRCT',     IID,IRESP); XSRCT   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('SIGS',     IID,IRESP); XSIGS   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 !
 IF (CPROGRAM == 'MESONH') THEN
   !
diff --git a/src/MNH/c2r2_adjust.f90 b/src/MNH/c2r2_adjust.f90
index f9e099fe67de0815e3dabf96e49f979f721a3e28..48587b612d312a6f283d952d0320376487b0d6c3 100644
--- a/src/MNH/c2r2_adjust.f90
+++ b/src/MNH/c2r2_adjust.f90
@@ -165,6 +165,7 @@ USE MODD_NSV, ONLY : NSV_C2R2BEG
 USE MODI_CONDENS
 USE MODI_BUDGET
 !
+USE MODE_FIELD
 USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_IO_ll
@@ -219,20 +220,14 @@ REAL, DIMENSION(SIZE(PRHODJ,1),SIZE(PRHODJ,2),SIZE(PRHODJ,3)) &
                                          ! fields
 !
 INTEGER             :: IRESP      ! Return code of FM routines
-INTEGER             :: IGRID      ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH     ! Length of comment string in LFIFM file
 INTEGER             :: JITER,ITERMAX  ! iterative loop for first order adjustment
 INTEGER             :: ILUOUT     ! Logical unit of output listing 
-CHARACTER (LEN=28)  :: YFMFILE    ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT   ! Comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM     ! Name of the desired field in LFIFM file
+TYPE(TFIELDDATA)    :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 !*       1.     PRELIMINARIES
 !               -------------
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
 ZEPS= XMV / XMD
 !
@@ -428,11 +423,16 @@ IF ( HRAD /= 'NONE' ) THEN
 END IF
 !
 IF ( OCLOSE_OUT ) THEN
-  YRECFM  ='NEB'
-  YCOMMENT='X_Y_Z_NEB (0)'
-  IGRID   = 1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZW1,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'NEB'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: NEB'
+  TZFIELD%CUNITS     = '1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_NEB'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZW1)
 END IF
 !
 !
diff --git a/src/MNH/khko_notadjust.f90 b/src/MNH/khko_notadjust.f90
index e76310accb689f5951bd062a52a6d177fb2d225f..b3f7f9605b96f904e63fc3ed91cd993b776cb93c 100644
--- a/src/MNH/khko_notadjust.f90
+++ b/src/MNH/khko_notadjust.f90
@@ -111,11 +111,13 @@ USE MODD_NSV, ONLY : NSV_C2R2BEG
 USE MODD_RAIN_C2R2_DESCR, ONLY : XRTMIN
 
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FM
 USE MODE_FMWRIT
+USE MODE_IO_ll
+!
 USE MODI_BUDGET
 USE MODI_PROGNOS
-USE MODE_IO_ll
 !
 IMPLICIT NONE
 !
@@ -165,12 +167,7 @@ REAL, DIMENSION(:,:,:),   INTENT(OUT)   :: PCLDFR  ! Cloud fraction
 !
 !
 INTEGER             :: IRESP      ! Return code of FM routines
-INTEGER             :: IGRID      ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH     ! Length of comment string in LFIFM file
 INTEGER             :: ILUOUT     ! Logical unit of output listing 
-CHARACTER (LEN=28)  :: YFMFILE    ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT   ! Comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM     ! Name of the desired field in LFIFM file
 
 ! For Activation :                       
 LOGICAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) &
@@ -194,15 +191,14 @@ INTEGER, DIMENSION(:), ALLOCATABLE :: IVEC1             ! Vectors of indices for
 REAL, DIMENSION(SIZE(PRHODREF,1),SIZE(PRHODREF,2),SIZE(PRHODREF,3)) ::&
                        ZEXNT,ZEXNS,ZT,ZRVSAT,ZWORK,ZLV,ZCPH, ZW1,        &
                        ZACT, ZDZ
-INTEGER :: JK            ! For loop
-                        
+INTEGER           :: JK            ! For loop
+TYPE(TFIELDDATA)  :: TZFIELD
+
 !-------------------------------------------------------------------------------
 !
 !*       1.     PRELIMINARIES
 !               -------------
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL FMLOOK_ll(HLUOUT,HLUOUT,ILUOUT,IRESP)
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB=1+JPVEXT
@@ -396,16 +392,27 @@ END IF
   PNPRO(:,:,:) = ZACT(:,:,:) 
 !
 IF ( OCLOSE_OUT ) THEN
-  ILENCH=LEN(YCOMMENT)
-  YRECFM  ='SURSAT'
-  YCOMMENT='X_Y_Z_NEB (0)'
-  IGRID   = 1
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWORK,IGRID,ILENCH,YCOMMENT,IRESP)
-  ILENCH=LEN(YCOMMENT)
-  YRECFM  ='ACT_OD'
-  YCOMMENT='X_Y_Z_NEB (0)'
-  IGRID   = 1
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZACT,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'SURSAT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: SURSAT'
+  TZFIELD%CUNITS     = '1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_NEB'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWORK)
+  !
+  TZFIELD%CMNHNAME   = 'ACT_OD'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: ACT_OD'
+  TZFIELD%CUNITS     = '1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_NEB'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZACT)
 END IF
 !
 !*       7.  STORE THE BUDGET TERMS
diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90
index 8a0845b68ded82a12bd694c268b0fefe8ef055b6..d966c57c7ceda891c7323d21ad4ec6f2bafd10ae 100644
--- a/src/MNH/modd_fieldn.f90
+++ b/src/MNH/modd_fieldn.f90
@@ -71,14 +71,14 @@ TYPE FIELD_t
 !  REAL, DIMENSION(:,:,:), POINTER :: XTHT=>NULL()     ! (rho theta) at time t
   REAL, DIMENSION(:,:,:), POINTER :: XRTHS=>NULL()    ! Source of (rho theta)
 !  REAL, DIMENSION(:,:,:), POINTER :: XRTHS_CLD=>NULL()    ! Source of (rho theta) from resolved_cloud
-  REAL, DIMENSION(:,:,:), POINTER :: XSUPSAT=>NULL()    ! Sursat
-                                                     ! at time t
-  REAL, DIMENSION(:,:,:), POINTER :: XNACT=>NULL()    ! Sursat
-                                                     ! at time t
-  REAL, DIMENSION(:,:,:), POINTER :: XNPRO=>NULL()    ! Sursat
-                                                     ! at time t
-  REAL, DIMENSION(:,:,:), POINTER :: XSSPRO=>NULL()    ! Sursat
-                                                     ! at time t
+!  REAL, DIMENSION(:,:,:), POINTER :: XSUPSAT=>NULL()    ! Sursat
+!                                                     ! at time t
+!  REAL, DIMENSION(:,:,:), POINTER :: XNACT=>NULL()    ! Sursat
+!                                                     ! at time t
+!  REAL, DIMENSION(:,:,:), POINTER :: XNPRO=>NULL()    ! Sursat
+!                                                     ! at time t
+!  REAL, DIMENSION(:,:,:), POINTER :: XSSPRO=>NULL()    ! Sursat
+!                                                     ! at time t
 !  REAL, DIMENSION(:,:,:), POINTER :: XTKET=>NULL()    ! Kinetic energy
 !                                                     ! at time t
   REAL, DIMENSION(:,:,:), POINTER :: XRTKES=>NULL()   ! Source of kinetic energy
@@ -163,10 +163,10 @@ FIELD_MODEL(KFROM)%XRWS=>XRWS
 !FIELD_MODEL(KFROM)%XTHT=>XTHT !Done in FIELDLIST_GOTO_MODEL
 FIELD_MODEL(KFROM)%XRTHS=>XRTHS
 !FIELD_MODEL(KFROM)%XRTHS_CLD=>XRTHS_CLD !Done in FIELDLIST_GOTO_MODEL
-FIELD_MODEL(KFROM)%XSUPSAT=>XSUPSAT
-FIELD_MODEL(KFROM)%XNACT=>XNACT
-FIELD_MODEL(KFROM)%XNPRO=>XNPRO
-FIELD_MODEL(KFROM)%XSSPRO=>XSSPRO
+!FIELD_MODEL(KFROM)%XSUPSAT=>XSUPSAT !Done in FIELDLIST_GOTO_MODEL
+!FIELD_MODEL(KFROM)%XNACT=>XNACT !Done in FIELDLIST_GOTO_MODEL
+!FIELD_MODEL(KFROM)%XNPRO=>XNPRO !Done in FIELDLIST_GOTO_MODEL
+!FIELD_MODEL(KFROM)%XSSPRO=>XSSPRO !Done in FIELDLIST_GOTO_MODEL
 !FIELD_MODEL(KFROM)%XTKET=>XTKET !Done in FIELDLIST_GOTO_MODEL
 FIELD_MODEL(KFROM)%XRTKES=>XRTKES
 !FIELD_MODEL(KFROM)%XPABST=>XPABST !Done in FIELDLIST_GOTO_MODEL
@@ -198,10 +198,10 @@ XRWS=>FIELD_MODEL(KTO)%XRWS
 !XTHT=>FIELD_MODEL(KTO)%XTHT !Done in FIELDLIST_GOTO_MODEL
 XRTHS=>FIELD_MODEL(KTO)%XRTHS
 !XRTHS_CLD=>FIELD_MODEL(KTO)%XRTHS_CLD !Done in FIELDLIST_GOTO_MODEL
-XSUPSAT=>FIELD_MODEL(KTO)%XSUPSAT
-XNACT=>FIELD_MODEL(KTO)%XNACT
-XSSPRO=>FIELD_MODEL(KTO)%XSSPRO
-XNPRO=>FIELD_MODEL(KTO)%XNPRO
+!XSUPSAT=>FIELD_MODEL(KTO)%XSUPSAT !Done in FIELDLIST_GOTO_MODEL
+!XNACT=>FIELD_MODEL(KTO)%XNACT !Done in FIELDLIST_GOTO_MODEL
+!XSSPRO=>FIELD_MODEL(KTO)%XSSPRO !Done in FIELDLIST_GOTO_MODEL
+!XNPRO=>FIELD_MODEL(KTO)%XNPRO !Done in FIELDLIST_GOTO_MODEL
 !XTKET=>FIELD_MODEL(KTO)%XTKET !Done in FIELDLIST_GOTO_MODEL
 XRTKES=>FIELD_MODEL(KTO)%XRTKES
 !XPABST=>FIELD_MODEL(KTO)%XPABST !Done in FIELDLIST_GOTO_MODEL
diff --git a/src/MNH/paspol.f90 b/src/MNH/paspol.f90
index 51f585ce3e5d1da72d88f554bf9af553124dfde0..ee02db5366973167bef1d4c488186718963b76df 100644
--- a/src/MNH/paspol.f90
+++ b/src/MNH/paspol.f90
@@ -92,6 +92,8 @@ USE MODD_GRID_n
 USE MODD_TIME_n
 USE MODD_SUB_PASPOL_n
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
+!
 !*      0. DECLARATIONS
 !          ------------
 !
@@ -139,20 +141,10 @@ REAL    :: ZP, ZTH, ZT, ZRHO, ZMASAIR
 !INTEGER                    :: J4PTI,J4PTJ,J9PTI,J9PTJ
 !
 REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZRHOM  ! 
-REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPO, ZSVT ! Work array           
-!
-! in LFI subroutines at the open of the file
-INTEGER           :: IGRID     ! IGRID : grid indicator
-INTEGER           :: ILENCH    ! ILENCH : length of comment string
+REAL,  DIMENSION(:,:,:), ALLOCATABLE :: ZTEMPO, ZSVT ! Work arrays
 !
-CHARACTER(LEN=28) :: YFMFILE   ! Name of FM-file to write
-CHARACTER(LEN=16) :: YRECFM    ! Name of the article to be written
-CHARACTER(LEN=100):: YCOMMENT  ! Comment string
-CHARACTER (LEN=2) :: YDIR      ! Type of the data field
-INTEGER           :: IRESP     ! IRESP  : return-code if a problem appears
-                               !in LFI subroutines at the open of the file
-!
-
+INTEGER           :: IRESP
+TYPE(TFIELDDATA)  :: TZFIELD
 !
 !
 !--------------------------------------------------------------------------------------
@@ -161,8 +153,6 @@ INTEGER           :: IRESP     ! IRESP  : return-code if a problem appears
 !*	0. Initialisation
 !
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL GET_DIM_EXT_ll('B',IIU,IJU)
 CALL GET_PHYSICAL_ll (IIB,IJB,IIE,IJE)
 !
@@ -171,7 +161,6 @@ IKB = 1 + JPVEXT
 IKE = IKU - JPVEXT
 !
 ALLOCATE( ZRHOM(IIU,IJU,IKU) )
-ALLOCATE( ZTEMPO(IIU,IJU,IKU) )
 ALLOCATE( ZSVT(IIU,IJU,IKU) )
 !
 ZSURF = (XXHAT(2)-XXHAT(1))*(XYHAT(2)-XYHAT(1))   ! Surface d'une maille.
@@ -587,21 +576,29 @@ END DO
 !*	3.4 Ecriture conditionnelle.
 !
 IF (OCLOSE_OUT) THEN
-   DO JSV=1,NSV_PP
-      !
-      ZTEMPO(:,:,:)=XATC(:,:,:,JSV)
-      !
-      IGRID =  1
-      YDIR  = 'XY'
-      WRITE(YRECFM,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
-      WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1,' (1/M3) '
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZTEMPO,IGRID,ILENCH,    &
-                YCOMMENT,IRESP)
-   END DO
+  ALLOCATE( ZTEMPO(IIU,IJU,IKU) )
+  !
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'm-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV=1,NSV_PP
+    ZTEMPO(:,:,:)=XATC(:,:,:,JSV)
+    !
+    WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'ATC',JSV+NSV_PPBEG-1
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','ATC',JSV+NSV_PPBEG-1
+    !
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZTEMPO)
+  END DO
+  !
+  DEALLOCATE(ZTEMPO)
 ENDIF
 !
-DEALLOCATE(ZRHOM, ZTEMPO, ZSVT)
+DEALLOCATE(ZRHOM, ZSVT)
 !
 !
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/radiations.f90 b/src/MNH/radiations.f90
index 7587dd433f4c7959dc007e0ec2a3e62cfc309b9e..acb209da2cec76ffd841828dff095339425bedb1 100644
--- a/src/MNH/radiations.f90
+++ b/src/MNH/radiations.f90
@@ -219,6 +219,7 @@ END MODULE MODI_RADIATIONS
 !*       0.    DECLARATIONS
 !              ------------
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FMWRIT
 USE MODE_FM
 USE MODE_ll
@@ -317,9 +318,10 @@ REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PSVT    ! scalar variable ( C2R2 and C1R
 REAL, DIMENSION(:,:,:),   POINTER    :: POZON   ! OZONE field from clim.
 REAL, DIMENSION(:,:,:,:), POINTER    :: PAER    ! AERosols optical thickness from clim. 
 REAL, DIMENSION(:,:,:,:), POINTER    :: PDST_WL    ! AERosols Extinction by wavelength . 
-REAL, DIMENSION(:,:,:,:), POINTER    :: PAER_CLIM    ! AERosols optical thickness from clim.                                                 ! note : the vertical dimension of 
-                                                ! these fields iclude the "radiation levels"
-                                                !  above domain top.
+REAL, DIMENSION(:,:,:,:), POINTER    :: PAER_CLIM    ! AERosols optical thickness from clim.
+                                                ! note : the vertical dimension of 
+                                                ! these fields include the "radiation levels"
+                                                ! above domain top
                                                 ! 
                                                  
 REAL, DIMENSION(:,:,:), INTENT(IN)   :: PRHODREF ![kg/m3] air density
@@ -606,11 +608,6 @@ REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) &
      :: ZDTRAD_SW! SW temperature tendency
 INTEGER             :: ILUOUT       ! Logical unit number for output-listing
 INTEGER             :: IRESP        ! Return code of FM routines
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
-CHARACTER (LEN=28)  :: YFMFILE      ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
 REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2),SIZE(PDTHRAD,3)) &
      :: ZSTORE_3D, ZSTORE_3D2! 3D work array for storage
 REAL, DIMENSION(SIZE(PDTHRAD,1),SIZE(PDTHRAD,2)) &
@@ -622,6 +619,7 @@ CHARACTER (LEN=2)               :: YDIR        ! Type of the data field
 INTEGER :: ISWB ! number of SW spectral bands (between radiations and surface schemes)
 INTEGER :: JSWB ! loop on SW spectral bands
 INTEGER :: JAE  ! loop on aerosol class
+TYPE(TFIELDDATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------
 !-------------------------------------------------------------------------
@@ -630,8 +628,6 @@ INTEGER :: JAE  ! loop on aerosol class
 !*       1.    COMPUTE DIMENSIONS OF ARRAYS AND OTHER INDICES
 !              ----------------------------------------------
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)  ! this definition must be coherent with
                                       ! the one used in ini_radiations routine
 IKU = SIZE(PTHT,3)
@@ -2588,12 +2584,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YDIR='XY'
-    YRECFM   = 'SWF_DOWN'
-    YCOMMENT = 'X_Y_Z_SWF_DOWN (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_DOWN'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_DOWN'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_DOWN'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2604,11 +2604,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'SWF_UP'
-    YCOMMENT = 'X_Y_Z_SWF_UP (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_UP'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_UP'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_UP'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2619,11 +2624,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_DOWN'
-    YCOMMENT = 'X_Y_Z_LWF_DOWN (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_DOWN'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_DOWN'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_DOWN'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2634,11 +2644,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_UP'
-    YCOMMENT = 'X_Y_Z_LWF_UP (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_UP'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_UP'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_UP'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2649,11 +2664,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_NET'
-    YCOMMENT = 'X_Y_Z_LWF_NET (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_NET'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_NET'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_NET'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2664,11 +2684,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'SWF_NET'
-    YCOMMENT = 'X_Y_Z_SWF_NET (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_NET'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_NET'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_NET'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       DO JJ=IJB,IJE
@@ -2677,11 +2702,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'DTRAD_LW'
-    YCOMMENT = 'X_Y_Z_DTRAD_LW (K/DAY)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DTRAD_LW'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DTRAD_LW'
+    TZFIELD%CUNITS     = 'K day-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_LW'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JK=IKB,IKE
       DO JJ=IJB,IJE
@@ -2690,11 +2720,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'DTRAD_SW'
-    YCOMMENT = 'X_Y_Z_DTRAD_SW (K/DAY)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DTRAD_SW'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DTRAD_SW'
+    TZFIELD%CUNITS     = 'K day-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_SW'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2702,11 +2737,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,5)
       END DO
     END DO
-    YRECFM   = 'RADSWD_VIS'
-    YCOMMENT = 'X_Y_RADSWD_VIS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADSWD_VIS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADSWD_VIS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_VIS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
 !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2714,11 +2754,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,6)
       END DO
     END DO
-    YRECFM   = 'RADSWD_NIR'
-    YCOMMENT = 'X_Y_Z_RADSWD_NIR'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADSWD_NIR'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADSWD_NIR'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_NIR'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2726,11 +2771,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR(IIJ,4)
       END DO
     END DO
-    YRECFM   = 'RADLWD'
-    YCOMMENT = 'X_Y_RADLWD'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADLWD'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADLWD'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADLWD'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
   END IF
   !
   !
@@ -2744,12 +2794,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YDIR='XY'
-    YRECFM   = 'SWF_DOWN_CS'
-    YCOMMENT = 'X_Y_Z_SWF_DOWN_CS (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_DOWN_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_DOWN_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_DOWN_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2760,11 +2814,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'SWF_UP_CS'
-    YCOMMENT = 'X_Y_Z_SWF_UP_CS (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_UP_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_UP_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_UP_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2775,11 +2834,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_DOWN_CS'
-    YCOMMENT = 'X_Y_Z_LWF_DOWN (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_DOWN_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_DOWN_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_DOWN_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2790,11 +2854,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_UP_CS'
-    YCOMMENT = 'X_Y_Z_LWF_UP_CS (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_UP_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_UP_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_UP_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2805,11 +2874,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'LWF_NET_CS'
-    YCOMMENT = 'X_Y_Z_SWF_NET_CS (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LWF_NET_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LWF_NET_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LWF_NET_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2820,11 +2894,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'SWF_NET_CS'
-    YCOMMENT = 'X_Y_Z_SWF_NET_CS (W/M2)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SWF_NET_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SWF_NET_CS'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SWF_NET_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK-JPVEXT
@@ -2835,11 +2914,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'DTRAD_SW_CS'
-    YCOMMENT = 'X_Y_Z_DTRAD_SW_CS (K/DAY)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DTRAD_SW_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DTRAD_SW_CS'
+    TZFIELD%CUNITS     = 'K day-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_SW_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK-JPVEXT
@@ -2850,11 +2934,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'DTRAD_LW_CS'
-    YCOMMENT = 'X_Y_Z_DTRAD_LW_CS (K/DAY)'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'DTRAD_LW_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: DTRAD_LW_CS'
+    TZFIELD%CUNITS     = 'K day-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_DTRAD_LW_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2862,11 +2951,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,5)
       END DO
     END DO
-    YRECFM   = 'RADSWD_VIS_CS'
-    YCOMMENT = 'X_Y_RADSWD_VIS_CS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADSWD_VIS_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADSWD_VIS_CS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_VIS_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2874,11 +2968,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,6)
       END DO
     END DO
-    YRECFM   = 'RADSWD_NIR_CS'
-    YCOMMENT = 'X_Y_RADSWD_NIR_CS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADSWD_NIR_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADSWD_NIR_CS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADSWD_NIR_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2886,11 +2985,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZFLUX_TOP_GND_IRVISNIR_CS(IIJ,4)
       END DO
     END DO
-    YRECFM   = 'RADLWD_CS'
-    YCOMMENT = 'X_Y_RADLWD_CS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RADLWD_CS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RADLWD_CS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_RADLWD_CS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
   END IF
   !
   !
@@ -2901,11 +3005,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ALB_VIS(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_ALB_VIS'
-    YCOMMENT = 'X_Y_PLAN_ALB_VIS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_ALB_VIS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_ALB_VIS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ALB_VIS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2913,11 +3022,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ALB_NIR(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_ALB_NIR'
-    YCOMMENT = 'X_Y_PLAN_ALB_NIR'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_ALB_NIR'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_ALB_NIR'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ALB_NIR'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2925,11 +3039,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_TRA_VIS(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_TRA_VIS'
-    YCOMMENT = 'X_Y_PLAN_TRA_VIS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_TRA_VIS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_TRA_VIS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_TRA_VIS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2937,11 +3056,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_TRA_NIR(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_TRA_NIR'
-    YCOMMENT = 'X_Y_PLAN_TRA_NIR'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_TRA_NIR'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_TRA_NIR'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_TRA_NIR'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2949,11 +3073,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ABS_VIS(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_ABS_VIS'
-    YCOMMENT = 'X_Y_PLAN_ABS_VIS'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_ABS_VIS'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_ABS_VIS'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ABS_VIS'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     DO JJ=IJB,IJE
       DO JI=IIB,IIE
@@ -2961,11 +3090,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         ZSTORE_2D(JI,JJ) = ZPLAN_ABS_NIR(IIJ)
       END DO
     END DO
-    YRECFM   = 'PLAN_ABS_NIR'
-    YCOMMENT = 'X_Y_PLAN_ABS_NIR'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_2D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'PLAN_ABS_NIR'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: PLAN_ABS_NIR'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_PLAN_ABS_NIR'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_2D)
     !
     !
   END IF
@@ -2981,11 +3115,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'EFNEB_DOWN'
-    YCOMMENT = 'X_Y_Z_EFNEB_DOWN'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'EFNEB_DOWN'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: EFNEB_DOWN'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_EFNEB_DOWN'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -2996,11 +3135,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'EFNEB_UP'
-    YCOMMENT = 'X_Y_Z_EFNEB_UP'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'EFNEB_UP'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: EFNEB_UP'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_EFNEB_UP'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3011,11 +3155,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'FLWP'
-    YCOMMENT = 'X_Y_Z_FLWP'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'FLWP'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: FLWP'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_FLWP'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3026,12 +3175,17 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'FIWP'
-    YCOMMENT = 'X_Y_Z_FIWP'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
+    TZFIELD%CMNHNAME   = 'FIWP'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: FIWP'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_FIWP'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
+    !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
       DO JJ=IJB,IJE
@@ -3041,12 +3195,17 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'EFRADL'
-    YCOMMENT = 'X_Y_Z_RAD_microm'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
- 
+    TZFIELD%CMNHNAME   = 'EFRADL'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: EFRADL'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
+    ! 
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
       DO JJ=IJB,IJE
@@ -3056,12 +3215,17 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'EFRADI'
-    YCOMMENT = 'X_Y_Z_RAD_microm'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
- !
+    TZFIELD%CMNHNAME   = 'EFRADI'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: EFRADI'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_RAD_microm'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
+    !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
       DO JJ=IJB,IJE
@@ -3071,11 +3235,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'SW_NEB'
-    YCOMMENT = 'X_Y_Z_SW_NEB'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SW_NEB'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SW_NEB'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_SW_NEB'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     DO JK=IKB,IKE
       JKRAD = JK - JPVEXT
@@ -3086,11 +3255,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YRECFM   = 'RRTM_LW_NEB'
-    YCOMMENT = 'X_Y_Z_LW_NEB'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'RRTM_LW_NEB'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: RRTM_LW_NEB'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_LW_NEB'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     !
     ! spectral bands
     IF (KSWB==6) THEN
@@ -3107,21 +3281,38 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
     END DO
 !
     DO JBAND=1,KSWB
-      YRECFM   = 'ODAER_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_OD_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZTAUAZ(:,:,:,JBAND),IGRID,ILENCH,YCOMMENT,IRESP)
-      YRECFM   = 'SSAAER_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZPIZAZ(:,:,:,JBAND),IGRID,ILENCH,YCOMMENT,IRESP)
-      YRECFM   = 'GAER_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_G_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZCGAZ(:,:,:,JBAND),IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'ODAER_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_OD_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZTAUAZ(:,:,:,JBAND))
+      !
+      TZFIELD%CMNHNAME   = 'SSAAER_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZPIZAZ(:,:,:,JBAND))
+      !
+      TZFIELD%CMNHNAME   = 'GAER_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_G_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZCGAZ(:,:,:,JBAND))
     ENDDO
 
     DO JBAND=1,KSWB
@@ -3134,11 +3325,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      YRECFM   = 'OTH_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'OTH_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_OTH_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
       !
       DO JK=IKB,IKE
         JKRAD = JK - JPVEXT
@@ -3149,11 +3345,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      YRECFM   = 'SSA_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'SSA_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_SSA_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
       !
       DO JK=IKB,IKE
         JKRAD = JK - JPVEXT
@@ -3164,11 +3365,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
           END DO
         END DO
       END DO
-      YRECFM   = 'ASF_'//YBAND_NAME(JBAND)
-      YCOMMENT = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND)
-      IGRID    = 1
-      ILENCH   = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'ASF_'//YBAND_NAME(JBAND)
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = ''
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_ASF_'//YBAND_NAME(JBAND)
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
     END DO
   END IF
   !
@@ -3186,12 +3392,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
         END DO
       END DO
     END DO
-    YDIR='XY'
-    YRECFM   = 'O3CLIM'
-    YCOMMENT = 'X_Y_Z_O3 Pa/Pa'
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'O3CLIM'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: O3CLIM'
+    TZFIELD%CUNITS     = 'Pa Pa-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_O3'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D)
 ! 
 !cumulated optical thickness of aerosols
 !cumul begin from the top of the domain, not from the TOA !      
@@ -3212,12 +3422,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_2D(:,:) = ZSTORE_2D(:,:) + ZSTORE_3D(:,:,JK1)
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_LAND'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_LAND'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_LAND'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
 !
 ! sea
     DO JK=IKB,IKE
@@ -3236,12 +3450,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_SEA'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_SEA'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_SEA'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
 !
 ! desert
     DO JK=IKB,IKE
@@ -3260,12 +3478,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !    
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_DES'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_DES'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_DES'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
 !
 ! urban
     DO JK=IKB,IKE
@@ -3284,12 +3506,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_URB'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_URB'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_URB'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
 !
 ! Volcanoes
     DO JK=IKB,IKE
@@ -3308,12 +3534,16 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_VOL'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_VOL'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_VOL'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
 !
 ! stratospheric background
     DO JK=IKB,IKE
@@ -3332,16 +3562,19 @@ IF( OCLOSE_OUT .AND. (KRAD_DIAG >= 1) ) THEN
       ZSTORE_3D2(:,:,JK1) = ZSTORE_2D(:,:)  
     END DO
 !
-    YDIR='XY'
-    YRECFM   = 'CUM_AER_STRB'
-    YCOMMENT = 'X_Y_Z_CUM_AER_OPT' 
-    IGRID    = 1
-    ILENCH   = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,YDIR,ZSTORE_3D2,IGRID,ILENCH,YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'CUM_AER_STRB'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: CUM_AER_STRB'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_CUM_AER_OPT'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZSTORE_3D2)
   ENDIF
 END IF
 !
-
 DEALLOCATE(ZNFLW_CS)
 DEALLOCATE(ZNFLW)
 DEALLOCATE(ZNFSW_CS)
diff --git a/src/MNH/rain_c2r2_khko.f90 b/src/MNH/rain_c2r2_khko.f90
index 119979e1426170bb37365c817e64611b0adb3b7d..f90b32de3e749a832712412e02c61dac044a544d 100644
--- a/src/MNH/rain_c2r2_khko.f90
+++ b/src/MNH/rain_c2r2_khko.f90
@@ -238,10 +238,11 @@ USE MODD_SALT
 !
 USE MODI_BUDGET
 !
+USE MODE_FIELD
 USE MODE_FM
-USE MODE_ll
 USE MODE_FMWRIT
 USE MODI_GAMMA
+USE MODE_ll
 !
 IMPLICIT NONE
 !
@@ -324,9 +325,6 @@ INTEGER :: IKB           !
 INTEGER :: IKE           !
 INTEGER :: ISIZE         !
 INTEGER :: IRESP      ! Return code of FM routines
-INTEGER :: ILENG      ! Length of comment string in LFIFM file
-INTEGER :: IGRID      ! C-grid indicator in LFIFM file
-INTEGER :: ILENCH     ! Length of comment string in LFIFM file
 !
 REAL    :: ZTSPLITR      ! Small time step for rain sedimentation
 REAL    :: ZEPS          ! molar mass ratio
@@ -425,9 +423,7 @@ REAL  :: ZFACT, JSV, ZMU, ZALPHA
 REAL, DIMENSION(:), ALLOCATABLE    :: ZRTMIN
 REAL, DIMENSION(:), ALLOCATABLE    :: ZCTMIN
 REAL :: ZTMP
-CHARACTER (LEN=28)  :: YFMFILE    ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT   ! Comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM     ! Name of the desired field in LFIFM file
+TYPE(TFIELDDATA)    :: TZFIELD
 !
 !
 !
@@ -436,8 +432,6 @@ CHARACTER (LEN=16)  :: YRECFM     ! Name of the desired field in LFIFM file
 !*       1.     COMPUTE THE SLOPE PARAMETERS ZLBDC,ZLBDR
 !   	        ----------------------------------------
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB=1+JPVEXT
 IKE=SIZE(PZZ,3) - JPVEXT
@@ -601,13 +595,18 @@ INTEGER                           :: J1
 !ZCHEN(:,:,IKE) = ZCHEN(:,:,IKE-1)
 !!
 !!
-!IF ( OCLOSE_OUT ) THEN
-!   YRECFM  ='ZCHEN'
-!   YCOMMENT='X_Y_Z_ZCHEN'
-!   ILENCH=LEN(YCOMMENT)
-!   IGRID   = 1
-!   CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZCHEN,IGRID,ILENCH,YCOMMENT,IRESP)
-!END IF
+! IF ( OCLOSE_OUT ) THEN
+!   TZFIELD%CMNHNAME   = 'ZCHEN'
+!   TZFIELD%CSTDNAME   = ''
+!   TZFIELD%CLONGNAME  = 'MesoNH: ZCHEN'
+!   TZFIELD%CUNITS     = ''
+!   TZFIELD%CDIR       = 'XY'
+!   TZFIELD%CCOMMENT   = 'X_Y_Z_ZCHEN'
+!   TZFIELD%NGRID      = 1
+!   TZFIELD%NTYPE      = TYPEREAL
+!   TZFIELD%NDIMS      = 3
+!   CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZCHEN)
+! END IF
 !
 !-------------------------------------------------------------------------------
 !
@@ -880,11 +879,16 @@ INUCT = COUNTJV( GNUCT(:,:,:),I1(:),I2(:),I3(:))
 ! END IF
 !                      
 IF ( OCLOSE_OUT ) THEN
-  YRECFM  ='SMAX'  
-  YCOMMENT='X_Y_Z_SMAX'
-  ILENCH=LEN(YCOMMENT)
-  IGRID   = 1
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZZW1LOG,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'SMAX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: SMAX'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_SMAX'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZZW1LOG)
 END IF
 !
 !*       3.4   budget storage
@@ -1898,23 +1902,27 @@ DO JN = 1 , KSPLITR
   END IF
 !   
  IF (OSEDC .AND. OCLOSE_OUT) THEN
-    YRECFM  ='SEDFLUXC'
-    YCOMMENT='X_Y_Z_SEDFLUXC'
-    ILENCH=LEN(YCOMMENT)
-    IGRID   = 1
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWSEDC,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-    YRECFM  ='SEDFLUXR'
-    YCOMMENT='X_Y_Z_SEDFLUXR'
-    ILENCH=LEN(YCOMMENT)
-    IGRID   = 1
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWSEDR,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-!    YRECFM  ='SPEEDC'
-!    YCOMMENT='X_Y_Z_SPEEDC'
-!    ILENCH=LEN(YCOMMENT)
-!    IGRID   = 1
-!    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',PSPEEDC,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'SEDFLUXC'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: SEDFLUXC'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_SEDFLUXC'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWSEDC)
+  !
+  TZFIELD%CMNHNAME   = 'SEDFLUXR'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: SEDFLUXR'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_SEDFLUXR'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWSEDR)
  END IF
 END DO
 !
diff --git a/src/MNH/shallow_mf_pack.f90 b/src/MNH/shallow_mf_pack.f90
index 8ebc554a588bee4976a9f788d5b6c729531c972e..637071ad243504c6f5ef8612fe9b5ad3d5a6b486 100644
--- a/src/MNH/shallow_mf_pack.f90
+++ b/src/MNH/shallow_mf_pack.f90
@@ -128,6 +128,7 @@ USE MODD_NSV
 USE MODD_PARAM_MFSHALL_n
 USE MODD_BUDGET
 
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FMWRIT
 
 USE MODI_SHALLOW_MF
@@ -254,12 +255,8 @@ REAL, DIMENSION(SIZE(PTHM,1),SIZE(PTHM,2),SIZE(PTHM,3),SIZE(PSVM,4)) ::  ZDSVDT
 INTEGER :: IIU, IJU, IKU, IKB, IKE, IRR, ISV  
 INTEGER :: JK,JRR,JSV                          ! Loop counters
 
-INTEGER             :: IRESP        ! Return code of FM routines 
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file 
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
-CHARACTER(LEN=28)   :: YFMFILE      ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
+INTEGER          :: IRESP        ! Return code of FM routines 
+TYPE(TFIELDDATA) :: TZFIELD
 !------------------------------------------------------------------------
 
 !!! 1. Initialisation
@@ -284,8 +281,6 @@ ZUMM=MXF(PUM)
 ZVMM=MYF(PVM)
 ZWMM=MZF(1,IKU,1,PWM)
 !
-YFMFILE = TPFILE%CNAME
-!
 !!! 2. Pack input variables
 !
 DO JK=1,IKU
@@ -386,40 +381,69 @@ END DO
 !
 IF ( OMF_FLX .AND. OCLOSE_OUT ) THEN
   ! stores the conservative potential temperature vertical flux
-  YRECFM  ='MF_THW_FLX'
-  YCOMMENT='X_Y_Z_MF_THW_FLX (K*M/S)'
-  ILENCH  = LEN(YCOMMENT)
-  IGRID   = 4   
   ZWORK(:,:,:)=RESHAPE(ZFLXZTHMF (:,:),(/ IIU,IJU,IKU /) )
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWORK,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'MF_THW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MF_THW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWORK)
+  !
   ! stores the conservative mixing ratio vertical flux
-  YRECFM  ='MF_RCONSW_FLX'
-  YCOMMENT='X_Y_Z_MF_RCONSW_FLX (K*M/S)'
-  ILENCH  = LEN(YCOMMENT)
-  IGRID   = 4   
   ZWORK(:,:,:)=RESHAPE(ZFLXZRMF(:,:),(/ IIU,IJU,IKU /) )
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWORK,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'MF_RCONSW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MF_RCONSW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_RCONSW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWORK)
+  !
   ! stores the theta_v vertical flux
-   YRECFM  ='MF_THVW_FLX'
-   YCOMMENT='X_Y_Z_MF_THVW_FLX (K*M/S)'
-   ILENCH  = LEN(YCOMMENT)
-   IGRID   = 4   
-   CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',PFLXZTHVMF,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'MF_THVW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MF_THVW_FLX'
+  TZFIELD%CUNITS     = 'K m s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_THVW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,PFLXZTHVMF)
+  !
  IF (OMIXUV) THEN
   ! stores the U momentum vertical flux
-  YRECFM  ='MF_UW_FLX'
-  YCOMMENT='X_Y_Z_MF_UW_FLX (M2/S2)'
-  ILENCH  = LEN(YCOMMENT)
-  IGRID   = 4   
   ZWORK(:,:,:)=RESHAPE(ZFLXZUMF(:,:),(/ IIU,IJU,IKU /) )
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWORK,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'MF_UW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MF_UW_FLX'
+  TZFIELD%CUNITS     = 'm2 s-2'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_UW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWORK)
+  !
   ! stores the V momentum vertical flux
-  YRECFM  ='MF_VW_FLX'
-  YCOMMENT='X_Y_Z_MF_VW_FLX (M2/S2)'
-  ILENCH  = LEN(YCOMMENT)
-  IGRID   = 4   
   ZWORK(:,:,:)=RESHAPE(ZFLXZVMF(:,:),(/ IIU,IJU,IKU /) )
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZWORK,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'MF_VW_FLX'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: MF_VW_FLX'
+  TZFIELD%CUNITS     = 'm2 s-2'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_MF_VW_FLX'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZWORK)
   !
  END IF
 END IF
diff --git a/src/MNH/turb_cloud_index.f90 b/src/MNH/turb_cloud_index.f90
index ee8eb7952f3ea5bf263decaf9d3895527c50b65f..0d49ad7110ebd52987a9bc091fd3980c4aa2c116 100644
--- a/src/MNH/turb_cloud_index.f90
+++ b/src/MNH/turb_cloud_index.f90
@@ -37,7 +37,7 @@ REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ  ! Jacobian * dry density of
 REAL, DIMENSION(:,:,:),   INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(OUT):: PCEI ! Cloud Entrainment instability
-                                             ! index to emphasize localy
+                                             ! index to emphasize locally
                                              ! turbulent fluxes
 !
 END SUBROUTINE TURB_CLOUD_INDEX
@@ -93,7 +93,10 @@ END MODULE MODI_TURB_CLOUD_INDEX
 !
 USE MODD_IO_ll, ONLY: TFILEDATA
 USE MODD_PARAMETERS, ONLY: JPVEXT
+!
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FMWRIT
+!
 USE MODI_GRADIENT_M
 !
 IMPLICIT NONE
@@ -119,7 +122,7 @@ REAL, DIMENSION(:,:,:),   INTENT(IN) :: PRHODJ  ! Jacobian * dry density of
 REAL, DIMENSION(:,:,:),   INTENT(IN) :: PDXX,PDYY,PDZZ,PDZX,PDZY
                                                   !  metric coefficients
 REAL, DIMENSION(:,:,:),   INTENT(OUT):: PCEI ! Cloud Entrainment instability
-                                             ! index to emphasize localy
+                                             ! index to emphasize locally
                                              ! turbulent fluxes
 !
 !*       0.2   declarations of local variables
@@ -143,19 +146,13 @@ INTEGER             :: IKU          ! array size in k
 INTEGER, DIMENSION(SIZE(PRM,1),SIZE(PRM,2),SIZE(PRM,3)) :: IMASK_CLOUD
                              ! 0 except cloudy points or adjacent points (1)
 INTEGER             :: IRESP        ! Return code of FM routines
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
-CHARACTER (LEN=28)  :: YFMFILE      ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
+TYPE(TFIELDDATA)    :: TZFIELD
 !
 !-------------------------------------------------------------------------------
 !
 !*       1.     INITIALISATION
 !               --------------
 !
-YFMFILE = TPFILE%CNAME
-!
 CALL GET_INDICE_ll (IIB,IJB,IIE,IJE)
 IKB = 1   + JPVEXT
 IKU = SIZE(PRM,3)
@@ -261,53 +258,93 @@ ENDDO
 !*       2.5    Writing
 !
 IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN
-  YRECFM  ='RVCI'
-  YCOMMENT='X_Y_Z_RVCI (kg/kg)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZRVCI,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZRVCI)
   !
-  YRECFM  ='GX_RVCI'
-  YCOMMENT='X_Y_Z_GX_RVCI (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZG_RVCI(:,:,:,1),IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'GX_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: GX_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_GX_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZG_RVCI(:,:,:,1))
   !
-  YRECFM  ='GY_RVCI'
-  YCOMMENT='X_Y_Z_GY_RVCI (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZG_RVCI(:,:,:,2),IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'GY_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: GY_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_GY_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZG_RVCI(:,:,:,2))
   !
-  YRECFM  ='GNORM_RVCI'
-  YCOMMENT='X_Y_Z_NORM G (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZGNORM_RVCI,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'GNORM_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: GNORM_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_NORM G'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZGNORM_RVCI)
   !
-  YRECFM  ='QX_RVCI'
-  YCOMMENT='X_Y_Z_QX_RVCI (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZQ_RVCI(:,:,:,1),IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'QX_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: QX_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_QX_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZQ_RVCI(:,:,:,1))
   !
-  YRECFM  ='QY_RVCI'
-  YCOMMENT='X_Y_Z_QY_RVCI (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZQ_RVCI(:,:,:,2),IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'QY_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: QY_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_QY_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZQ_RVCI(:,:,:,2))
   !
-  YRECFM  ='QNORM_RVCI'
-  YCOMMENT='X_Y_Z_QNORM_RVCI (kg/kg/m)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZQNORM_RVCI,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'QNORM_RVCI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: QNORM_RVCI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_QNORM_RVCI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZQNORM_RVCI)
   !
-  YRECFM  ='CEI'
-  YCOMMENT='X_Y_Z_CEI (kg/kg/m/s)'
-  IGRID   = 1
-  ILENCH  = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',PCEI,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'CEI'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: CEI'
+  TZFIELD%CUNITS     = 'kg kg-1 m-1 s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_CEI'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,PCEI)
 END IF
 !
 END SUBROUTINE TURB_CLOUD_INDEX
diff --git a/src/MNH/turb_hor_sv_flux.f90 b/src/MNH/turb_hor_sv_flux.f90
index 0ff2ace66e5ee05226f38c77439a52d04ca084a2..261b3da0a8d52d02cc5b975b82b13ae1937a5510 100644
--- a/src/MNH/turb_hor_sv_flux.f90
+++ b/src/MNH/turb_hor_sv_flux.f90
@@ -126,7 +126,9 @@ USE MODD_PARAMETERS
 USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND
 USE MODD_LES
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FMWRIT
+!
 USE MODI_GRADIENT_M
 USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
@@ -184,29 +186,23 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))       &
 REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),1) :: ZWORK2D
 !
 INTEGER             :: IRESP        ! Return code of FM routines 
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file 
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
 INTEGER             :: IKB,IKE
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain  
 INTEGER             :: JSV          ! loop counter
 INTEGER             :: ISV          ! number of scalar var.
-CHARACTER (LEN=28)  :: YFMFILE      ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
 REAL, DIMENSION(SIZE(PDZZ,1),SIZE(PDZZ,2),1+JPVEXT:3+JPVEXT) :: ZCOEFF 
                                     ! coefficients for the uncentred gradient 
                                     ! computation near the ground
 !
 INTEGER :: IKU
+TYPE(TFIELDDATA) :: TZFIELD
 REAL :: ZTIME1, ZTIME2
 ! ---------------------------------------------------------------------------
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
 !
-YFMFILE = TPFILE%CNAME
-!
 IKB = 1+JPVEXT               
 IKE = SIZE(PSVM,3)-JPVEXT   
 IKU = SIZE(PSVM,3)
@@ -256,11 +252,16 @@ DO JSV=1,ISV
   !
   ! stores  <U SVth>
   IF ( OCLOSE_OUT .AND. OTURB_FLX ) THEN
-    WRITE(YRECFM,'("USV_FLX_",I3.3)') JSV 
-    YCOMMENT='X_Y_Z_'//YRECFM//' (SVUNIT*M/S)'
-    IGRID   = 2
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZFLXX,IGRID,ILENCH,YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'("USV_FLX_",I3.3)') JSV
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'SVUNIT m s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%NGRID      = 2
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZFLXX)
   END IF
 !
   IF (LLES_CALL .AND. KSPLT==1) THEN
@@ -301,11 +302,16 @@ DO JSV=1,ISV
   !
   ! stores  <V SVth>
     IF ( OCLOSE_OUT .AND. OTURB_FLX ) THEN
-      WRITE(YRECFM,'("VSV_FLX_",I3.3)') JSV 
-      YCOMMENT='X_Y_Z_'//YRECFM//' (SVUNIT*M/S)'
-      IGRID   = 3
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZFLXY,IGRID,ILENCH,YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'("VSV_FLX_",I3.3)') JSV
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CUNITS     = 'SVUNIT m s-1'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%NGRID      = 3
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZFLXY)
     END IF
 !
   ELSE
diff --git a/src/MNH/ver_thermo.f90 b/src/MNH/ver_thermo.f90
index 80b01052c524afe3270284fc9200502cad93a298..c2b758fe473f7174eaeb93caf73418bfc55e02c1 100644
--- a/src/MNH/ver_thermo.f90
+++ b/src/MNH/ver_thermo.f90
@@ -180,6 +180,7 @@ USE MODD_LUNIT_n
 USE MODD_PARAMETERS
 !
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
 USE MODE_FMWRIT
 USE MODE_FM
 USE MODD_DIM_n
@@ -229,9 +230,6 @@ REAL, DIMENSION(SIZE(PJ,1),SIZE(PJ,2),SIZE(PJ,3)):: ZTHV
 REAL,DIMENSION(SIZE(PJ,1),SIZE(PJ,2),SIZE(PJ,3))   :: ZHEXNFLUX,ZHEXNMASS,ZPMHP
 REAL,DIMENSION(SIZE(PJ,1),SIZE(PJ,2),SIZE(PJ,3))   :: ZRHOD,ZSUMRT
 !
-CHARACTER(LEN=100) :: YCOMMENT
-INTEGER           :: ILENCH         ! ILENCH : length of comment string 
-CHARACTER(LEN=16)  :: YRECFM
 INTEGER      :: IINFO_ll
 TYPE(LIST_ll), POINTER :: TZFIELDS_ll => NULL()  ! list of fields to exchange
 !
@@ -239,6 +237,7 @@ INTEGER :: IISIZEXF,IJSIZEXF,IISIZEXFU,IJSIZEXFU     ! dimensions of the
 INTEGER :: IISIZEX4,IJSIZEX4,IISIZEX2,IJSIZEX2       ! West-east LB arrays
 INTEGER :: IISIZEYF,IJSIZEYF,IISIZEYFV,IJSIZEYFV     ! dimensions of the
 INTEGER :: IISIZEY4,IJSIZEY4,IISIZEY2,IJSIZEY2       ! North-south LB arrays
+TYPE(TFIELDDATA) :: TZFIELD
 
 !-------------------------------------------------------------------------------
 !
@@ -306,10 +305,16 @@ DO JRR=1,SIZE(XRT,4)
 END DO
 !
 IF (NVERB>=10) THEN
-  YRECFM='THV'
-  YCOMMENT='X_Y_Z_THV (K)'
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(CINIFILE,YRECFM,CLUOUT0,'XY',ZTHV(:,:,:),4,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'THV'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: THV'
+  TZFIELD%CUNITS     = 'K'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_THV'
+  TZFIELD%NGRID      = 4
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT0,IRESP,ZTHV)
 END IF
 !-------------------------------------------------------------------------------
 !
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index f5a76edcfb87862cc4c9e6a70b9e5b163452fc4a..8d98c2183394171e8ed386be7b171dcca0374588 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -302,23 +302,34 @@ IF (NSV >=1) THEN
            & IGRID,ILENCH,YCOMMENT,IRESP)
     END IF
   END DO
-  DO JSV = NSV_C2R2BEG,NSV_C2R2END
-    IF(NSIZELBXSV_ll /= 0) THEN
-      YRECFM='LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV,' (/M3)'  
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBX",XLBXSVM(:,:,:,JSV),IRIMX,NSIZELBXSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-    END IF
-!
-    IF(NSIZELBYSV_ll /= 0) THEN
-      YRECFM='LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV,' (/M3)'  
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBY",XLBYSVM(:,:,:,JSV),IRIMY,NSIZELBYSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
-    END IF
-  END DO
+  !
+  IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'm-3'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    DO JSV = NSV_C2R2BEG,NSV_C2R2END
+      IF(NSIZELBXSV_ll /= 0) THEN
+        TZFIELD%CLBTYPE    = 'LBX'
+        TZFIELD%CMNHNAME   = 'LBX_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+        CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
+      END IF
+      !
+      IF(NSIZELBYSV_ll /= 0) THEN
+        TZFIELD%CLBTYPE    = 'LBY'
+        TZFIELD%CMNHNAME   = 'LBY_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+        CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
+      END IF
+    END DO
+  END IF
+  !
   DO JSV = NSV_C1R3BEG,NSV_C1R3END
     IF(NSIZELBXSV_ll /= 0) THEN
       YRECFM='LBX_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
@@ -645,7 +656,7 @@ IF (NSV >=1) THEN
           TZFIELD%CMNHNAME   = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBX'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
           CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
         END IF             
         !
@@ -653,7 +664,7 @@ IF (NSV >=1) THEN
           TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
           TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
           TZFIELD%CLBTYPE    = 'LBY'
-          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
           CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
         END IF
       END DO
@@ -834,20 +845,27 @@ IF (NSV >=1) THEN
   END DO
   ! passive pollutants  
   DO JSV = NSV_PPBEG,NSV_PPEND
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'kg kg-1'
+    TZFIELD%CDIR       = '--'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     IF(NSIZELBXSV_ll /= 0) THEN
-      YRECFM = 'LBX_PP'
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV,' (KG/KG)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBX",XLBXSVM(:,:,:,JSV),IRIMX,NSIZELBXSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'LBX_PP'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CLBTYPE    = 'LBX'
+      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'2_Y_Z_','LBXSVM',JSV
+      CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
     END IF
 !
     IF(NSIZELBYSV_ll /= 0) THEN
-      YRECFM = 'LBY_PP'
-      WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV,' (KG/KG)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBY",XLBYSVM(:,:,:,JSV),IRIMY,NSIZELBYSV_ll,&
-           & IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'LBY_PP'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CLBTYPE    = 'LBY'
+      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3)')'X_2_Z_','LBYSVM',JSV
+      CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
     END IF
   END DO
 
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 3a50f97a1d43fb3a16e87aea385221f1dc195a6c..87e61abbfa21c03673b6ca98a2fe7894a09c88e4 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -671,14 +671,22 @@ IF (NSV >=1) THEN
     JSA=JSA+1
   END DO
   ! microphysical C2R2 scheme scalar variables
-  DO JSV = NSV_C2R2BEG,NSV_C2R2END
-    YRECFM=TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
-    WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (/M3)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                YCOMMENT,IRESP)
-    JSA=JSA+1
-  END DO
+  IF (NSV_C2R2END>=NSV_C2R2BEG) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'm-3'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    DO JSV = NSV_C2R2BEG,NSV_C2R2END
+      TZFIELD%CMNHNAME   = TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))//'T'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
+      JSA=JSA+1
+    END DO
+  END IF
   ! microphysical C3R5 scheme additional scalar variables
   DO JSV = NSV_C1R3BEG,NSV_C1R3END
     YRECFM=TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))//'T'
@@ -691,12 +699,14 @@ IF (NSV >=1) THEN
 !
 ! microphysical LIMA variables
 !
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = 'kg-1'
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%NGRID      = 1
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
+  IF (NSV_LIMA_END>=NSV_LIMA_BEG) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'kg-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+  END IF
   !
   DO JSV = NSV_LIMA_BEG,NSV_LIMA_END
     !
@@ -918,41 +928,29 @@ IF (NSV >=1) THEN
   END DO
   ! Passive scalar variables        
   IF (LPASPOL) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 'kg kg-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     DO JSV = NSV_PPBEG,NSV_PPEND
-      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-      WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                  YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'(A3,I3.3)')'SVT',JSV
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
       JSA=JSA+1
     END DO
   END IF
 !
   IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN
-      YRECFM= 'SUPSATMAX'
-      YCOMMENT='X_Y_Z_Supersaturation'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSUPSAT(:,:,:),IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-!
-      YRECFM= 'NACT'
-      YCOMMENT='X_Y_Z_Nact'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XNACT(:,:,:),IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+    CALL IO_WRITE_FIELD(TPFILE,'SUPSATMAX',CLUOUT,IRESP,XSUPSAT(:,:,:))
+    CALL IO_WRITE_FIELD(TPFILE,'NACT',     CLUOUT,IRESP,XNACT(:,:,:))
   END IF
   IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LSUPSAT) THEN
-      YRECFM= 'SSPRO'
-      YCOMMENT='X_Y_Z_Supersaturation'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSSPRO(:,:,:),IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-!
-      YRECFM= 'NPRO'
-      YCOMMENT='X_Y_Z_Nact'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XNPRO(:,:,:),IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+    CALL IO_WRITE_FIELD(TPFILE,'SSPRO',CLUOUT,IRESP,XSSPRO(:,:,:))
+    CALL IO_WRITE_FIELD(TPFILE,'NPRO', CLUOUT,IRESP,XNPRO(:,:,:))
   END IF
 !
 #ifdef MNH_FOREFIRE