diff --git a/src/LIB/SURCOUCHE/src/mode_field.f90 b/src/LIB/SURCOUCHE/src/mode_field.f90
index 27aa93d13d4471d532e62dcd71bb96057ad94c18..f485d1f133b2f1e8a04666036a7adb6af0b5fd83 100644
--- a/src/LIB/SURCOUCHE/src/mode_field.f90
+++ b/src/LIB/SURCOUCHE/src/mode_field.f90
@@ -1675,6 +1675,24 @@ IDX = IDX+1
 END IF ! CPROGRAM=MESONH
 !
 !
+IF (CPROGRAM == 'MESONH' .OR. TRIM(CPROGRAM) == 'DIAG') THEN
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'CIT'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: CIT'
+TFIELDLIST(IDX)%CUNITS     = 'm-3'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_Z_Cloud Ice concentration'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 3
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X3D(IMODEL))
+IDX = IDX+1
+!
+END IF ! CPROGRAM=MESONH .OR. DIAG
+!
+!
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'RHODREF'
 TFIELDLIST(IDX)%CSTDNAME   = ''
@@ -1972,6 +1990,58 @@ TFIELDLIST(IDX)%NDIMS      = 2
 ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
 IDX = IDX+1
 !
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'IC_RATE'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: IC_RATE'
+TFIELDLIST(IDX)%CUNITS     = 's-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_IntraCloud lightning Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'CG_RATE'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: CG_RATE'
+TFIELDLIST(IDX)%CUNITS     = 's-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CloudGround lightning Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'IC_TOTAL_NB'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: IC_TOTAL_NB'
+TFIELDLIST(IDX)%CUNITS     = '1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_IntraCloud lightning Number'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'CG_TOTAL_NB'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: CG_TOTAL_NB'
+TFIELDLIST(IDX)%CUNITS     = '1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_CloudGround lightning Number'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
 END IF !CDCONV /= 'NONE' .OR. CSCONV == 'KAFR'
 END IF !CPROGRAM/=PGD , NESPGD, SPAWN
 !
@@ -2081,6 +2151,58 @@ ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
 IDX = IDX+1
 !
 IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'INPRC'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INPRC'
+TFIELDLIST(IDX)%CUNITS     = 'm s-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Cloud Precipitation Rain Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ACPRC'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ACPRC'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Cloud Precipitation Rain Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'INDEP'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INDEP'
+TFIELDLIST(IDX)%CUNITS     = 'm s-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous Cloud Deposition Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ACDEP'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ACDEP'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated Cloud Deposition Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
 TFIELDLIST(IDX)%CMNHNAME   = 'INPRR'
 TFIELDLIST(IDX)%CSTDNAME   = 'rainfall_rate'
 TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INPRR'
@@ -2133,6 +2255,84 @@ TFIELDLIST(IDX)%NDIMS      = 2
 ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
 IDX = IDX+1
 !
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'INPRS'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INPRS'
+TFIELDLIST(IDX)%CUNITS     = 'm s-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Snow Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ACPRS'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ACPRS'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Snow Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'INPRG'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INPRG'
+TFIELDLIST(IDX)%CUNITS     = 'm s-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Graupel Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ACPRG'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ACPRG'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Graupel Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'INPRH'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: INPRH'
+TFIELDLIST(IDX)%CUNITS     = 'm s-1'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_INstantaneous PRecipitation Hail Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
+IF(IDX>MAXFIELDS) CALL ERR_INI_FIELD_LIST()
+TFIELDLIST(IDX)%CMNHNAME   = 'ACPRH'
+TFIELDLIST(IDX)%CSTDNAME   = ''
+TFIELDLIST(IDX)%CLONGNAME  = 'MesoNH: ACPRH'
+TFIELDLIST(IDX)%CUNITS     = 'm'
+TFIELDLIST(IDX)%CDIR       = 'XY'
+TFIELDLIST(IDX)%CCOMMENT   = 'X_Y_ACcumulated PRecipitation Hail Rate'
+TFIELDLIST(IDX)%NGRID      = 1
+TFIELDLIST(IDX)%NTYPE      = TYPEREAL
+TFIELDLIST(IDX)%NDIMS      = 2
+ALLOCATE(TFIELDLIST(IDX)%TFIELD_X2D(IMODEL))
+IDX = IDX+1
+!
 WRITE(YMSG,'("number of used fields=",I4," out of ",I4)') IDX-1,MAXFIELDS
 CALL PRINT_MSG(NVERB_INFO,'GEN','INI_FIELD_LIST',TRIM(YMSG))
 !
@@ -2510,6 +2710,7 @@ IF (CPROGRAM == 'MESONH') THEN
     TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XRRS_CLD(:,:,:,CONF_MODEL(KFROM)%IDX_RHT)
   END IF
   CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCLDFR
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CIT',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XCIT
   !
 END IF
 !
@@ -2607,14 +2808,18 @@ END IF
 !
 IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN
 IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCOUNTCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRVCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRCCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRICONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',   IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRSCONV
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPACCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',  IID,IRESP); TFIELDLIST(IID)%TFIELD_N2D(KFROM)%DATA => NCOUNTCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDTHCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRVCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRCCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XDRICONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',     IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPACCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XPRSCONV
+  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_RATE
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE',    IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_RATE
+  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XIC_TOTAL_NUMBER
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XCG_TOTAL_NUMBER
 END IF
 END IF
 !
@@ -2631,10 +2836,20 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); TFIELDLIST(IID)%TFIELD_X
 !
 ! MODD_PRECIP_n variables
 !
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRC
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRC
+CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINDEP
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACDEP
 CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRR
 CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XINPRR3D
 CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); TFIELDLIST(IID)%TFIELD_X3D(KFROM)%DATA => XEVAP3D
 CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRR
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRS
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRS
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRG
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRG
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XINPRH
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',  IID,IRESP); TFIELDLIST(IID)%TFIELD_X2D(KFROM)%DATA => XACPRH
 !
 !
 !
@@ -2726,6 +2941,7 @@ IF (CPROGRAM == 'MESONH') THEN
   CALL FIND_FIELD_ID_FROM_MNHNAME('WS_PRES',IID,IRESP); XRWS_PRES => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
   CALL FIND_FIELD_ID_FROM_MNHNAME('THS_CLD',IID,IRESP); XRTHS_CLD => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
   CALL FIND_FIELD_ID_FROM_MNHNAME('CLDFR',  IID,IRESP); XCLDFR    => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CIT',    IID,IRESP); XCIT      => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 END IF
 !
 ! MODD_PAST_FIELD_n variables
@@ -2929,15 +3145,18 @@ END IF
 !
 IF (TRIM(CPROGRAM) /= 'PGD' .AND. TRIM(CPROGRAM) /= 'NESPGD' .AND. TRIM(CPROGRAM) /= 'SPAWN') THEN
 IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
-  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',IID,IRESP); NCOUNTCONV => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',  IID,IRESP); XDTHCONV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',  IID,IRESP); XDRVCONV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',  IID,IRESP); XDRCCONV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',  IID,IRESP); XDRICONV   => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',   IID,IRESP); XPRCONV    => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',  IID,IRESP); XPRSCONV   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',  IID,IRESP); XPACCONV   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
-
+  CALL FIND_FIELD_ID_FROM_MNHNAME('COUNTCONV',  IID,IRESP); NCOUNTCONV       => TFIELDLIST(IID)%TFIELD_N2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DTHCONV',    IID,IRESP); XDTHCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRVCONV',    IID,IRESP); XDRVCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRCCONV',    IID,IRESP); XDRCCONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('DRICONV',    IID,IRESP); XDRICONV         => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRCONV',     IID,IRESP); XPRCONV          => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PACCONV',    IID,IRESP); XPACCONV         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('PRSCONV',    IID,IRESP); XPRSCONV         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_RATE',    IID,IRESP); XIC_RATE         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_RATE',    IID,IRESP); XCG_RATE         => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('IC_TOTAL_NB',IID,IRESP); XIC_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+  CALL FIND_FIELD_ID_FROM_MNHNAME('CG_TOTAL_NB',IID,IRESP); XCG_TOTAL_NUMBER => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
 END IF
 END IF
 !
@@ -2954,10 +3173,20 @@ CALL FIND_FIELD_ID_FROM_MNHNAME('SSO_STDEV',IID,IRESP); XSSO_STDEV      => TFIEL
 !
 ! MODD_PRECIP_n variables
 !
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',  IID,IRESP); XINPRC   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',  IID,IRESP); XACPRC   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('INDEP',  IID,IRESP); XINDEP   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACDEP',  IID,IRESP); XACDEP   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR',  IID,IRESP); XINPRR   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('INPRR3D',IID,IRESP); XINPRR3D => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('EVAP3D', IID,IRESP); XEVAP3D  => TFIELDLIST(IID)%TFIELD_X3D(KTO)%DATA
 CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRR',  IID,IRESP); XACPRR   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',  IID,IRESP); XINPRS   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',  IID,IRESP); XACPRS   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',  IID,IRESP); XINPRG   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',  IID,IRESP); XACPRG   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',  IID,IRESP); XINPRH   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
+CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',  IID,IRESP); XACPRH   => TFIELDLIST(IID)%TFIELD_X2D(KTO)%DATA
 !
 END IF !KFROM/=KTO
 !
diff --git a/src/MNH/goto_model_wrapper.f90 b/src/MNH/goto_model_wrapper.f90
index 834db53558eec2041befa3a8d7e54f9f2d3a12cd..c6ec88e2760cd76aa147093b6bf53529ccedc66f 100644
--- a/src/MNH/goto_model_wrapper.f90
+++ b/src/MNH/goto_model_wrapper.f90
@@ -170,7 +170,7 @@ CALL PASPOL_GOTO_MODEL(KFROM, KTO)
 #ifdef MNH_FOREFIRE
 CALL FOREFIRE_GOTO_MODEL(KFROM, KTO)
 #endif
-CALL PRECIP_GOTO_MODEL(KFROM, KTO)
+!CALL PRECIP_GOTO_MODEL(KFROM, KTO)
 CALL ELEC_GOTO_MODEL(KFROM, KTO)
 CALL PROFILER_GOTO_MODEL(KFROM, KTO)
 CALL RADIATIONS_GOTO_MODEL(KFROM, KTO)
diff --git a/src/MNH/modd_deep_convectionn.f90 b/src/MNH/modd_deep_convectionn.f90
index ed180329cab7ea380ba33da2d187dd3766868617..7b19db8a81a73083610da0f3873451af6b539053 100644
--- a/src/MNH/modd_deep_convectionn.f90
+++ b/src/MNH/modd_deep_convectionn.f90
@@ -67,10 +67,10 @@ TYPE DEEP_CONVECTION_t
   INTEGER,DIMENSION(:,:), POINTER :: NCLTOPCONV=>NULL()! convective cloud top level
   INTEGER,DIMENSION(:,:), POINTER :: NCLBASCONV=>NULL()! convective cloud base level
 !
-  REAL, DIMENSION(:,:) ,  POINTER :: XIC_RATE=>NULL()  ! IC lightning frequency
-  REAL, DIMENSION(:,:) ,  POINTER :: XCG_RATE=>NULL()  ! CG lightning frequency
-  REAL, DIMENSION(:,:) ,  POINTER :: XIC_TOTAL_NUMBER=>NULL()  !Total number of IC
-  REAL, DIMENSION(:,:) ,  POINTER :: XCG_TOTAL_NUMBER=>NULL()  !Total number of CG
+!  REAL, DIMENSION(:,:) ,  POINTER :: XIC_RATE=>NULL()  ! IC lightning frequency
+!  REAL, DIMENSION(:,:) ,  POINTER :: XCG_RATE=>NULL()  ! CG lightning frequency
+!  REAL, DIMENSION(:,:) ,  POINTER :: XIC_TOTAL_NUMBER=>NULL()  !Total number of IC
+!  REAL, DIMENSION(:,:) ,  POINTER :: XCG_TOTAL_NUMBER=>NULL()  !Total number of CG
 
 END TYPE DEEP_CONVECTION_t
 
@@ -121,10 +121,10 @@ DEEP_CONVECTION_MODEL(KFROM)%XPRSFLXCONV=>XPRSFLXCONV
 DEEP_CONVECTION_MODEL(KFROM)%XCAPE=>XCAPE
 DEEP_CONVECTION_MODEL(KFROM)%NCLTOPCONV=>NCLTOPCONV
 DEEP_CONVECTION_MODEL(KFROM)%NCLBASCONV=>NCLBASCONV
-DEEP_CONVECTION_MODEL(KFROM)%XIC_RATE=>XIC_RATE
-DEEP_CONVECTION_MODEL(KFROM)%XCG_RATE=>XCG_RATE
-DEEP_CONVECTION_MODEL(KFROM)%XIC_TOTAL_NUMBER=>XIC_TOTAL_NUMBER
-DEEP_CONVECTION_MODEL(KFROM)%XCG_TOTAL_NUMBER=>XCG_TOTAL_NUMBER
+!DEEP_CONVECTION_MODEL(KFROM)%XIC_RATE=>XIC_RATE !Done in FIELDLIST_GOTO_MODEL
+!DEEP_CONVECTION_MODEL(KFROM)%XCG_RATE=>XCG_RATE !Done in FIELDLIST_GOTO_MODEL
+!DEEP_CONVECTION_MODEL(KFROM)%XIC_TOTAL_NUMBER=>XIC_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
+!DEEP_CONVECTION_MODEL(KFROM)%XCG_TOTAL_NUMBER=>XCG_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
 !
 ! Current model is set to model KTO
 !NCOUNTCONV=>DEEP_CONVECTION_MODEL(KTO)%NCOUNTCONV !Done in FIELDLIST_GOTO_MODEL
@@ -144,10 +144,10 @@ XPRSFLXCONV=>DEEP_CONVECTION_MODEL(KTO)%XPRSFLXCONV
 XCAPE=>DEEP_CONVECTION_MODEL(KTO)%XCAPE
 NCLTOPCONV=>DEEP_CONVECTION_MODEL(KTO)%NCLTOPCONV
 NCLBASCONV=>DEEP_CONVECTION_MODEL(KTO)%NCLBASCONV
-XIC_RATE=>DEEP_CONVECTION_MODEL(KTO)%XIC_RATE
-XCG_RATE=>DEEP_CONVECTION_MODEL(KTO)%XCG_RATE
-XIC_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XIC_TOTAL_NUMBER
-XCG_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XCG_TOTAL_NUMBER
+!XIC_RATE=>DEEP_CONVECTION_MODEL(KTO)%XIC_RATE !Done in FIELDLIST_GOTO_MODEL
+!XCG_RATE=>DEEP_CONVECTION_MODEL(KTO)%XCG_RATE !Done in FIELDLIST_GOTO_MODEL
+!XIC_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XIC_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
+!XCG_TOTAL_NUMBER=>DEEP_CONVECTION_MODEL(KTO)%XCG_TOTAL_NUMBER !Done in FIELDLIST_GOTO_MODEL
 
 END SUBROUTINE DEEP_CONVECTION_GOTO_MODEL
 
diff --git a/src/MNH/modd_fieldn.f90 b/src/MNH/modd_fieldn.f90
index 3f3d0a469d18df7c926920d77b4f74d7c2898bab..8a0845b68ded82a12bd694c268b0fefe8ef055b6 100644
--- a/src/MNH/modd_fieldn.f90
+++ b/src/MNH/modd_fieldn.f90
@@ -103,7 +103,7 @@ TYPE FIELD_t
 !  REAL, DIMENSION(:,:,:), POINTER :: XSIGS=>NULL()    ! =sqrt(<s's'>) for the
 !                                                     ! Subgrid Condensation
 !  REAL, DIMENSION(:,:,:), POINTER :: XCLDFR=>NULL()   ! cloud fraction
-  REAL, DIMENSION(:,:,:), POINTER :: XCIT=>NULL()     ! Pristine ice concentration
+!  REAL, DIMENSION(:,:,:), POINTER :: XCIT=>NULL()     ! Pristine ice concentration
   REAL, DIMENSION(:,:,:), POINTER :: XTHM=>NULL()      ! Theta at Previous time step 
   REAL, DIMENSION(:,:,:), POINTER :: XRCM=>NULL()      ! Cloud mixing ratio at Previous time step
   REAL, DIMENSION(:,:,:), POINTER :: XPABSM=>NULL()      ! Theta at Previous time step 
@@ -180,7 +180,7 @@ FIELD_MODEL(KFROM)%XSRC=>XSRC
 !FIELD_MODEL(KFROM)%XSRCT=>XSRCT !Done in FIELDLIST_GOTO_MODEL
 !FIELD_MODEL(KFROM)%XSIGS=>XSIGS !Done in FIELDLIST_GOTO_MODEL
 !FIELD_MODEL(KFROM)%XCLDFR=>XCLDFR !Done in FIELDLIST_GOTO_MODEL
-FIELD_MODEL(KFROM)%XCIT=>XCIT
+!FIELD_MODEL(KFROM)%XCIT=>XCIT !Done in FIELDLIST_GOTO_MODEL
 FIELD_MODEL(KFROM)%XTHM=>XTHM
 FIELD_MODEL(KFROM)%XPABSM=>XPABSM
 FIELD_MODEL(KFROM)%XRCM=>XRCM
@@ -217,7 +217,7 @@ XSRC=>FIELD_MODEL(KTO)%XSRC
 !XSRCT=>FIELD_MODEL(KTO)%XSRCT !Done in FIELDLIST_GOTO_MODEL
 !XSIGS=>FIELD_MODEL(KTO)%XSIGS !Done in FIELDLIST_GOTO_MODEL
 !XCLDFR=>FIELD_MODEL(KTO)%XCLDFR !Done in FIELDLIST_GOTO_MODEL
-XCIT=>FIELD_MODEL(KTO)%XCIT
+!XCIT=>FIELD_MODEL(KTO)%XCIT !Done in FIELDLIST_GOTO_MODEL
 XTHM=>FIELD_MODEL(KTO)%XTHM
 XPABSM=>FIELD_MODEL(KTO)%XPABSM
 XRCM=>FIELD_MODEL(KTO)%XRCM
diff --git a/src/MNH/modd_precipn.f90 b/src/MNH/modd_precipn.f90
index 645ec2b2a3cb673285791931b759e1b8d535d259..fffa53c9c990562e8c9a2f521610fab63e88a5ad 100644
--- a/src/MNH/modd_precipn.f90
+++ b/src/MNH/modd_precipn.f90
@@ -45,30 +45,14 @@
 USE MODD_PARAMETERS, ONLY: JPMODELMAX
 IMPLICIT NONE
 
-TYPE PRECIP_t
-!
-  REAL, DIMENSION(:,:), POINTER :: XINPRC=>NULL(), XACPRC=>NULL(),  &
-                   XINDEP=>NULL(), XACDEP=>NULL(),                  &
-!                   XINPRR=>NULL(), XACPRR=>NULL(),                  &
-                   XINPRS=>NULL(), XACPRS=>NULL(), XINPRG=>NULL(),  &
-                   XACPRG=>NULL(), XINPRH=>NULL(), XACPRH=>NULL()
-                                         ! Instant and cumul of ground
-                                         ! precipitation fields of Cloud,Rain, 
-                                         !    Snow, Graupel and Hail
-!  REAL, DIMENSION(:,:,:), POINTER :: XINPRR3D=>NULL(), & !Instant precip 3D
-!                   XEVAP3D=>NULL()! Evap profile 3D
-!
-END TYPE PRECIP_t
-
-TYPE(PRECIP_t), DIMENSION(JPMODELMAX), TARGET, SAVE :: PRECIP_MODEL
-
-REAL, DIMENSION(:,:), POINTER :: XINPRC=>NULL(), XACPRC=>NULL(),  &
-                 XINDEP=>NULL(), XACDEP=>NULL(),                  &
-                 XINPRR=>NULL(), XACPRR=>NULL(),                  &
-                 XINPRG=>NULL(), XINPRS=>NULL(), XACPRS=>NULL(),  &
-                 XACPRG=>NULL(), XINPRH=>NULL(), XACPRH=>NULL()
-  REAL, DIMENSION(:,:,:), POINTER :: XINPRR3D=>NULL(), & !Instant precip 3D
-                   XEVAP3D=>NULL()! Evap profile 3D
+REAL, DIMENSION(:,:), POINTER :: XINPRC=>NULL(), XACPRC=>NULL(), & ! Instant and cumul of ground
+                                 XINDEP=>NULL(), XACDEP=>NULL(), & ! precipitation fields of Cloud, Rain,
+                                 XINPRR=>NULL(), XACPRR=>NULL(), & ! Snow, Graupel and Hail
+                                 XINPRS=>NULL(), XACPRS=>NULL(), &
+                                 XINPRG=>NULL(), XACPRG=>NULL(), &
+                                 XINPRH=>NULL(), XACPRH=>NULL()
+REAL, DIMENSION(:,:,:), POINTER :: XINPRR3D=>NULL(), & !Instant precip 3D
+                                   XEVAP3D =>NULL()    ! Evap profile 3D
 
 CONTAINS
 
@@ -76,40 +60,6 @@ SUBROUTINE PRECIP_GOTO_MODEL(KFROM, KTO)
 !
 INTEGER, INTENT(IN) :: KFROM, KTO
 !
-INTEGER :: IID,IRESP
-!
-! Save current state for allocated arrays
-PRECIP_MODEL(KFROM)%XINPRC=>XINPRC
-PRECIP_MODEL(KFROM)%XACPRC=>XACPRC
-PRECIP_MODEL(KFROM)%XINDEP=>XINDEP
-PRECIP_MODEL(KFROM)%XACDEP=>XACDEP
-!PRECIP_MODEL(KFROM)%XINPRR=>XINPRR !Done in FIELDLIST_GOTO_MODEL
-!PRECIP_MODEL(KFROM)%XINPRR3D=>XINPRR3D !Done in FIELDLIST_GOTO_MODEL
-!PRECIP_MODEL(KFROM)%XEVAP3D=>XEVAP3D !Done in FIELDLIST_GOTO_MODEL
-!PRECIP_MODEL(KFROM)%XACPRR=>XACPRR !Done in FIELDLIST_GOTO_MODEL
-PRECIP_MODEL(KFROM)%XINPRS=>XINPRS
-PRECIP_MODEL(KFROM)%XACPRS=>XACPRS
-PRECIP_MODEL(KFROM)%XINPRG=>XINPRG
-PRECIP_MODEL(KFROM)%XACPRG=>XACPRG
-PRECIP_MODEL(KFROM)%XINPRH=>XINPRH
-PRECIP_MODEL(KFROM)%XACPRH=>XACPRH
-!
-! Current model is set to model KTO
-XINPRC=>PRECIP_MODEL(KTO)%XINPRC
-XACPRC=>PRECIP_MODEL(KTO)%XACPRC
-XINDEP=>PRECIP_MODEL(KTO)%XINDEP
-XACDEP=>PRECIP_MODEL(KTO)%XACDEP
-!XINPRR=>PRECIP_MODEL(KTO)%XINPRR !Done in FIELDLIST_GOTO_MODEL
-!XINPRR3D=>PRECIP_MODEL(KTO)%XINPRR3D !Done in FIELDLIST_GOTO_MODEL
-!XEVAP3D=>PRECIP_MODEL(KTO)%XEVAP3D !Done in FIELDLIST_GOTO_MODEL
-!XACPRR=>PRECIP_MODEL(KTO)%XACPRR !Done in FIELDLIST_GOTO_MODEL
-XINPRS=>PRECIP_MODEL(KTO)%XINPRS
-XACPRS=>PRECIP_MODEL(KTO)%XACPRS
-XINPRG=>PRECIP_MODEL(KTO)%XINPRG
-XACPRG=>PRECIP_MODEL(KTO)%XACPRG
-XINPRH=>PRECIP_MODEL(KTO)%XINPRH
-XACPRH=>PRECIP_MODEL(KTO)%XACPRH
-
 END SUBROUTINE PRECIP_GOTO_MODEL
 
 END MODULE MODD_PRECIP_n
diff --git a/src/MNH/modd_spawn.f90 b/src/MNH/modd_spawn.f90
index 6dcdc45869f468969550fe77856bd421c78f2375..1e61f69b440d4d8c6165ebada9157fdc455a07c7 100644
--- a/src/MNH/modd_spawn.f90
+++ b/src/MNH/modd_spawn.f90
@@ -90,9 +90,20 @@ REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSVM1
 REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSWM1
 REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSTHM1
 REAL,DIMENSION(:,:,:),SAVE,POINTER :: XLSRVM1
+!
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XINPRC1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XACPRC1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XINDEP1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XACDEP1
 REAL,DIMENSION(:,:),  SAVE,POINTER :: XINPRR1
 REAL,DIMENSION(:,:,:),SAVE,POINTER :: XINPRR3D1
 REAL,DIMENSION(:,:,:),SAVE,POINTER :: XEVAP3D1
 REAL,DIMENSION(:,:),  SAVE,POINTER :: XACPRR1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XINPRS1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XACPRS1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XINPRG1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XACPRG1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XINPRH1
+REAL,DIMENSION(:,:),  SAVE,POINTER :: XACPRH1
 !
 END MODULE MODD_SPAWN
diff --git a/src/MNH/spawn_surf2_rain.f90 b/src/MNH/spawn_surf2_rain.f90
index dd984b3ce2366fb83061305307318bdad10af1f8..38b6f46d8dd148e04ad3ccf8af316f36a76d14de 100644
--- a/src/MNH/spawn_surf2_rain.f90
+++ b/src/MNH/spawn_surf2_rain.f90
@@ -116,7 +116,6 @@ END MODULE MODI_SPAWN_SURF2_RAIN
 !*       0.     DECLARATIONS
 !               ------------
 USE MODD_LBC_n,   ONLY : LBC_MODEL
-USE MODD_PRECIP_n,ONLY : PRECIP_MODEL
 USE MODD_BIKHARDT_n
 USE MODD_LUNIT_n, ONLY : CLUOUT
 USE MODD_FIELD_n, ONLY : XTHT
@@ -204,14 +203,14 @@ IF (KDXRATIO == 1 .AND. KDYRATIO == 1 ) THEN
 !
 !*       3.1   special case of spawning - no change of resolution :
 !
-  IF (SIZE(PRECIP_MODEL(1)%XINPRC) /= 0 ) THEN
-    PINPRC(:,:) = PRECIP_MODEL(1)%XINPRC(KXOR:KXEND,KYOR:KYEND)
-    PACPRC(:,:) = PRECIP_MODEL(1)%XACPRC(KXOR:KXEND,KYOR:KYEND)
+  IF (SIZE(XINPRC1) /= 0 ) THEN
+    PINPRC(:,:) = XINPRC1(KXOR:KXEND,KYOR:KYEND)
+    PACPRC(:,:) = XACPRC1(KXOR:KXEND,KYOR:KYEND)
   END IF
 !
-  IF (SIZE(PRECIP_MODEL(1)%XINDEP) /= 0 ) THEN
-    PINDEP(:,:) = PRECIP_MODEL(1)%XINDEP(KXOR:KXEND,KYOR:KYEND)
-    PACDEP(:,:) = PRECIP_MODEL(1)%XACDEP(KXOR:KXEND,KYOR:KYEND)
+  IF (SIZE(XINDEP1) /= 0 ) THEN
+    PINDEP(:,:) = XINDEP1(KXOR:KXEND,KYOR:KYEND)
+    PACDEP(:,:) = XACDEP1(KXOR:KXEND,KYOR:KYEND)
   END IF
 !
   IF (SIZE(XINPRR1) /= 0 ) THEN
@@ -221,19 +220,19 @@ IF (KDXRATIO == 1 .AND. KDYRATIO == 1 ) THEN
     PACPRR(:,:)     = XACPRR1  (KXOR:KXEND,KYOR:KYEND)
   END IF
 !
-  IF (SIZE(PRECIP_MODEL(1)%XINPRS) /= 0 ) THEN
-    PINPRS(:,:) = PRECIP_MODEL(1)%XINPRS(KXOR:KXEND,KYOR:KYEND)
-    PACPRS(:,:) = PRECIP_MODEL(1)%XACPRS(KXOR:KXEND,KYOR:KYEND)
+  IF (SIZE(XINPRS1) /= 0 ) THEN
+    PINPRS(:,:) = XINPRS1(KXOR:KXEND,KYOR:KYEND)
+    PACPRS(:,:) = XACPRS1(KXOR:KXEND,KYOR:KYEND)
   END IF
 !
-  IF (SIZE(PRECIP_MODEL(1)%XINPRG) /= 0 ) THEN
-    PINPRG(:,:) = PRECIP_MODEL(1)%XINPRG(KXOR:KXEND,KYOR:KYEND)
-    PACPRG(:,:) = PRECIP_MODEL(1)%XACPRG(KXOR:KXEND,KYOR:KYEND)
+  IF (SIZE(XINPRG1) /= 0 ) THEN
+    PINPRG(:,:) = XINPRG1(KXOR:KXEND,KYOR:KYEND)
+    PACPRG(:,:) = XACPRG1(KXOR:KXEND,KYOR:KYEND)
   END IF
 !
-  IF (SIZE(PRECIP_MODEL(1)%XINPRH) /= 0 ) THEN
-    PINPRH(:,:) = PRECIP_MODEL(1)%XINPRH(KXOR:KXEND,KYOR:KYEND)
-    PACPRH(:,:) = PRECIP_MODEL(1)%XACPRH(KXOR:KXEND,KYOR:KYEND)
+  IF (SIZE(XINPRH1) /= 0 ) THEN
+    PINPRH(:,:) = XINPRH1(KXOR:KXEND,KYOR:KYEND)
+    PACPRH(:,:) = XACPRH1(KXOR:KXEND,KYOR:KYEND)
   END IF
 !
 !
@@ -249,32 +248,32 @@ ELSE
 !
   IF ( YMETHOD == 'BI' ) THEN
 !
-    IF (SIZE(PRECIP_MODEL(1)%XINPRC) /= 0 ) THEN
-      IDIMX = SIZE(PRECIP_MODEL(1)%XINPRC,1)
-      IDIMY = SIZE(PRECIP_MODEL(1)%XINPRC,2)
+    IF (SIZE(XINPRC1) /= 0 ) THEN
+      IDIMX = SIZE(XINPRC1,1)
+      IDIMY = SIZE(XINPRC1,2)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XINPRC,PINPRC)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XINPRC1,PINPRC)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XACPRC,PACPRC)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XACPRC1,PACPRC)
      PINPRC(:,:)=MAX(0.,PINPRC(:,:))
      PACPRC(:,:)=MAX(0.,PACPRC(:,:))
     END IF
 !
-    IF (SIZE(PRECIP_MODEL(1)%XINDEP) /= 0 ) THEN
-      IDIMX = SIZE(PRECIP_MODEL(1)%XINDEP,1)
-      IDIMY = SIZE(PRECIP_MODEL(1)%XINDEP,2)
+    IF (SIZE(XINDEP1) /= 0 ) THEN
+      IDIMX = SIZE(XINDEP1,1)
+      IDIMY = SIZE(XINDEP1,2)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XINDEP,PINDEP)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XINDEP1,PINDEP)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XACDEP,PACDEP)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XACDEP1,PACDEP)
      PINDEP(:,:)=MAX(0.,PINDEP(:,:))
      PACDEP(:,:)=MAX(0.,PACDEP(:,:))
     END IF
@@ -304,47 +303,47 @@ ELSE
      PACPRR(:,:)=MAX(0.,PACPRR(:,:))
     END IF
 !
-    IF (SIZE(PRECIP_MODEL(1)%XINPRS) /= 0 ) THEN
-      IDIMX = SIZE(PRECIP_MODEL(1)%XINPRS,1)
-      IDIMY = SIZE(PRECIP_MODEL(1)%XINPRS,2)
+    IF (SIZE(XINPRS1) /= 0 ) THEN
+      IDIMX = SIZE(XINPRS1,1)
+      IDIMY = SIZE(XINPRS1,2)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XINPRS,PINPRS)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XINPRS1,PINPRS)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XACPRS,PACPRS)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XACPRS1,PACPRS)
      PINPRS(:,:)=MAX(0.,PINPRS(:,:))
      PACPRS(:,:)=MAX(0.,PACPRS(:,:))
     END IF
 !
-    IF (SIZE(PRECIP_MODEL(1)%XINPRG) /= 0 ) THEN
-      IDIMX = SIZE(PRECIP_MODEL(1)%XINPRG,1)
-      IDIMY = SIZE(PRECIP_MODEL(1)%XINPRG,2)
+    IF (SIZE(XINPRG1) /= 0 ) THEN
+      IDIMX = SIZE(XINPRG1,1)
+      IDIMY = SIZE(XINPRG1,2)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XINPRG,PINPRG)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XINPRG1,PINPRG)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XACPRG,PACPRG)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XACPRG1,PACPRG)
      PINPRG(:,:)=MAX(0.,PINPRG(:,:))
      PACPRG(:,:)=MAX(0.,PACPRG(:,:))
     END IF
 !
-    IF (SIZE(PRECIP_MODEL(1)%XINPRH) /= 0 ) THEN
-      IDIMX = SIZE(PRECIP_MODEL(1)%XINPRH,1)
-      IDIMY = SIZE(PRECIP_MODEL(1)%XINPRH,2)
+    IF (SIZE(XINPRH1) /= 0 ) THEN
+      IDIMX = SIZE(XINPRH1,1)
+      IDIMY = SIZE(XINPRH1,2)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XINPRH,PINPRH)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XINPRH1,PINPRH)
       CALL BIKHARDT(XBMX1,XBMX2,XBMX3,XBMX4,XBMY1,XBMY2,XBMY3,XBMY4, &
                     XBFX1,XBFX2,XBFX3,XBFX4,XBFY1,XBFY2,XBFY3,XBFY4, &
                     2,2,IDIMX-1,IDIMY-1,KDXRATIO,KDYRATIO,1,       &
-                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,PRECIP_MODEL(1)%XACPRH,PACPRH)
+                    LBC_MODEL(1)%CLBCX,LBC_MODEL(1)%CLBCY,XACPRH1,PACPRH)
      PINPRH(:,:)=MAX(0.,PINPRH(:,:))
      PACPRH(:,:)=MAX(0.,PACPRH(:,:))
     END IF
@@ -359,7 +358,7 @@ END IF
 !             ----------------------------
 !
 IF (PRESENT(HSONFILE)) THEN
-  IF (SIZE(PRECIP_MODEL(1)%XINPRC) /= 0 ) THEN
+  IF (SIZE(XINPRC1) /= 0 ) THEN
     ALLOCATE(ZINPRC1(KIUSON,KJUSON))
     ALLOCATE(ZACPRC1(KIUSON,KJUSON))
     YGETRRT='READ'
@@ -368,7 +367,7 @@ IF (PRESENT(HSONFILE)) THEN
     ALLOCATE(ZACPRC1(0,0))
     YGETRRT='SKIP'
   END IF
-  IF (SIZE(PRECIP_MODEL(1)%XINDEP) /= 0 ) THEN
+  IF (SIZE(XINDEP1) /= 0 ) THEN
     ALLOCATE(ZINDEP1(KIUSON,KJUSON))
     ALLOCATE(ZACDEP1(KIUSON,KJUSON))
     YGETRRT='READ'
@@ -390,7 +389,7 @@ IF (PRESENT(HSONFILE)) THEN
     ALLOCATE(ZACPRR1(0,0))
     YGETRRT='SKIP'
   END IF
-  IF (SIZE(PRECIP_MODEL(1)%XINPRS) /= 0 ) THEN
+  IF (SIZE(XINPRS1) /= 0 ) THEN
     ALLOCATE(ZINPRS1(KIUSON,KJUSON))
     ALLOCATE(ZACPRS1(KIUSON,KJUSON))
     YGETRST='READ'
@@ -399,7 +398,7 @@ IF (PRESENT(HSONFILE)) THEN
     ALLOCATE(ZACPRS1(0,0))
     YGETRST='SKIP'
   END IF
-  IF (SIZE(PRECIP_MODEL(1)%XINPRG) /= 0 ) THEN
+  IF (SIZE(XINPRG1) /= 0 ) THEN
     ALLOCATE(ZINPRG1(KIUSON,KJUSON))
     ALLOCATE(ZACPRG1(KIUSON,KJUSON))
     YGETRGT='READ'
@@ -408,7 +407,7 @@ IF (PRESENT(HSONFILE)) THEN
     ALLOCATE(ZACPRG1(0,0))
     YGETRGT='SKIP'
   END IF
-  IF (SIZE(PRECIP_MODEL(1)%XINPRH) /= 0 ) THEN
+  IF (SIZE(XINPRH1) /= 0 ) THEN
     ALLOCATE(ZINPRH1(KIUSON,KJUSON))
     ALLOCATE(ZACPRH1(KIUSON,KJUSON))
     YGETRHT='READ'
@@ -422,11 +421,11 @@ IF (PRESENT(HSONFILE)) THEN
                          ZINPRC1,ZACPRC1,ZINDEP1,ZACDEP1,ZINPRR1,ZINPRR3D1,ZEVAP3D1,              &
                          ZACPRR1,ZINPRS1,ZACPRS1,                                 &
                          ZINPRG1,ZACPRG1,ZINPRH1,ZACPRH1                          )
-  IF (SIZE(PRECIP_MODEL(1)%XINPRC) /= 0 ) THEN
+  IF (SIZE(XINPRC1) /= 0 ) THEN
     PINPRC(KIB2:KIE2,KJB2:KJE2) = ZINPRC1(KIB1:KIE1,KJB1:KJE1)
     PACPRC(KIB2:KIE2,KJB2:KJE2) = ZACPRC1(KIB1:KIE1,KJB1:KJE1)
   END IF
-  IF (SIZE(PRECIP_MODEL(1)%XINDEP) /= 0 ) THEN
+  IF (SIZE(XINDEP1) /= 0 ) THEN
     PINDEP(KIB2:KIE2,KJB2:KJE2) = ZINDEP1(KIB1:KIE1,KJB1:KJE1)
     PACDEP(KIB2:KIE2,KJB2:KJE2) = ZACDEP1(KIB1:KIE1,KJB1:KJE1)
   END IF
@@ -444,19 +443,19 @@ IF (PRESENT(HSONFILE)) THEN
   DEALLOCATE(ZINPRR3D1)
   DEALLOCATE(ZEVAP3D1)
   DEALLOCATE(ZACPRR1)
-  IF (SIZE(PRECIP_MODEL(1)%XINPRS) /= 0 ) THEN
+  IF (SIZE(XINPRS1) /= 0 ) THEN
     PINPRS(KIB2:KIE2,KJB2:KJE2) = ZINPRS1(KIB1:KIE1,KJB1:KJE1)
     PACPRS(KIB2:KIE2,KJB2:KJE2) = ZACPRS1(KIB1:KIE1,KJB1:KJE1)
   END IF
   DEALLOCATE(ZINPRS1)
   DEALLOCATE(ZACPRS1)
-  IF (SIZE(PRECIP_MODEL(1)%XINPRG) /= 0 ) THEN
+  IF (SIZE(XINPRG1) /= 0 ) THEN
     PINPRG(KIB2:KIE2,KJB2:KJE2) = ZINPRG1(KIB1:KIE1,KJB1:KJE1)
     PACPRG(KIB2:KIE2,KJB2:KJE2) = ZACPRG1(KIB1:KIE1,KJB1:KJE1)
   END IF
   DEALLOCATE(ZINPRG1)
   DEALLOCATE(ZACPRG1)
-  IF (SIZE(PRECIP_MODEL(1)%XINPRH) /= 0 ) THEN
+  IF (SIZE(XINPRH1) /= 0 ) THEN
     PINPRH(KIB2:KIE2,KJB2:KJE2) = ZINPRH1(KIB1:KIE1,KJB1:KJE1)
     PACPRH(KIB2:KIE2,KJB2:KJE2) = ZACPRH1(KIB1:KIE1,KJB1:KJE1)
   END IF
diff --git a/src/MNH/spawning.f90 b/src/MNH/spawning.f90
index b537f31b57ad43e937899570366cc0edb833aaff..e835499141e1e13ea3e540b8128f2181cc79b537 100644
--- a/src/MNH/spawning.f90
+++ b/src/MNH/spawning.f90
@@ -289,10 +289,22 @@ XLSVM1 => XLSVM
 XLSWM1 => XLSWM
 XLSTHM1 => XLSTHM
 XLSRVM1 => XLSRVM
+!
+XINPRC1 => XINPRC
+XACPRC1 => XACPRC
+XINDEP1 => XINDEP
+XACDEP1 => XACDEP
 XINPRR1 => XINPRR
 XINPRR3D1 => XINPRR3D
 XEVAP3D1 => XEVAP3D
 XACPRR1 => XACPRR
+XINPRS1 => XINPRS
+XACPRS1 => XACPRS
+XINPRG1 => XINPRG
+XACPRG1 => XACPRG
+XINPRH1 => XINPRH
+XACPRH1 => XACPRH
+
 !
 END SUBROUTINE SET_POINTERS_TO_MODEL1
 !
diff --git a/src/MNH/uv_to_zonal_and_merid.f90 b/src/MNH/uv_to_zonal_and_merid.f90
index f30f3ba305d600dd4a3cfce460ce3190d01845b2..c47045258bbd42d26838eb7290c8ef64e2bff308 100644
--- a/src/MNH/uv_to_zonal_and_merid.f90
+++ b/src/MNH/uv_to_zonal_and_merid.f90
@@ -8,35 +8,33 @@
       MODULE MODI_UV_TO_ZONAL_AND_MERID
 !     #################################
 INTERFACE UV_TO_ZONAL_AND_MERID
-      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,HRECU,HRECV,HCOMMENT)
+      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
 USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_FIELD, ONLY: TFIELDDATA
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PU    ! input U component
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PV    ! input V component
-INTEGER,                INTENT(IN) :: KGRID ! grid positions of components
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC   ! output U component
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC   ! output V component
-TYPE(TFILEDATA),  OPTIONAL, INTENT(IN) :: TPFILE    ! Output file
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECU     ! Name of the U article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECV     ! Name of the V article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCOMMENT  ! Comment string
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 !
-      SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,HRECU,HRECV,HCOMMENT)
+      SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
 USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_FIELD, ONLY: TFIELDDATA
 !
-REAL, DIMENSION(:,:), INTENT(IN) :: PU    ! input U component
-REAL, DIMENSION(:,:), INTENT(IN) :: PV    ! input V component
-INTEGER,              INTENT(IN) :: KGRID ! grid positions of components
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC   ! output U component
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC   ! output V component
-TYPE(TFILEDATA),  OPTIONAL, INTENT(IN) :: TPFILE    ! Output file
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECU     ! Name of the U article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECV     ! Name of the V article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCOMMENT  ! Comment string
+REAL, DIMENSION(:,:),                    INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:),                    INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID2D
 !
@@ -48,26 +46,25 @@ END MODULE MODI_UV_TO_ZONAL_AND_MERID
 !     ###################################
 INTERFACE
 !
-      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,HRECU,HRECV,HCOMMENT)
+      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !
 USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_FIELD, ONLY: TFIELDDATA
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PU    ! input U component
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PV    ! input V component
-INTEGER,                INTENT(IN) :: KGRID ! grid positions of components
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC   ! output U component
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC   ! output V component
-TYPE(TFILEDATA),  OPTIONAL, INTENT(IN) :: TPFILE    ! Output file
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECU     ! Name of the U article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECV     ! Name of the V article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCOMMENT  ! Comment string
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 END INTERFACE
 END MODULE MODI_UV_TO_ZONAL_AND_MERID3D
 !
 !     ##########################################
-      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC, TPFILE,HRECU,HRECV,HCOMMENT)
+      SUBROUTINE UV_TO_ZONAL_AND_MERID3D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !     ##########################################
 !
 !!****  *UV_TO_ZONAL_AND_MERID* - compute the zonal and meridien components
@@ -106,14 +103,16 @@ END MODULE MODI_UV_TO_ZONAL_AND_MERID3D
 USE MODD_CONF
 USE MODD_CST
 USE MODD_GRID
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODD_IO_ll, ONLY: TFILEDATA,NVERB_ERROR,NVERB_INFO,NVERB_WARNING
 USE MODD_PARAMETERS
 USE MODD_DIM_n
 USE MODD_GRID_n
 USE MODD_LUNIT_n
 !
+USE MODE_FIELD, ONLY: TFIELDDATA
 USE MODE_FM
 USE MODE_FMWRIT
+USE MODE_MSG
 !
 USE MODI_SHUMAN
 !
@@ -121,29 +120,25 @@ IMPLICIT NONE
 !
 !*      0.1    declarations of arguments
 !
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PU    ! input U component
-REAL, DIMENSION(:,:,:), INTENT(IN) :: PV    ! input V component
-INTEGER,                INTENT(IN) :: KGRID ! grid positions of components
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PZC   ! output U component
-REAL, DIMENSION(:,:,:), OPTIONAL, INTENT(OUT) :: PMC   ! output V component
-TYPE(TFILEDATA),  OPTIONAL, INTENT(IN) :: TPFILE    ! Output file
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECU     ! Name of the U article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECV     ! Name of the V article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCOMMENT  ! Comment string
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:,:),                  INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:,:),        OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 !*      0.2    declarations of local variables
 !
 INTEGER                            :: IKU
 REAL                               :: ZRAD_O_DG
-REAL, DIMENSION(:,:), ALLOCATABLE  :: ZWORK2
-REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZWORK3
-REAL, DIMENSION(:,:,:), ALLOCATABLE:: ZZC,ZMC
+REAL, DIMENSION(:,:),  ALLOCATABLE :: ZWORK2
+REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZWORK3
+REAL, DIMENSION(:,:,:),ALLOCATABLE :: ZZC,ZMC
 !
 INTEGER           :: IGRID          ! grid indicator
 INTEGER           :: IRESP          ! return-code for the file routines
-INTEGER           :: ILENCH         ! length of comment string
 INTEGER           :: ILUOUT         ! logical unit for output listing
-CHARACTER(LEN=28) :: YFMFILE        ! Name of FM-file to write
 !-----------------------------------------------------------------
 !
 
@@ -168,7 +163,8 @@ DEALLOCATE(ZWORK2)
 ! Zonal and Meridien components of wind
 !
 IF (KGRID==23) THEN
-  WRITE(ILUOUT,*) '- zonal and meridien components of winds are computed'
+  WRITE(ILUOUT,*) '- zonal and meridian components of winds are computed'
+  CALL PRINT_MSG(NVERB_INFO,'GEN','UV_TO_ZONAL_AND_MERID3D','zonal and meridian components of winds are computed')
   WHERE ( (PU(:,:,:) /= XUNDEF) .AND. (PV(:,:,:) /= XUNDEF) ) 
     ZZC(:,:,:) =  PU(:,:,:) *MXM(COS(ZWORK3(:,:,:))) &
               + MYF(MXM(PV(:,:,:))) *MXM(SIN(ZWORK3(:,:,:)))
@@ -179,7 +175,8 @@ IF (KGRID==23) THEN
     ZMC(:,:,:) = XUNDEF
   END WHERE
 ELSE IF (KGRID==11) THEN
-  WRITE(ILUOUT,*) '- zonal and meridien components of winds are computed'
+  WRITE(ILUOUT,*) '- zonal and meridian components of winds are computed'
+  CALL PRINT_MSG(NVERB_INFO,'GEN','UV_TO_ZONAL_AND_MERID3D','zonal and meridian components of winds are computed')
   WHERE ( (PU(:,:,:) /= XUNDEF) .AND. (PV(:,:,:) /= XUNDEF) ) 
     ZZC(:,:,:) = PU(:,:,:) *COS(ZWORK3(:,:,:)) +PV(:,:,:) *SIN(ZWORK3(:,:,:))
     ZMC(:,:,:) = - PU(:,:,:) *SIN(ZWORK3(:,:,:)) +PV(:,:,:) *COS(ZWORK3(:,:,:))
@@ -192,6 +189,7 @@ ELSE IF (KGRID==0) THEN
 ! in this case, input winds are ZONal and MERidien
 !          and, output ones are in MesoNH grid (mass points)
   WRITE(ILUOUT,*) '- components of winds are replaced in MesoNH grid'
+  CALL PRINT_MSG(NVERB_INFO,'GEN','UV_TO_ZONAL_AND_MERID3D','components of winds are replaced in MesoNH grid')
   WHERE ( (PU(:,:,:) /= XUNDEF) .AND. (PV(:,:,:) /= XUNDEF) ) 
     ZZC(:,:,:) = COS(ZWORK3(:,:,:))* PU(:,:,:) - SIN(ZWORK3(:,:,:))* PV(:,:,:)
     ZMC(:,:,:) = SIN(ZWORK3(:,:,:))* PU(:,:,:) + COS(ZWORK3(:,:,:))* PV(:,:,:)
@@ -201,29 +199,38 @@ ELSE IF (KGRID==0) THEN
   END WHERE
 ELSE
   WRITE(ILUOUT,*) '- warning in uv_to_zonal_and_merid: no computation for GRID= ',KGRID
+  CALL PRINT_MSG(NVERB_ERROR,'GEN','UV_TO_ZONAL_AND_MERID3D','invalid KGRID value')
   RETURN
 END IF
 !
-IF (PRESENT(TPFILE)) THEN
-  YFMFILE = TPFILE%CNAME
-  ILENCH=LEN(HCOMMENT)
-  SELECT CASE (KGRID)
-    CASE(23)
-      IGRID=2
-      CALL FMWRIT(YFMFILE,HRECU,CLUOUT,'XY',ZZC,IGRID,ILENCH,HCOMMENT,IRESP)
-      IGRID=3
-      CALL FMWRIT(YFMFILE,HRECV,CLUOUT,'XY',ZMC,IGRID,ILENCH,HCOMMENT,IRESP)
-    CASE(11,0)
-      IGRID=1
-      CALL FMWRIT(YFMFILE,HRECU,CLUOUT,'XY',ZZC,IGRID,ILENCH,HCOMMENT,IRESP)
-      IGRID=1
-      CALL FMWRIT(YFMFILE,HRECV,CLUOUT,'XY',ZMC,IGRID,ILENCH,HCOMMENT,IRESP)
-  END SELECT
-ELSE IF (PRESENT(PZC) .AND. PRESENT(PMC)) THEN
-  PZC(:,:,:) = ZZC(:,:,:)
-  PMC(:,:,:) = ZMC(:,:,:)
+IF(PRESENT(TPFILE)) THEN
+  IF(.NOT.PRESENT(TZFIELDS)) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID3D','TPFILE provided without TZFIELDS')
+    RETURN
+  END IF
+  !
+  IF ( KGRID==23 ) THEN
+    IF ( TZFIELDS(1)%NGRID/=2 .OR. TZFIELDS(2)%NGRID/=3 ) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID3D','inconsistent values for TZFIELDS(x)%NGRID')
+    END IF
+  ELSE IF ( KGRID==0 .OR. KGRID==11 ) THEN
+    IF ( TZFIELDS(1)%NGRID/=1 .OR. TZFIELDS(2)%NGRID/=1 ) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID3D','inconsistent values for TZFIELDS(x)%NGRID')
+    END IF
+  END IF
+  !
+  IF ( TZFIELDS(1)%CDIR/='XY' .OR. TZFIELDS(2)%CDIR/='XY' ) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID3D','inconsistent values for TZFIELDS(x)%HDIR')
+  END IF
+  !
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELDS(1),CLUOUT,IRESP,ZZC(:,:,:))
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELDS(2),CLUOUT,IRESP,ZMC(:,:,:))
+ELSE IF (PRESENT(PZC).AND.PRESENT(PMC)) THEN
+  PZC(:,:,:)=ZZC(:,:,:)
+  PMC(:,:,:)=ZMC(:,:,:)
 ELSE
   WRITE(ILUOUT,*) '- warning in uv_to_zonal_and_merid3d: bad optional arguments'
+  CALL PRINT_MSG(NVERB_WARNING,'GEN','UV_TO_ZONAL_AND_MERID3D','bad optional arguments')
   RETURN
 END IF
 !
@@ -235,7 +242,7 @@ END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 !
 !
 !     ##########################################
-      SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,HRECU,HRECV,HCOMMENT)
+      SUBROUTINE UV_TO_ZONAL_AND_MERID2D(PU,PV,KGRID,PZC,PMC,TPFILE,TZFIELDS)
 !     ##########################################
 !
 !!****  *UV_TO_ZONAL_AND_MERID* - compute the zonal and meridien components
@@ -271,35 +278,34 @@ END SUBROUTINE UV_TO_ZONAL_AND_MERID3D
 !*       0.     DECLARATIONS
 !               ------------
 !
+USE MODD_IO_ll, ONLY: TFILEDATA,NVERB_WARNING
 USE MODD_LUNIT_n
-USE MODI_UV_TO_ZONAL_AND_MERID3D
+!
+USE MODE_FIELD, ONLY: TFIELDDATA
 USE MODE_FM
 USE MODE_FMWRIT
-USE MODD_IO_ll, ONLY: TFILEDATA
+USE MODE_MSG
+!
+USE MODI_UV_TO_ZONAL_AND_MERID3D
 !
 IMPLICIT NONE
 !
 !*      0.1    declarations of arguments
 !
-REAL, DIMENSION(:,:), INTENT(IN) :: PU    ! input U component
-REAL, DIMENSION(:,:), INTENT(IN) :: PV    ! input V component
-INTEGER,              INTENT(IN) :: KGRID ! grid positions of components
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PZC   ! output U component
-REAL, DIMENSION(:,:), OPTIONAL, INTENT(OUT) :: PMC   ! output V component
-TYPE(TFILEDATA),  OPTIONAL, INTENT(IN) :: TPFILE    ! Output file
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECU     ! Name of the U article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HRECV     ! Name of the V article
-CHARACTER(LEN=*), OPTIONAL, INTENT(IN) :: HCOMMENT  ! Comment string
+REAL, DIMENSION(:,:),                    INTENT(IN)  :: PU       ! Input U component
+REAL, DIMENSION(:,:),                    INTENT(IN)  :: PV       ! Input V component
+INTEGER,                                 INTENT(IN)  :: KGRID    ! Grid positions of components
+REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PZC      ! Output U component
+REAL, DIMENSION(:,:),          OPTIONAL, INTENT(OUT) :: PMC      ! Output V component
+TYPE(TFILEDATA),               OPTIONAL, INTENT(IN)  :: TPFILE   ! Output file
+TYPE(TFIELDDATA),DIMENSION(2), OPTIONAL, INTENT(IN)  :: TZFIELDS ! Fields characteristics
 !
 !*      0.2    declarations of local variables
 !
 REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2),1) :: ZU3D,ZV3D
 REAL, DIMENSION(SIZE(PU,1),SIZE(PU,2),1) :: ZZC3D,ZMC3D
-INTEGER           :: IGRID          ! grid indicator
 INTEGER           :: IRESP          ! return-code for the file routines
-INTEGER           :: ILENCH         ! length of comment string
 INTEGER           :: ILUOUT         ! logical unit for output listing
-CHARACTER(LEN=28) :: YFMFILE        ! Name of FM-file to write
 !
 !-----------------------------------------------------------------
 !
@@ -311,25 +317,33 @@ ZV3D(:,:,1)=PV(:,:)
 CALL UV_TO_ZONAL_AND_MERID3D(ZU3D,ZV3D,KGRID,PZC=ZZC3D,PMC=ZMC3D)
 !
 IF(PRESENT(TPFILE)) THEN
-  YFMFILE = TPFILE%CNAME
-  ILENCH=LEN(HCOMMENT)
-  SELECT CASE (KGRID)
-    CASE(23)
-      IGRID=2
-      CALL FMWRIT(YFMFILE,HRECU,CLUOUT,'XY',ZZC3D(:,:,1),IGRID,ILENCH,HCOMMENT,IRESP)
-      IGRID=3
-      CALL FMWRIT(YFMFILE,HRECV,CLUOUT,'XY',ZMC3D(:,:,1),IGRID,ILENCH,HCOMMENT,IRESP)
-    CASE(11,0)
-      IGRID=1
-      CALL FMWRIT(YFMFILE,HRECU,CLUOUT,'XY',ZZC3D(:,:,1),IGRID,ILENCH,HCOMMENT,IRESP)
-      IGRID=1
-      CALL FMWRIT(YFMFILE,HRECV,CLUOUT,'XY',ZMC3D(:,:,1),IGRID,ILENCH,HCOMMENT,IRESP)
-  END SELECT
+  IF(.NOT.PRESENT(TZFIELDS)) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID2D','TPFILE provided without TZFIELDS')
+    RETURN
+  END IF
+  !
+  IF ( KGRID==23 ) THEN
+    IF ( TZFIELDS(1)%NGRID/=2 .OR. TZFIELDS(2)%NGRID/=3 ) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID2D','inconsistent values for TZFIELDS(x)%NGRID')
+    END IF
+  ELSE IF ( KGRID==0 .OR. KGRID==11 ) THEN
+    IF ( TZFIELDS(1)%NGRID/=1 .OR. TZFIELDS(2)%NGRID/=1 ) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID2D','inconsistent values for TZFIELDS(x)%NGRID')
+    END IF
+  END IF
+  !
+  IF ( TZFIELDS(1)%CDIR/='XY' .OR. TZFIELDS(2)%CDIR/='XY' ) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO','UV_TO_ZONAL_AND_MERID2D','inconsistent values for TZFIELDS(x)%HDIR')
+  END IF
+  !
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELDS(1),CLUOUT,IRESP,ZZC3D(:,:,1))
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELDS(2),CLUOUT,IRESP,ZMC3D(:,:,1))
 ELSE IF (PRESENT(PZC).AND.PRESENT(PMC)) THEN
   PZC(:,:)=ZZC3D(:,:,1)
   PMC(:,:)=ZMC3D(:,:,1)
 ELSE
   WRITE(ILUOUT,*) '- warning in uv_to_zonal_and_merid2d: bad optional arguments'
+  CALL PRINT_MSG(NVERB_WARNING,'GEN','UV_TO_ZONAL_AND_MERID2D','bad optional arguments')
   RETURN
 END IF
 !
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index f46ada8da769760f13afe05a53299c8bb06c245e..1bc762938b9cb1aee12e7bdf259ecdaa26fdab02 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -263,21 +263,35 @@ TZFIELD%CLBTYPE = 'NONE' !Just to be careful
 !
 
 IF (NSV >=1) THEN
-  YRECFM = 'HORELAX_SV'
-  YCOMMENT=' '
-  ILENCH=LEN(YCOMMENT)
-  GHORELAX_SV=ANY ( LHORELAX_SV ) 
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,GHORELAX_SV,IGRID,ILENCH,YCOMMENT,IRESP)  
+  GHORELAX_SV=ANY ( LHORELAX_SV )
+!
+  TZFIELD%CMNHNAME   = 'HORELAX_SV'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: HORELAX_SV'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = ''
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPELOG
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,GHORELAX_SV)
+!
   IGRID=1
   IRIMX =(NSIZELBXSV_ll-2*JPHEXT)/2
   IRIMY =(NSIZELBYSV_ll-2*JPHEXT)/2
   DO JSV = 1,NSV_USER
     IF(NSIZELBXSV_ll /= 0) THEN
-      WRITE(YRECFM,'(A6,I3.3)')'LBXSVM',JSV
-      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)
+      WRITE(TZFIELD%CMNHNAME,'(A6,I3.3)')'LBXSVM',JSV
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      TZFIELD%CLBTYPE    = 'LBX'
+      TZFIELD%CUNITS     = 'kg kg-1'
+      TZFIELD%CDIR       = '--'
+      WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
     END IF
 !
     IF(NSIZELBYSV_ll /= 0) THEN
@@ -450,21 +464,27 @@ IF (NSV >=1) THEN
 
   END IF
   !
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'kg kg-1'
+  TZFIELD%CDIR       = '--'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
   DO JSV = NSV_CHEMBEG,NSV_CHEMEND
     IF(NSIZELBXSV_ll /= 0) THEN
-      YRECFM = 'LBX_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      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_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
+      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_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-      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_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
+      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_lfifm1_for_diag.f90 b/src/MNH/write_lfifm1_for_diag.f90
index 8d9a8fe9609b6a8b37179d91cd50da19702e5d47..c86eb04355b60b469ae6b4a5e1f31283dc0ee998 100644
--- a/src/MNH/write_lfifm1_for_diag.f90
+++ b/src/MNH/write_lfifm1_for_diag.f90
@@ -229,6 +229,7 @@ USE MODI_GPS_ZENITH
 USE MODI_GATHER_ll
 !
 USE MODE_GRIDPROJ
+USE MODE_FIELD
 USE MODE_FMWRIT
 USE MODE_ll
 USE MODE_IO_ll
@@ -258,14 +259,11 @@ CHARACTER(LEN=28) :: YFMFILE2       ! Temporary variable to store FM-file name
 CHARACTER(LEN=16) :: YRECFM         ! Name of the article to be written
 CHARACTER(LEN=100):: YCOMMENT       ! Comment string
 !
-CHARACTER(LEN=2)  :: YSTORAGE_TYPE  ! type of the new DIAG file ('DI')
-!
 CHARACTER(LEN=3)  :: YFRC           ! to mark the time of the forcing
 CHARACTER(LEN=31) :: YFGRI          ! file name for GPS stations
 !
 INTEGER           :: IIU,IJU,IKU,IIB,IJB,IKB,IIE,IJE,IKE ! Arrays bounds
 ! 
-INTEGER                :: IRR
 INTEGER                :: JLOOP,JI,JJ,JK,JSV,JT,JH,JV,JEL    ! loop index
 INTEGER :: IMI ! Current model index
 ! 
@@ -326,6 +324,8 @@ INTEGER :: ILUOUT0 ! Logical unit number for output-listing
 !
 CHARACTER(LEN=2)  :: INDICE
 INTEGER           :: I
+TYPE(TFIELDDATA)              :: TZFIELD
+TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2
 !
 ! LIMA LIDAR
 REAL,DIMENSION(:,:,:,:), ALLOCATABLE :: ZTMP1, ZTMP2, ZTMP3, ZTMP4
@@ -351,126 +351,43 @@ CALL FMLOOK_ll(CLUOUT0,CLUOUT0,ILUOUT0,IRESP)
 !
 !*       1.0    YFMFILE2 and HDADFILE :
 !
-YRECFM='MASDEV'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',NMASDEV,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BUGFIX'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',NBUGFIX,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BIBUSER'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',CBIBUSER,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='PROGRAM'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',CPROGRAM,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='L1D'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',L1D,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='L2D'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',L2D,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='PACK'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',LPACK,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='MY_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',YFMFILE2,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DAD_NAME'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',HDADFILE,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'MASDEV',   CLUOUT,IRESP,NMASDEV)
+CALL IO_WRITE_FIELD(TPFILE,'BUGFIX',   CLUOUT,IRESP,NBUGFIX)
+CALL IO_WRITE_FIELD(TPFILE,'BIBUSER',  CLUOUT,IRESP,CBIBUSER)
+CALL IO_WRITE_FIELD(TPFILE,'PROGRAM',  CLUOUT,IRESP,CPROGRAM)
+!
+CALL IO_WRITE_FIELD(TPFILE,'L1D',      CLUOUT,IRESP,L1D)
+CALL IO_WRITE_FIELD(TPFILE,'L2D',      CLUOUT,IRESP,L2D)
+CALL IO_WRITE_FIELD(TPFILE,'PACK',     CLUOUT,IRESP,LPACK)
+!
+CALL IO_WRITE_FIELD(TPFILE,'MY_NAME',  CLUOUT,IRESP,TPFILE%CNAME)
+CALL IO_WRITE_FIELD(TPFILE,'DAD_NAME', CLUOUT,IRESP,HDADFILE)
 !
 IF (LEN_TRIM(HDADFILE)>0) THEN
-  CALL FMWRIT(YFMFILE2,'DXRATIO',CLUOUT,'--',NDXRATIO_ALL(1),0,ILENCH,YCOMMENT,IRESP)
-  CALL FMWRIT(YFMFILE2,'DYRATIO',CLUOUT,'--',NDYRATIO_ALL(1),0,ILENCH,YCOMMENT,IRESP)
-  CALL FMWRIT(YFMFILE2,'XOR',CLUOUT,'--',NXOR_ALL(1),0,ILENCH,YCOMMENT,IRESP)
-  CALL FMWRIT(YFMFILE2,'YOR',CLUOUT,'--',NYOR_ALL(1),0,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'DXRATIO',CLUOUT,IRESP,NDXRATIO_ALL(1))
+  CALL IO_WRITE_FIELD(TPFILE,'DYRATIO',CLUOUT,IRESP,NDYRATIO_ALL(1))
+  CALL IO_WRITE_FIELD(TPFILE,'XOR',    CLUOUT,IRESP,NXOR_ALL(1))
+  CALL IO_WRITE_FIELD(TPFILE,'YOR',    CLUOUT,IRESP,NYOR_ALL(1))
 END IF
 !
-YRECFM='SURF'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',CSURF,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'SURF',     CLUOUT,IRESP,CSURF)
 !
 !*       1.1    Type and Dimensions :
 !
-YRECFM='STORAGE_TYPE'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-YSTORAGE_TYPE='DI'
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',YSTORAGE_TYPE,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='IMAX'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',NIMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='JMAX'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',NJMAX_ll,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='KMAX'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',NKMAX,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='JPHEXT'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',JPHEXT,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'STORAGE_TYPE',CLUOUT,IRESP,'DI')
+!
+CALL IO_WRITE_FIELD(TPFILE,'IMAX',CLUOUT,IRESP,NIMAX_ll)
+CALL IO_WRITE_FIELD(TPFILE,'JMAX',CLUOUT,IRESP,NJMAX_ll)
+CALL IO_WRITE_FIELD(TPFILE,'KMAX',CLUOUT,IRESP,NKMAX)
+!
+CALL IO_WRITE_FIELD(TPFILE,'JPHEXT',CLUOUT,IRESP,JPHEXT)
 !
 !*       1.2    Grid variables :
 !
 IF (.NOT.LCARTESIAN) THEN
-  YRECFM='RPK'
-  YCOMMENT='projection parameter'
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XRPK,IGRID,ILENCH,YCOMMENT,IRESP)
-! 
-  YRECFM='LONORI'
-  YCOMMENT='longitude of the origin point (DEGREES)'
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLONORI,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='LATORI'
-  YCOMMENT='latitude of the origin point (DEGREES)'
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLATORI,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'RPK',   CLUOUT,IRESP,XRPK)
+  CALL IO_WRITE_FIELD(TPFILE,'LONORI',CLUOUT,IRESP,XLONORI)
+  CALL IO_WRITE_FIELD(TPFILE,'LATORI',CLUOUT,IRESP,XLATORI)
 ! 
 !* diagnostic of 1st mass point
 !
@@ -482,130 +399,53 @@ IF (.NOT.LCARTESIAN) THEN
   CALL SM_LATLON(XLATORI,XLONORI,ZXHATM,ZYHATM,ZLATOR,ZLONOR)
   DEALLOCATE(ZXHAT_ll,ZYHAT_ll)
 !
-  YRECFM='LONOR'
-  YCOMMENT='longitude of the mass point 1-1 (DEGREES)'
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',ZLONOR,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-  YRECFM='LATOR'
-  YCOMMENT='latitude of the mass point 1-1 (DEGREES)'
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',ZLATOR,IGRID,ILENCH,YCOMMENT,IRESP)
+  !LONOR and LATOR not in TFIELDLIST because local variables
+  TZFIELD%CMNHNAME   = 'LONOR'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: LONOR'
+  TZFIELD%CUNITS     = 'degree'
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = 'Longitude of 1st mass point'
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZLONOR)
+!
+  TZFIELD%CMNHNAME   = 'LATOR'
+  TZFIELD%CLONGNAME  = 'MesoNH: LATOR'
+  TZFIELD%CCOMMENT   = 'Latitude of 1st mass point'
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZLATOR)
 !
 END IF 
 !
-YRECFM='THINSHELL'
-YCOMMENT=' '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',LTHINSHELL,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='LAT0'
-YCOMMENT='reference latitude for conformal projection (DEGREES)'
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLAT0,IGRID,ILENCH,YCOMMENT,IRESP)
-! 
-YRECFM='LON0'
-YCOMMENT='reference longitude for conformal projection (DEGREES)'
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLON0,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='BETA'
-YCOMMENT='rotation angle (DEGREES)'
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XBETA,IGRID,ILENCH,YCOMMENT,IRESP)
-! 
-YRECFM='XHAT'
-YCOMMENT='Position x in the conformal or cartesian plane (METERS)'
-IGRID=2
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XX',XXHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='YHAT'
-YCOMMENT='Position y in the conformal or cartesian plane (METERS)'
-IGRID=3
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'YY',XYHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='ZHAT'
-YCOMMENT='height level without orography (METERS)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XZHAT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='ZS'
-YCOMMENT='orography (METERS)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XZS,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='ZSMT'
-YCOMMENT='smooth orography (METERS)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XZSMT,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='SLEVE'
-YCOMMENT=' '
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',LSLEVE,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'THINSHELL',CLUOUT,IRESP,LTHINSHELL)
+CALL IO_WRITE_FIELD(TPFILE,'LAT0',CLUOUT,IRESP,XLAT0)
+CALL IO_WRITE_FIELD(TPFILE,'LON0',CLUOUT,IRESP,XLON0)
+CALL IO_WRITE_FIELD(TPFILE,'BETA',CLUOUT,IRESP,XBETA)
+!
+CALL IO_WRITE_FIELD(TPFILE,'XHAT',CLUOUT,IRESP,XXHAT)
+CALL IO_WRITE_FIELD(TPFILE,'YHAT',CLUOUT,IRESP,XYHAT)
+CALL IO_WRITE_FIELD(TPFILE,'ZHAT',CLUOUT,IRESP,XZHAT)
+!
+CALL IO_WRITE_FIELD(TPFILE,'ZS',   CLUOUT,IRESP,XZS)
+CALL IO_WRITE_FIELD(TPFILE,'ZSMT', CLUOUT,IRESP,XZSMT)
+CALL IO_WRITE_FIELD(TPFILE,'SLEVE',CLUOUT,IRESP,LSLEVE)
 !
 IF (LSLEVE) THEN
-  YRECFM='LEN1'
-  YCOMMENT=' '
-  IGRID=4
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLEN1,IGRID,ILENCH,YCOMMENT,IRESP)
-  YRECFM='LEN2'
-  YCOMMENT=' '
-  IGRID=4
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XLEN2,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'LEN1',CLUOUT,IRESP,XLEN1)
+  CALL IO_WRITE_FIELD(TPFILE,'LEN2',CLUOUT,IRESP,XLEN2)
 END IF
 !
-YRECFM='DTCUR'
-YCOMMENT=' '
-ILENCH=LEN(YCOMMENT)
-IGRID=0
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',TDTCUR,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DTEXP'   ! array of rank 3 for date is written in file
-YCOMMENT=' '
-ILENCH=LEN(YCOMMENT)
-IGRID=0
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',TDTEXP,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DTMOD'    ! array of rank 3 for date is written in file
-YCOMMENT=' '
-ILENCH=LEN(YCOMMENT)
-IGRID=0
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',TDTMOD,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='DTSEG'    ! array of rank 3 for date is written in file
-IGRID=0
-YCOMMENT=' '
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',TDTSEG,IGRID,ILENCH,YCOMMENT,IRESP)
 !
-!*       1.3    Configuration  variables :
+CALL IO_WRITE_FIELD(TPFILE,'DTMOD',CLUOUT,IRESP,TDTMOD)
+CALL IO_WRITE_FIELD(TPFILE,'DTCUR',CLUOUT,IRESP,TDTCUR)
+CALL IO_WRITE_FIELD(TPFILE,'DTEXP',CLUOUT,IRESP,TDTEXP)
+CALL IO_WRITE_FIELD(TPFILE,'DTSEG',CLUOUT,IRESP,TDTSEG)
 !
-YRECFM='CARTESIAN'
-YCOMMENT='Logical for cartesian geometry '
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',LCARTESIAN,IGRID,ILENCH,YCOMMENT,IRESP)
+!*       1.3    Configuration  variables :
 !
-YRECFM='LBOUSS'      
-YCOMMENT='Logical for Boussinesq'           
-IGRID=0
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',LBOUSS,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'CARTESIAN',CLUOUT,IRESP,LCARTESIAN)
+CALL IO_WRITE_FIELD(TPFILE,'LBOUSS',   CLUOUT,IRESP,LBOUSS)
 !
 IF (LCARTESIAN .AND. LWIND_ZM) THEN
   LWIND_ZM=.FALSE.
@@ -613,35 +453,12 @@ IF (LCARTESIAN .AND. LWIND_ZM) THEN
 END IF
 !*       1.4    Reference state variables :
 !
-YRECFM='RHOREFZ'
-YCOMMENT='rhodz for reference state without orography (kg/m3)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XRHODREFZ,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='THVREFZ'
-YCOMMENT='thetavz for reference state without orography (K)'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XTHVREFZ,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='EXNTOP'
-YCOMMENT='Exner function at model top'
-IGRID=4
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'--',XEXNTOP,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='RHODREF'
-YCOMMENT='Dry density for reference state with orography (kg/m3)'
-IGRID=1
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XRHODREF,IGRID,ILENCH,YCOMMENT,IRESP)
-!
-YRECFM='THVREF'
-YCOMMENT='Thetav for reference state with orography (K)'
-IGRID=1
-ILENCH=LEN(YCOMMENT)
-CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XTHVREF,IGRID,ILENCH,YCOMMENT,IRESP)
+CALL IO_WRITE_FIELD(TPFILE,'RHOREFZ',CLUOUT,IRESP,XRHODREFZ)
+CALL IO_WRITE_FIELD(TPFILE,'THVREFZ',CLUOUT,IRESP,XTHVREFZ)
+CALL IO_WRITE_FIELD(TPFILE,'EXNTOP', CLUOUT,IRESP,XEXNTOP)
+!
+CALL IO_WRITE_FIELD(TPFILE,'RHODREF',CLUOUT,IRESP,XRHODREF)
+CALL IO_WRITE_FIELD(TPFILE,'THVREF', CLUOUT,IRESP,XTHVREF)
 !
 !
 !*       1.5    Variables necessary for plots
@@ -650,19 +467,11 @@ CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XTHVREF,IGRID,ILENCH,YCOMMENT,IRESP)
 ! level or constant theta level or constant PV level
 !
 IF (INDEX(CISO,'PR') /= 0) THEN
-  YRECFM='PABST'
-  YCOMMENT='X_Y_Z_ABSolute Pressure (Pa)'
-  IGRID=1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XPABST,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'PABST',CLUOUT,IRESP,XPABST)
 END IF
 !
 IF (INDEX(CISO,'TK') /= 0) THEN
-  YRECFM='THT'
-  YCOMMENT='X_Y_Z_potential temperature (K)'
-  IGRID=1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XTHT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'THT',CLUOUT,IRESP,XTHT)
 END IF
 !
 ZCORIOZ(:,:,:)=SPREAD( XCORIOZ(:,:),DIM=3,NCOPIES=IKU )
@@ -683,65 +492,61 @@ ZPOVO(:,:,:)= ZPOVO(:,:,:)*1E6/XRHODREF(:,:,:)
 ZPOVO(:,:,1)  =-1.E+11
 ZPOVO(:,:,IKU)=-1.E+11
 IF (INDEX(CISO,'EV') /= 0) THEN
-  YRECFM='POVOT'
-  YCOMMENT='X_Y_Z_POtential VOrticity (PVU)'
-  IGRID=1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZPOVO,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'POVOT'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: POVOT'
+  TZFIELD%CUNITS     = 'PVU' ! 1 PVU = 1e-6 m^2 s^-1 K kg^-1
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_POtential VOrticity'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZPOVO)
 END IF
 !
 !
 IF (LVAR_RS) THEN
-  YRECFM='UT'
-  YCOMMENT='X_Y_Z_U component of wind (m/s)'
-  IGRID=2
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XUT,IGRID,ILENCH,YCOMMENT,IRESP)
-  !
-  YRECFM='VT'
-  YCOMMENT='X_Y_Z_V component of wind (m/s)'
-  IGRID=3
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XVT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'UT',CLUOUT,IRESP,XUT)
+  CALL IO_WRITE_FIELD(TPFILE,'VT',CLUOUT,IRESP,XVT)
   !
   IF (LWIND_ZM) THEN
-    YCOMMENT='X_Y_Z_Zonal and Meridian components of horizontal wind (M/S)'
-    CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23, &
-            TPFILE=TPFILE,HRECU='UM_ZM',HRECV='VM_ZM',HCOMMENT=YCOMMENT)
+    TZFIELD2(1)%CMNHNAME   = 'UM_ZM'
+    TZFIELD2(1)%CSTDNAME   = ''
+    TZFIELD2(1)%CLONGNAME  = 'MesoNH: UM_ZM'
+    TZFIELD2(1)%CUNITS     = 'm s-1'
+    TZFIELD2(1)%CDIR       = 'XY'
+    TZFIELD2(1)%CCOMMENT   = 'Zonal component of horizontal wind'
+    TZFIELD2(1)%NGRID      = 2
+    TZFIELD2(1)%NTYPE      = TYPEREAL
+    TZFIELD2(1)%NDIMS      = 3
+    !
+    TZFIELD2(2)%CMNHNAME   = 'VM_ZM'
+    TZFIELD2(2)%CSTDNAME   = ''
+    TZFIELD2(2)%CLONGNAME  = 'MesoNH: VM_ZM'
+    TZFIELD2(2)%CUNITS     = 'm s-1'
+    TZFIELD2(2)%CDIR       = 'XY'
+    TZFIELD2(2)%CCOMMENT   = 'Meridian component of horizontal wind'
+    TZFIELD2(2)%NGRID      = 3
+    TZFIELD2(2)%NTYPE      = TYPEREAL
+    TZFIELD2(2)%NDIMS      = 3
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XUT,XVT,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   END IF
   !
-  YRECFM='WT'
-  YCOMMENT='X_Y_Z_vertical wind (m/s)'
-  IGRID=4
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XWT,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'WT',CLUOUT,IRESP,XWT)
   !
   !   write mixing ratio for water vapor required to plot radio-soundings
   !
   IF (LUSERV) THEN
-    YRECFM='RVT' 
-    YCOMMENT='X_Y_Z_Vapor mixing Ratio (KG/KG)'
-    IGRID=1
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XRT(:,:,:,1),IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+    CALL IO_WRITE_FIELD(TPFILE,'RVT',CLUOUT,IRESP,XRT(:,:,:,IDX_RVT))
   END IF
 END IF
 !
 !*   Latitude and Longitude arrays
 !
 IF (.NOT.LCARTESIAN) THEN
-   YRECFM='LAT'
-   YCOMMENT='X_Y_latitude (degrees)'
-   IGRID=1
-   ILENCH=LEN(YCOMMENT)
-   CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XLAT,IGRID,ILENCH,YCOMMENT,IRESP)
-   !
-   YRECFM='LON'
-   YCOMMENT='X_Y_longitude (degrees)'
-   IGRID=1
-   ILENCH=LEN(YCOMMENT)
-   CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XLON,IGRID,ILENCH,YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'LAT',CLUOUT,IRESP,XLAT)
+  CALL IO_WRITE_FIELD(TPFILE,'LON',CLUOUT,IRESP,XLON)
 END IF
 !
 !
@@ -1132,94 +937,79 @@ ENDIF
 !
 IF (LVAR_MRW .OR. LLIMA_DIAG) THEN
   IF (NRR >=1) THEN
-    IRR=0                                      ! Moist variables are written
-    IGRID=1                                    ! individually in file
+    ! Moist variables are written individually in file
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
     IF (LUSERV) THEN
-      IRR=IRR+1
-      YRECFM= 'MRV'
-      YCOMMENT='X_Y_Z_MRV (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-                 
+      TZFIELD%CMNHNAME   = 'MRV'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRV'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRV'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RVT)*1.E3)
     END IF
     IF (LUSERC) THEN
-      IRR=IRR+1
-      YRECFM= 'MRC'
-      YCOMMENT='X_Y_Z_MRC (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      YRECFM= 'VRC'
-      YCOMMENT='X_Y_Z_VRC (vol/vol)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*XRHODREF(:,:,:)/1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRC'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRC'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRC'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RCT)*1.E3)
+!
+      TZFIELD%CMNHNAME   = 'VRC'
+      TZFIELD%CLONGNAME  = 'MesoNH: VRC'
+      TZFIELD%CUNITS     = '' !vol/vol
+      TZFIELD%CCOMMENT   = 'X_Y_Z_VRC (vol/vol)'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RCT)*XRHODREF(:,:,:)/1.E3)
     END IF
     IF (LUSERR) THEN
-      IRR=IRR+1
-      YRECFM= 'MRR'
-      YCOMMENT='X_Y_Z_MRR (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
-      YRECFM= 'VRR'
-      YCOMMENT='X_Y_Z_VRR (vol/vol)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*XRHODREF(:,:,:)/1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRR'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRR'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRR'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RRT)*1.E3)
+!
+      TZFIELD%CMNHNAME   = 'VRR'
+      TZFIELD%CLONGNAME  = 'MesoNH: VRR'
+      TZFIELD%CUNITS     = '' !vol/vol
+      TZFIELD%CCOMMENT   = 'X_Y_Z_VRR (vol/vol)'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RRT)*XRHODREF(:,:,:)/1.E3)
     END IF
     IF (LUSERI) THEN
-      IRR   = IRR+1
-      YRECFM= 'MRI'
-      YCOMMENT='X_Y_Z_MRI (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRI'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRI'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRI'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RIT)*1.E3)
+!
       IF (LUSECI) THEN
-        YRECFM= 'CIT'
-        YCOMMENT='X_Y_Z_CIT (/M3)'
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XCIT(:,:,:),IGRID,ILENCH,  &
-                    YCOMMENT,IRESP)
+        CALL IO_WRITE_FIELD(TPFILE,'CIT',CLUOUT,IRESP,XCIT(:,:,:))
       END IF
     END IF
     IF (LUSERS) THEN
-      IRR   = IRR+1
-      YRECFM= 'MRS'
-      YCOMMENT='X_Y_Z_MRS (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRS'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRS'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRS'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RST)*1.E3)
     END IF
     IF (LUSERG) THEN
-      IRR   = IRR+1
-      YRECFM= 'MRG'
-      YCOMMENT='X_Y_Z_RG (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRG'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRG'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRG'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RGT)*1.E3)
     END IF
     IF (LUSERH) THEN
-      IRR   = IRR+1
-      YRECFM= 'MRH'
-      YCOMMENT='X_Y_Z_RH (G/KG)'
-      ILENCH=LEN(YCOMMENT)
-      ZWORK31(:,:,:)=XRT(:,:,:,IRR)*1.E3
-      CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,  &
-                YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'MRH'
+      TZFIELD%CLONGNAME  = 'MesoNH: MRH'
+      TZFIELD%CUNITS     = 'g kg-1'
+      TZFIELD%CCOMMENT   = 'X_Y_Z_MRH'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XRT(:,:,:,IDX_RHT)*1.E3)
     END IF
   END IF
 END IF
-
 !
 !* Scalar Variables
 !
@@ -1353,12 +1143,16 @@ END IF
 ! chemical scalar variables in gas phase PPBV
 IF (LCHEMDIAG) THEN
   DO JSV = NSV_CHGSBEG,NSV_CHGSEND
-    YRECFM=TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T'
-    WRITE(YCOMMENT,'(A6,A4,I3.3,A7)')'X_Y_Z_','CHIM',JSV,' (ppbv)'
-    ILENCH=LEN(YCOMMENT)
-    ZWORK31(:,:,:)=XSVT(:,:,:,JSV)*1.E9
-    CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK31,IGRID,ILENCH,    &
-         YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHGSBEG+1)))//'T'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CUNITS     = 'ppbv'
+    TZFIELD%CDIR       = 'XY'
+    WRITE(TZFIELD%CCOMMENT,'(A6,A4,I3.3)')'X_Y_Z_','CHIM',JSV
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV)*1.E9)
   END DO
 END IF
 IF (LCHAQDIAG) THEN    !aqueous concentration in M
@@ -2019,9 +1813,27 @@ IF (LVAR_LS) THEN
   CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XLSVM,IGRID,ILENCH,YCOMMENT,IRESP)
   !
   IF (LWIND_ZM) THEN
-    YCOMMENT='X_Y_Z_Large Scale Zonal and Meridian components of horizontal wind (M/S)'
-    CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23, &
-              TPFILE=TPFILE,HRECU='LSUM_ZM',HRECV='LSVM_ZM',HCOMMENT=YCOMMENT)
+    TZFIELD2(1)%CMNHNAME   = 'LSUM_ZM'
+    TZFIELD2(1)%CSTDNAME   = ''
+    TZFIELD2(1)%CLONGNAME  = 'MesoNH: LSUM_ZM'
+    TZFIELD2(1)%CUNITS     = 'm s-1'
+    TZFIELD2(1)%CDIR       = 'XY'
+    TZFIELD2(1)%CCOMMENT   = 'Large Scale Zonal component of horizontal wind'
+    TZFIELD2(1)%NGRID      = 2
+    TZFIELD2(1)%NTYPE      = TYPEREAL
+    TZFIELD2(1)%NDIMS      = 3
+    !
+    TZFIELD2(2)%CMNHNAME   = 'LSVM_ZM'
+    TZFIELD2(2)%CSTDNAME   = ''
+    TZFIELD2(2)%CLONGNAME  = 'MesoNH: LSVM_ZM'
+    TZFIELD2(2)%CUNITS     = 'm s-1'
+    TZFIELD2(2)%CDIR       = 'XY'
+    TZFIELD2(2)%CCOMMENT   = 'Large Scale Meridian component of horizontal wind'
+    TZFIELD2(2)%NGRID      = 3
+    TZFIELD2(2)%NTYPE      = TYPEREAL
+    TZFIELD2(2)%NDIMS      = 3
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XLSUM,XLSVM,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ENDIF
   !
   YRECFM='LSWM'
@@ -2354,9 +2166,27 @@ IF (LVORT) THEN
   CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK32,IGRID,ILENCH,YCOMMENT,IRESP)
   !
   IF (LWIND_ZM) THEN
-    YCOMMENT='X_Y_Z_Zonal and Meridian components of horizontal vorticity (M/S)'
-    CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23, &
-                TPFILE=TPFILE,HRECU='UM1_ZM',HRECV='VM1_ZM',HCOMMENT=YCOMMENT)
+    TZFIELD2(1)%CMNHNAME   = 'UM1_ZM'
+    TZFIELD2(1)%CSTDNAME   = ''
+    TZFIELD2(1)%CLONGNAME  = 'MesoNH: UM1_ZM'
+    TZFIELD2(1)%CUNITS     = 'm s-1'
+    TZFIELD2(1)%CDIR       = 'XY'
+    TZFIELD2(1)%CCOMMENT   = 'Zonal component of horizontal vorticity'
+    TZFIELD2(1)%NGRID      = 2
+    TZFIELD2(1)%NTYPE      = TYPEREAL
+    TZFIELD2(1)%NDIMS      = 3
+    !
+    TZFIELD2(2)%CMNHNAME   = 'VM1_ZM'
+    TZFIELD2(2)%CSTDNAME   = ''
+    TZFIELD2(2)%CLONGNAME  = 'MesoNH: VM1_ZM'
+    TZFIELD2(2)%CUNITS     = 'm s-1'
+    TZFIELD2(2)%CDIR       = 'XY'
+    TZFIELD2(2)%CCOMMENT   = 'Meridian component of horizontal vorticity'
+    TZFIELD2(2)%NGRID      = 3
+    TZFIELD2(2)%NTYPE      = TYPEREAL
+    TZFIELD2(2)%NDIMS      = 3
+    !
+    CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
   ENDIF
 !    
 ! Vorticity z
@@ -2568,9 +2398,27 @@ IF (LGEO .OR. LAGEO) THEN
     CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK32,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     IF (LWIND_ZM) THEN
-    YCOMMENT='X_Y_Z_Zonal and Meridian components of GEOstrophic wind (m/s)'
-      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23, &
-              TPFILE=TPFILE,HRECU='UM88_ZM',HRECV='VM88_ZM',HCOMMENT=YCOMMENT)
+      TZFIELD2(1)%CMNHNAME   = 'UM88_ZM'
+      TZFIELD2(1)%CSTDNAME   = ''
+      TZFIELD2(1)%CLONGNAME  = 'MesoNH: UM88_ZM'
+      TZFIELD2(1)%CUNITS     = 'm s-1'
+      TZFIELD2(1)%CDIR       = 'XY'
+      TZFIELD2(1)%CCOMMENT   = 'Zonal component of GEOstrophic wind'
+      TZFIELD2(1)%NGRID      = 2
+      TZFIELD2(1)%NTYPE      = TYPEREAL
+      TZFIELD2(1)%NDIMS      = 3
+      !
+      TZFIELD2(2)%CMNHNAME   = 'VM88_ZM'
+      TZFIELD2(2)%CSTDNAME   = ''
+      TZFIELD2(2)%CLONGNAME  = 'MesoNH: VM88_ZM'
+      TZFIELD2(2)%CUNITS     = 'm s-1'
+      TZFIELD2(2)%CDIR       = 'XY'
+      TZFIELD2(2)%CCOMMENT   = 'Meridian component of GEOstrophic wind'
+      TZFIELD2(2)%NGRID      = 3
+      TZFIELD2(2)%NTYPE      = TYPEREAL
+      TZFIELD2(2)%NDIMS      = 3
+      !
+      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
     ENDIF
 !
 ! wm necessary to plot vertical cross sections of wind vectors
@@ -2598,9 +2446,27 @@ IF (LGEO .OR. LAGEO) THEN
     CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',ZWORK32,IGRID,ILENCH,YCOMMENT,IRESP)
     !
     IF (LWIND_ZM) THEN
-      YCOMMENT='X_Y_Z_Zonal and Meridian components of AGEOstrophic wind (m/s)'
-      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23, &
-              TPFILE=TPFILE,HRECU='UM89_ZM',HRECV='VM89_ZM',HCOMMENT=YCOMMENT)
+      TZFIELD2(1)%CMNHNAME   = 'UM89_ZM'
+      TZFIELD2(1)%CSTDNAME   = ''
+      TZFIELD2(1)%CLONGNAME  = 'MesoNH: UM89_ZM'
+      TZFIELD2(1)%CUNITS     = 'm s-1'
+      TZFIELD2(1)%CDIR       = 'XY'
+      TZFIELD2(1)%CCOMMENT   = 'Zonal component of AGEOstrophic wind'
+      TZFIELD2(1)%NGRID      = 2
+      TZFIELD2(1)%NTYPE      = TYPEREAL
+      TZFIELD2(1)%NDIMS      = 3
+      !
+      TZFIELD2(2)%CMNHNAME   = 'VM89_ZM'
+      TZFIELD2(2)%CSTDNAME   = ''
+      TZFIELD2(2)%CLONGNAME  = 'MesoNH: VM89_ZM'
+      TZFIELD2(2)%CUNITS     = 'm s-1'
+      TZFIELD2(2)%CDIR       = 'XY'
+      TZFIELD2(2)%CCOMMENT   = 'Meridian component of AGEOstrophic wind'
+      TZFIELD2(2)%NGRID      = 3
+      TZFIELD2(2)%NTYPE      = TYPEREAL
+      TZFIELD2(2)%NDIMS      = 3
+      !
+      CALL UV_TO_ZONAL_AND_MERID(ZWORK31,ZWORK32,23,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
     ENDIF
 !
 ! wm necessary to plot vertical cross sections of wind vectors
@@ -3336,31 +3202,10 @@ IF (ALLOCATED(ZTHETAV)) DEALLOCATE(ZTHETAV)
 !* Ligthning
 !
 IF ( LCH_CONV_LINOX ) THEN 
-  YRECFM      = 'IC_RATE'
-  YCOMMENT    = 'X_Y_IC_RATE (/s)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XIC_RATE,IGRID,ILENCH,YCOMMENT,IRESP)
-
-  YRECFM      = 'CG_RATE'
-  YCOMMENT    = 'X_Y_CG_RATE (/s)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XCG_RATE,IGRID,ILENCH,YCOMMENT,IRESP)
-
-  YRECFM      = 'IC_TOTAL_NB'
-  YCOMMENT    = 'X_Y_IC_TOTAL_NUMBER (no unit)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XIC_TOTAL_NUMBER,IGRID,ILENCH, &
-       YCOMMENT,IRESP)
-
-  YRECFM      = 'CG_TOTAL_NB'
-  YCOMMENT    = 'X_Y_CG_TOTAL_NUMBER (no unit)'
-  IGRID       = 1
-  ILENCH      = LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE2,YRECFM,CLUOUT,'XY',XCG_TOTAL_NUMBER,IGRID,ILENCH, &
-       YCOMMENT,IRESP)
+  CALL IO_WRITE_FIELD(TPFILE,'IC_RATE',    CLUOUT,IRESP,XIC_RATE)
+  CALL IO_WRITE_FIELD(TPFILE,'CG_RATE',    CLUOUT,IRESP,XCG_RATE)
+  CALL IO_WRITE_FIELD(TPFILE,'IC_TOTAL_NB',CLUOUT,IRESP,XIC_TOTAL_NUMBER)
+  CALL IO_WRITE_FIELD(TPFILE,'CG_TOTAL_NB',CLUOUT,IRESP,XCG_TOTAL_NUMBER)
 END IF
 !-------------------------------------------------------------------------------
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/write_lfifm1_for_diag_supp.f90 b/src/MNH/write_lfifm1_for_diag_supp.f90
index 4a5e8c32215424beb55669a0f638da6fc8ad8ba3..1d083e16e46aae0eecb98fc1369f74a48c876d04 100644
--- a/src/MNH/write_lfifm1_for_diag_supp.f90
+++ b/src/MNH/write_lfifm1_for_diag_supp.f90
@@ -152,6 +152,7 @@ USE MODI_CALL_RTTOV11
 USE MODI_RADTR_SATEL
 USE MODI_UV_TO_ZONAL_AND_MERID
 !
+USE MODE_FIELD
 USE MODE_FMWRIT
 !
 USE MODI_GET_SURF_UNDEF
@@ -207,10 +208,14 @@ REAL, DIMENSION(:), ALLOCATABLE :: ZTH
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZPOVO
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZVOX,ZVOY,ZVOZ
 REAL,DIMENSION(SIZE(XTHT,1),SIZE(XTHT,2),SIZE(XTHT,3))  :: ZCORIOZ
+TYPE(TFIELDDATA)              :: TZFIELD
+TYPE(TFIELDDATA),DIMENSION(2) :: TZFIELD2
 !-------------------------------------------------------------------------------
 !
 !*       0.     ARRAYS BOUNDS INITIALIZATION
 !
+YFMFILE = TPFILE%CNAME
+!
 IIU=SIZE(XTHT,1)
 IJU=SIZE(XTHT,2)
 IKU=SIZE(XTHT,3)
@@ -817,62 +822,106 @@ IF (CSURF=='EXTE') THEN
     ILEVEL=ILEVEL+1 !level just higher
   END DO
   !
-
-    YCOMMENT='X_Y_components of wind at 10m (m/s)'
-    IGRID=0
-    ! in this case (argument IGRID=0), input winds are ZONal and MERidien 
-    !          and, output ones are in MesoNH grid   
-    IF (.NOT. LCARTESIAN) THEN                                                 
-      CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,IGRID,     &
-            TPFILE=TPFILE,HRECU='UM10',HRECV='VM10',HCOMMENT=YCOMMENT)
-    ELSE
-     YRECFM      ='UM10'
-     YCOMMENT    ='X_Y_UM10 (m/s)'
-     IGRID       =1
-     ILENCH      =LEN(YCOMMENT)
-     CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_ZON10M,IGRID,ILENCH,YCOMMENT,IRESP)
-     YRECFM      ='VM10'
-     YCOMMENT    ='X_Y_VM10 (m/s)'
-     IGRID       =1
-     ILENCH      =LEN(YCOMMENT)
-     CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_MER10M,IGRID,ILENCH,YCOMMENT,IRESP)
-    ENDIF
-      !
-    IF (SIZE(XTKET)>0) THEN
-     ZWORK21(:,:)= 0.    
-     ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
-     ZWORK21(:,:) =ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
-     YRECFM      ='FF10MAX'
-     YCOMMENT    ='X_Y_FF10MAX (m/s)'
-     IGRID       =1
-     ILENCH      =LEN(YCOMMENT)
-     CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',ZWORK21,IGRID,ILENCH,YCOMMENT,IRESP)
-    END IF
+  ! in this case (argument KGRID=0), input winds are ZONal and MERidian 
+  !          and, output ones are in MesoNH grid   
+  IF (.NOT. LCARTESIAN) THEN
+    TZFIELD2(1)%CMNHNAME   = 'UM10'
+    TZFIELD2(1)%CSTDNAME   = ''
+    TZFIELD2(1)%CLONGNAME  = 'MesoNH: UM10'
+    TZFIELD2(1)%CUNITS     = 'm s-1'
+    TZFIELD2(1)%CDIR       = 'XY'
+    TZFIELD2(1)%CCOMMENT   = 'Zonal wind at 10m'
+    TZFIELD2(1)%NGRID      = 1
+    TZFIELD2(1)%NTYPE      = TYPEREAL
+    TZFIELD2(1)%NDIMS      = 2
+    !
+    TZFIELD2(2)%CMNHNAME   = 'VM10'
+    TZFIELD2(2)%CSTDNAME   = ''
+    TZFIELD2(2)%CLONGNAME  = 'MesoNH: VM10'
+    TZFIELD2(2)%CUNITS     = 'm s-1'
+    TZFIELD2(2)%CDIR       = 'XY'
+    TZFIELD2(2)%CCOMMENT   = 'Meridian wind at 10m'
+    TZFIELD2(2)%NGRID      = 1
+    TZFIELD2(2)%NTYPE      = TYPEREAL
+    TZFIELD2(2)%NDIMS      = 2
+    !
+    CALL UV_TO_ZONAL_AND_MERID(XCURRENT_ZON10M,XCURRENT_MER10M,KGRID=0,TPFILE=TPFILE,TZFIELDS=TZFIELD2)
+  ELSE
+    TZFIELD%CMNHNAME   = 'UM10'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: UM10'
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'Zonal wind at 10m'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XCURRENT_ZON10M)
+    !
+    TZFIELD%CMNHNAME   = 'VM10'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: VM10'
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'Meridian wind at 10m'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XCURRENT_MER10M)
+  ENDIF
+  !
+  IF (SIZE(XTKET)>0) THEN
+    ZWORK21(:,:) = SQRT(XCURRENT_ZON10M(:,:)**2+XCURRENT_MER10M(:,:)**2)
+    ZWORK21(:,:) = ZWORK21(:,:) + 4. * SQRT(XTKET(:,:,IKB))
+    TZFIELD%CMNHNAME   = 'FF10MAX'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: FF10MAX'
+    TZFIELD%CUNITS     = 'm s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_FF10MAX'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK21)
+  END IF
+  !
   IF(ANY(XCURRENT_SFCO2/=XUNDEF))THEN
-    YCOMMENT='CO2 flux (mg/m2/s)'
-    ILENCH=LEN(YCOMMENT)
-    YRECFM='SFCO2'
-    IGRID=1
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_SFCO2,IGRID,ILENCH,   &
-    YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SFCO2'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SFCO2'
+    TZFIELD%CUNITS     = 'mg m-2 s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'CO2 Surface flux'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XCURRENT_SFCO2)
   END IF
   !
   IF(ANY(XCURRENT_SW/=XUNDEF))THEN
-    YCOMMENT='SW (W/m2)'
-    ILENCH=LEN(YCOMMENT)
-    YRECFM='SW'
-    IGRID=1
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_SW,IGRID,ILENCH,      &
-    YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'SW'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: SW'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'incoming ShortWave at the surface'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XCURRENT_SW)
   END IF
   !
   IF(ANY(XCURRENT_LW/=XUNDEF))THEN
-    YCOMMENT='LW (W/m2)'
-    ILENCH=LEN(YCOMMENT)
-    YRECFM='LW'
-    IGRID=1
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCURRENT_LW,IGRID,ILENCH,      &
-    YCOMMENT,IRESP)
+    TZFIELD%CMNHNAME   = 'LW'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: LW'
+    TZFIELD%CUNITS     = 'W m-2'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'incoming LongWave at the surface'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XCURRENT_LW)
   END IF
 END IF
 
@@ -1090,41 +1139,54 @@ END IF
 !               -------------------------------
 !
 IF (NEQ_BUDGET>0) THEN
-     IGRID=1
-     DO JSV = 1, NEQ_BUDGET
-       YRECFM=TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
-       WRITE(YCOMMENT,'(A6,A5,A7,A8)')'X_Y_Z_',CNAMES_BUDGET(JSV),'_BUDGET','(ppp/s)'
-       ILENCH=LEN(YCOMMENT)
-       CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XTCHEM(JSV)%XB_REAC(:,:,:,:),IGRID,ILENCH,&
-                YCOMMENT,IRESP)
-     END DO
-!
-     DO JSV=1, NEQ_BUDGET
-       YRECFM=TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST'
-       WRITE(YCOMMENT,'(A5,A14)')CNAMES_BUDGET(JSV),'_REACTION_LIST'
-       ILENCH=LEN(YCOMMENT)
-       CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XTCHEM(JSV)%NB_REAC(:),IGRID,ILENCH,&
-                  YCOMMENT,IRESP)
-     END DO
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  !
+  TZFIELD%CUNITS     = 'ppp s-1'
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 4
+  !
+  DO JSV = 1, NEQ_BUDGET
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_BUDGET(JSV))//'_BUDGET'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XTCHEM(JSV)%XB_REAC(:,:,:,:))
+  END DO
+  !
+  TZFIELD%CUNITS     = ''
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 1
+  !
+  DO JSV=1, NEQ_BUDGET
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_BUDGET(JSV))//'_CHREACLIST'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = TRIM(CNAMES_BUDGET(JSV))//'_REACTION_LIST'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XTCHEM(JSV)%NB_REAC(:))
+  END DO
 END IF
 !
 !
 ! chemical prod/loss terms
 IF (NEQ_PLT>0) THEN
-        IGRID=1
-        DO JSV = 1, NEQ_PLT
-          YRECFM=TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
-          WRITE(YCOMMENT,'(A6,A8,A5,A8)')'X_Y_Z_',CNAMES_PRODLOSST(JSV),'_PROD','(ppp/s)'
-          ILENCH=LEN(YCOMMENT)
-          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XPROD(:,:,:,JSV),IGRID,ILENCH,&
-                  YCOMMENT,IRESP)
-!
-          YRECFM=TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS'
-          WRITE(YCOMMENT,'(A6,A8,A5,A8)')'X_Y_Z_',CNAMES_PRODLOSST(JSV),'_LOSS','(ppp/s)'
-          ILENCH=LEN(YCOMMENT)
-          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XLOSS(:,:,:,JSV),IGRID,ILENCH,&
-                  YCOMMENT,IRESP)
-        END DO
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CUNITS     = 'ppp s-1'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  !
+  DO JSV = 1, NEQ_PLT
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_PROD'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XPROD(:,:,:,JSV))
+    !
+    TZFIELD%CMNHNAME   = TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS'
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(CNAMES_PRODLOSST(JSV))//'_LOSS'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XLOSS(:,:,:,JSV))
+  END DO
 END IF
 !
 !
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index fbc54200234ef99bc5327f1b3bc5878bdff70662..524fdaaa7b6e937dcb83af93aab97afb797c3306 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -652,12 +652,7 @@ IF (NRR >=1) THEN
     CALL IO_WRITE_FIELD(TPFILE,'RIT',CLUOUT,IRESP,XRT(:,:,:,IDX_RIT))
     WRITE (ILUOUT,*) IDX_RIT,' RI min-max ',MIN_ll(XRT(:,:,:,IDX_RIT),INFO_ll),MAX_ll(XRT(:,:,:,IDX_RIT),INFO_ll)
     IF ( CPROGRAM == 'MESONH' .AND. CCLOUD(1:3) == 'ICE') THEN
-      IGRID=1
-      YRECFM= 'CIT'
-      YCOMMENT='X_Y_Z_Cloud Ice concentration (/M3)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XCIT(:,:,:),   IGRID,ILENCH,  &
-                  YCOMMENT,IRESP)
+      CALL IO_WRITE_FIELD(TPFILE,'CIT',CLUOUT,IRESP,XCIT(:,:,:))
     END IF
   END IF 
   IF (LUSERS) THEN
@@ -1007,14 +1002,22 @@ IF (NSV >=1) THEN
   IF (ICH_NBR /=0) ALLOCATE(YCHNAMES(ICH_NBR))
   ! chemical scalar variables
   IF (LUSECHEM) THEN
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     DO JSV = NSV_CHEMBEG,NSV_CHEMEND
-      YRECFM=TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T'
-      WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
-      ILENCH=LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                  YCOMMENT,IRESP)
-      YCHNAMES(JSV-JSA)=YRECFM(1:LEN_TRIM(YRECFM)-1) ! without T
+      TZFIELD%CMNHNAME   = TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))//'T'
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
+      !
+      YCHNAMES(JSV-JSA)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1) ! without T
     END DO
+    !
     IF (LUSECHIC) THEN
       DO JSV = NSV_CHICBEG,NSV_CHICEND
         YRECFM=TRIM(UPCASE(CICNAMES(JSV-NSV_CHICBEG+1)))//'T'
@@ -1262,18 +1265,28 @@ END IF ! Valeur IMOMENTS
   DO JSV=1,ICH_NBR
     WRITE(ILUOUT,*)JSV,TRIM(YCHNAMES(JSV))
   END DO
-  YRECFM='NSV.DIM'
-  YCOMMENT=' '
-  IGRID=0
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'--',ICH_NBR,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'NSV.DIM'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'MesoNH: NSV.DIM'
+  TZFIELD%CUNITS     = ''
+  TZFIELD%CDIR       = '--'
+  TZFIELD%CCOMMENT   = 'Number of chemical variables'
+  TZFIELD%NGRID      = 0
+  TZFIELD%NTYPE      = TYPEINT
+  TZFIELD%NDIMS      = 0
+  CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ICH_NBR)
   !
   IF (ICH_NBR/=0) THEN
-    YRECFM='NSV.TITRE'
-    YCOMMENT=' '
-    IGRID=0
-    ILENCH=LEN(YCOMMENT)
-    ILREC=LEN(YRECFM)
+    TZFIELD%CMNHNAME   = 'NSV.TITRE'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: NSV.TITRE'
+    TZFIELD%CUNITS     = ''
+    TZFIELD%CDIR       = '--'
+    TZFIELD%CCOMMENT   = ''
+    TZFIELD%NGRID      = 0
+    TZFIELD%NTYPE      = TYPEINT
+    TZFIELD%NDIMS      = 1
+    ILREC=LEN(YCHNAMES(1))
     ILENG=ILREC*ICH_NBR
     ALLOCATE(ICH_NAMES(ILENG))
     DO JSV = 1,ICH_NBR
@@ -1281,7 +1294,7 @@ END IF ! Valeur IMOMENTS
         ICH_NAMES(ILREC*(JSV-1)+JT) = ICHAR(YCHNAMES(JSV)(JT:JT))
       ENDDO
     ENDDO
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'--',ICH_NAMES,IGRID,ILENCH,YCOMMENT,IRESP)
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ICH_NAMES)
     DEALLOCATE(YCHNAMES,ICH_NAMES)
   END IF 
   !
@@ -1437,34 +1450,11 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   TZFIELD%CUNITS = 'mm hour-1'
   CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XPRSCONV*3.6E6)
 !
-  IF ( LCH_CONV_LINOX ) THEN 
-    YRECFM      = 'IC_RATE'
-    YCOMMENT    = 'X_Y_IntraCloud lightning Rate (/s)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XIC_RATE,IGRID,ILENCH, &
-                                                    YCOMMENT,IRESP)
-    
-    YRECFM      = 'CG_RATE'
-    YCOMMENT    = 'X_Y_CloudGround lightning Rate (/s)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCG_RATE,IGRID,ILENCH, &
-                                                    YCOMMENT,IRESP)
-    
-    YRECFM      = 'IC_TOTAL_NB'
-    YCOMMENT    = 'X_Y_IntraCloud lightning Number (-)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XIC_TOTAL_NUMBER,IGRID,ILENCH, &
-                                                            YCOMMENT,IRESP)
-    
-    YRECFM      = 'CG_TOTAL_NB'
-    YCOMMENT    = 'X_Y_CloudGround lightning Number (-)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XCG_TOTAL_NUMBER,IGRID,ILENCH, &
-                                                            YCOMMENT,IRESP)
+  IF ( LCH_CONV_LINOX ) THEN
+    CALL IO_WRITE_FIELD(TPFILE,'IC_RATE',    CLUOUT,IRESP,XIC_RATE)
+    CALL IO_WRITE_FIELD(TPFILE,'CG_RATE',    CLUOUT,IRESP,XCG_RATE)
+    CALL IO_WRITE_FIELD(TPFILE,'IC_TOTAL_NB',CLUOUT,IRESP,XIC_TOTAL_NUMBER)
+    CALL IO_WRITE_FIELD(TPFILE,'CG_TOTAL_NB',CLUOUT,IRESP,XCG_TOTAL_NUMBER)
   END IF
 !
   IF ( LCHTRANS .AND. NSV > 0 ) THEN
@@ -1576,19 +1566,15 @@ IF (CPROGRAM /= 'IDEAL') THEN
 !
   IF (ASSOCIATED(XINPRC)) THEN
   IF (SIZE(XINPRC) /= 0 ) THEN
-    YRECFM      = 'INPRC'
-    YCOMMENT    = 'X_Y_INstantaneous Cloud Precipitation Rain Rate (MM/H)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XINPRC*3.6E6,IGRID,ILENCH, &
-                                               YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRC',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XINPRC*3.6E6)
 !
-    YRECFM      = 'ACPRC'
-    YCOMMENT    = 'X_Y_ACcumulated Cloud Precipitation Rain Rate (MM)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XACPRC*1.0E3,IGRID,ILENCH, &
-                                                 YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRC',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XACPRC*1.0E3)
   ENDIF
   ENDIF
 !
@@ -1612,55 +1598,43 @@ IF (CPROGRAM /= 'IDEAL') THEN
 !
   IF (ASSOCIATED(XINPRS)) THEN
   IF (SIZE(XINPRS) /= 0 ) THEN
-    YRECFM      = 'INPRS'
-    YCOMMENT    = 'X_Y_INstantaneous PRecipitation Snow Rate (MM/H)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XINPRS*3.6E6,IGRID,ILENCH, &
-                                             YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRS',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XINPRS*3.6E6)
 !
-    YRECFM      = 'ACPRS'
-    YCOMMENT    = 'X_Y_ACcumulated PRecipitation Snow Rate (MM)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XACPRS*1.0E3,IGRID,ILENCH, &
-                                             YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRS',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XACPRS*1.0E3)
   END IF
   END IF
 !
   IF (ASSOCIATED(XINPRG)) THEN
   IF (SIZE(XINPRG) /= 0 ) THEN
-    YRECFM      = 'INPRG'
-    YCOMMENT    = 'X_Y_INstantaneous PRecipitation Graupel Rate (MM/H)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XINPRG*3.6E6,IGRID,ILENCH, &
-                                               YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRG',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XINPRG*3.6E6)
 !
-    YRECFM      = 'ACPRG'
-    YCOMMENT    = 'X_Y_ACcumulated PRecipitation Graupel Rate (MM)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XACPRG*1.0E3,IGRID,ILENCH, &
-                                               YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRG',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XACPRG*1.0E3)
   END IF
   END IF
 !
   IF (ASSOCIATED(XINPRH)) THEN
   IF (SIZE(XINPRH) /= 0 ) THEN
-    YRECFM      = 'INPRH'
-    YCOMMENT    = 'X_Y_INstantaneous PRecipitation Hail Rate (MM/H)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XINPRH*3.6E6,IGRID,ILENCH, &
-                                               YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('INPRH',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm hour-1'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XINPRH*3.6E6)
 !
-    YRECFM      = 'ACPRH'
-    YCOMMENT    = 'X_Y_ACcumulated PRecipitation Hail Rate (MM)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XACPRH*1.0E3,IGRID,ILENCH, &
-                                               YCOMMENT,IRESP) ! unit conversion
+    CALL FIND_FIELD_ID_FROM_MNHNAME('ACPRH',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CUNITS = 'mm'
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XACPRH*1.0E3)
   ENDIF
   ENDIF
 !
@@ -1670,23 +1644,31 @@ IF (CPROGRAM /= 'IDEAL') THEN
     IF (SIZE(XINPRG) /= 0 ) ZWORK2D = ZWORK2D + XINPRG
     IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XINPRH
     IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XINPRC
-    YRECFM      = 'INPRT'
-    YCOMMENT    = 'X_Y_Total INstantaneaous PRecipitation rate (MM/H)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D*3.6E6,IGRID,ILENCH, &
-                                             YCOMMENT,IRESP) ! unit conversion
+    TZFIELD%CMNHNAME   = 'INPRT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: INPRT'
+    TZFIELD%CUNITS     = 'mm hour-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Total INstantaneaous PRecipitation rate'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK2D*3.6E6)
 !
     ZWORK2D = XACPRR + XACPRS
     IF (SIZE(XINPRG) /= 0 ) ZWORK2D = ZWORK2D + XACPRG
     IF (SIZE(XINPRH) /= 0 ) ZWORK2D = ZWORK2D + XACPRH
     IF (SIZE(XINPRC) /= 0 ) ZWORK2D = ZWORK2D + XACPRC
-    YRECFM      = 'ACPRT'
-    YCOMMENT    = 'X_Y_Total ACcumulated PRecipitation rate (MM)'
-    IGRID       = 1
-    ILENCH      = LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,ZWORK2D*1.0E3,IGRID,ILENCH, &
-                                             YCOMMENT,IRESP) ! unit conversion
+    TZFIELD%CMNHNAME   = 'ACPRT'
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: ACPRT'
+    TZFIELD%CUNITS     = 'mm '
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Total ACcumulated PRecipitation rate'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 2
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,ZWORK2D*1.0E3)
   END IF
   END IF
 !