diff --git a/src/MNH/turb_ver_sv_flux.f90 b/src/MNH/turb_ver_sv_flux.f90
index dbabf71d3659b88fb6f47a8ab8f57aad81d5aa50..ece1d98848ab6aa04206b1e4ce8efe56bcf701ee 100644
--- a/src/MNH/turb_ver_sv_flux.f90
+++ b/src/MNH/turb_ver_sv_flux.f90
@@ -281,6 +281,9 @@ USE MODD_LES
 USE MODD_CONF
 USE MODD_NSV, ONLY : NSV_LGBEG,NSV_LGEND
 !
+USE MODE_FIELD, ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FMWRIT
+!
 USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
@@ -290,7 +293,6 @@ USE MODI_TRIDIAG
 USE MODI_TRIDIAG_WIND 
 USE MODI_EMOIST
 USE MODI_ETHETA
-USE MODE_FMWRIT
 USE MODI_LES_MEAN_SUBGRID
 !
 USE MODI_SECOND_MNH
@@ -354,8 +356,6 @@ REAL, DIMENSION(SIZE(PSVM,1),SIZE(PSVM,2),SIZE(PSVM,3))  ::  &
        ZSOURCE,  & ! source of evolution for the treated variable
        ZKEFF       ! effectif diffusion coeff = LT * SQRT( TKE )
 INTEGER             :: IRESP        ! Return code of FM routines 
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file 
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
 INTEGER             :: IKB,IKE      ! I index values for the Beginning and End
                                     ! mass points of the domain in the 3 direct.
 INTEGER             :: IKT          ! array size in k direction
@@ -363,20 +363,16 @@ INTEGER             :: IKTB,IKTE    ! start, end of k loops in physical domain
 INTEGER             :: JSV          ! loop counters
 INTEGER             :: JK           ! loop
 INTEGER             :: ISV          ! number of scalar var.
-CHARACTER (LEN=28)  :: YFMFILE      ! Name of FM-file to write
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
 !
 REAL :: ZTIME1, ZTIME2
 
 REAL :: ZCSVP = 4.0  ! constant for scalar flux presso-correlation (RS81)
+TYPE(TFIELDDATA)  :: TZFIELD
 !----------------------------------------------------------------------------
 !
 !*       1.   PRELIMINARIES
 !             -------------
 !
-YFMFILE = TPFILE%CNAME
-!
 IKB=KKA+JPVEXT_TURB*KKL
 IKE=KKU-JPVEXT_TURB*KKL
 IKT=SIZE(PSVM,3)
@@ -456,11 +452,18 @@ DO JSV=1,ISV
   !
   IF (OTURB_FLX .AND. OCLOSE_OUT) THEN
     ! stores the JSVth vertical flux
-    WRITE(YRECFM,'("WSV_FLX_",I3.3)') JSV 
-    YCOMMENT='X_Y_Z_'//YRECFM//' (SVUNIT*M/S)'
-    IGRID   = 4  
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,HLUOUT,'XY',ZFLXZ,IGRID,ILENCH,YCOMMENT,IRESP)
+    WRITE(TZFIELD%CMNHNAME,'("WSV_FLX_",I3.3)') JSV
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+    !PW: TODO: use the correct units of the JSV variable (and multiply it by m s-1)
+    TZFIELD%CUNITS     = 'SVUNIT m s-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%CCOMMENT   = 'X_Y_Z_'//TRIM(TZFIELD%CMNHNAME)
+    TZFIELD%NGRID      = 4
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
+    CALL IO_WRITE_FIELD(TPFILE,TZFIELD,HLUOUT,IRESP,ZFLXZ)
   END IF
   !
   ! Storage in the LES configuration
diff --git a/src/MNH/write_lbn.f90 b/src/MNH/write_lbn.f90
index a589610a919956c420a6346690dd6d097c4790e9..650ddcc6fdad4e8e5329b423f4f73885c56f7cd8 100644
--- a/src/MNH/write_lbn.f90
+++ b/src/MNH/write_lbn.f90
@@ -565,7 +565,14 @@ IF (NSV >=1) THEN
         CALL ABORT
         STOP
       END IF ! Test IMOMENTS
-      
+      !
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = '--'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
       IF (IMOMENTS == 1) THEN
         DO JMODE=1, NMODE_DST
           !Index from which names are picked
@@ -575,19 +582,18 @@ IF (NSV >=1) THEN
                 + (NSV_DSTBEG -1)      !Previous list of tracers
 
           IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction             
-            YRECFM = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
-            WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV,' (ppp)'
-            ILENCH=LEN(YCOMMENT)
-            CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBX",XLBXSVM(:,:,:,JSV),&
-                           IRIMX,NSIZELBXSV_ll, IGRID,ILENCH,YCOMMENT,IRESP)
+            TZFIELD%CMNHNAME   = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
+            TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBX'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+            CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
           ENDIF !Check on border points in X direction
           IF(NSIZELBYSV_ll /= 0) THEN
-            YRECFM = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
-            WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV,' (ppp)'
-            ILENCH=LEN(YCOMMENT)
-            CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBY",XLBYSVM(:,:,:,JSV),&
-                           IRIMY,NSIZELBYSV_ll, IGRID,ILENCH,YCOMMENT,IRESP)
-
+            TZFIELD%CMNHNAME   = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
+            TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            TZFIELD%CLBTYPE    = 'LBY'
+            WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
+            CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
           ENDIF  !Check on points in Y direction
         ENDDO ! Loop on mode
       ELSE  ! valeur IMOMENTS =/ 1
@@ -599,18 +605,18 @@ IF (NSV >=1) THEN
                 + (NSV_DSTBEG -1)
 !
             IF(NSIZELBXSV_ll /= 0) THEN !Check on border points in X direction
-              YRECFM = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
-              WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV,' (ppp)'
-              ILENCH=LEN(YCOMMENT)
-              CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBX",XLBXSVM(:,:,:,JSV),&
-                             IRIMX,NSIZELBXSV_ll, IGRID,ILENCH,YCOMMENT,IRESP)
+              TZFIELD%CMNHNAME   = 'LBX_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
+              TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+              TZFIELD%CLBTYPE    = 'LBX'
+              WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+              CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
             ENDIF !Check on border points in X direction
             IF(NSIZELBYSV_ll /= 0) THEN
-              YRECFM = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
-              WRITE(YCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV,' (ppp)'
-              ILENCH=LEN(YCOMMENT)
-              CALL FMWRIT_LB(YFMFILE,YRECFM,CLUOUT,"LBY",XLBYSVM(:,:,:,JSV),&
-                             IRIMY,NSIZELBYSV_ll, IGRID,ILENCH,YCOMMENT,IRESP)
+              TZFIELD%CMNHNAME   = 'LBY_'//TRIM(YPDUST_INI(ISV_NAME_IDX))
+              TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+              TZFIELD%CLBTYPE    = 'LBY'
+              WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
+              CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
             ENDIF  !Check on points in Y direction
           ENDDO ! Loop on moments
         ENDDO    ! Loop on modes
@@ -619,22 +625,30 @@ IF (NSV >=1) THEN
     ELSE  ! Test CPROGRAM
       ! We are in the subprogram MESONH, CDUSTNAMES are allocated and are 
       !in the same order as the variables in XSVM (i.e. following JPDUSTORDER)
+      !
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'kg kg-1'
+      TZFIELD%CDIR       = '--'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
       DO JSV = NSV_DSTBEG,NSV_DSTEND
         IF(NSIZELBXSV_ll /= 0) THEN
-           YRECFM = 'LBX_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+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(CDUSTNAMES(JSV-NSV_DSTBEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBX'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'2_Y_Z_','LBXSVM',JSV
+          CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBXSV_ll,IRESP,XLBXSVM(:,:,:,JSV))
         END IF             
         !
         IF(NSIZELBYSV_ll /= 0) THEN
-           YRECFM = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+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)
-         END IF            
+          TZFIELD%CMNHNAME   = 'LBY_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          TZFIELD%CLBTYPE    = 'LBY'
+          WRITE(TZFIELD%CCOMMENT,'(A6,A6,I3.3,A8)')'X_2_Z_','LBYSVM',JSV
+          CALL IO_WRITE_FIELD_LB(TPFILE,TZFIELD,CLUOUT,NSIZELBYSV_ll,IRESP,XLBYSVM(:,:,:,JSV))
+        END IF
       END DO
       IF (LDEPOS_DST(IMI)) THEN
         DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index b706ce9d4eaf65f0f12bb5d90d89d52fc137cbbe..7cbe3df74c64632a8efac318b8896fbb27fe9d43 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -924,8 +924,8 @@ IF (NSV >=1) THEN
     JSA=JSA+1
   END DO
   ! Passive scalar variables        
- IF (LPASPOL) THEN
-  DO JSV = NSV_PPBEG,NSV_PPEND
+  IF (LPASPOL) THEN
+    DO JSV = NSV_PPBEG,NSV_PPEND
       WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
       WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
       ILENCH=LEN(YCOMMENT)
@@ -935,7 +935,7 @@ IF (NSV >=1) THEN
     END DO
   END IF
 !
- IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN
+  IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. (.NOT. LSUPSAT)) THEN
       YRECFM= 'SUPSATMAX'
       YCOMMENT='X_Y_Z_Supersaturation'
       ILENCH=LEN(YCOMMENT)
@@ -947,8 +947,8 @@ IF (NSV >=1) THEN
       ILENCH=LEN(YCOMMENT)
       CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XNACT(:,:,:),IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
- END IF
- IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LSUPSAT) THEN
+  END IF
+  IF ( ((CCLOUD == 'KHKO') .OR.(CCLOUD == 'C2R2')) .AND. LSUPSAT) THEN
       YRECFM= 'SSPRO'
       YCOMMENT='X_Y_Z_Supersaturation'
       ILENCH=LEN(YCOMMENT)
@@ -960,33 +960,33 @@ IF (NSV >=1) THEN
       ILENCH=LEN(YCOMMENT)
       CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XNPRO(:,:,:),IGRID,ILENCH,  &
                   YCOMMENT,IRESP)
- END IF
+  END IF
 !
 #ifdef MNH_FOREFIRE
   ! ForeFire scalar variables
- IF ( LFOREFIRE ) THEN
-  DO JSV = NSV_FFBEG,NSV_FFEND
-    WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                YCOMMENT,IRESP)
-    JSA=JSA+1
-  END DO
- END IF
+  IF ( LFOREFIRE ) THEN
+    DO JSV = NSV_FFBEG,NSV_FFEND
+      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
+      WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
+      ILENCH=LEN(YCOMMENT)
+      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
+                  YCOMMENT,IRESP)
+      JSA=JSA+1
+    END DO
+  END IF
 #endif
   ! Conditional sampling variables  
- IF (LCONDSAMP) THEN
-  DO JSV = NSV_CSBEG,NSV_CSEND
-    WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
-    WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
-    ILENCH=LEN(YCOMMENT)
-    CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
-                YCOMMENT,IRESP)
-    JSA=JSA+1
-  END DO
-!
- END IF
+  IF (LCONDSAMP) THEN
+    DO JSV = NSV_CSBEG,NSV_CSEND
+      WRITE(YRECFM,'(A3,I3.3)')'SVT',JSV
+      WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (KG/KG)'
+      ILENCH=LEN(YCOMMENT)
+      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XSVT(:,:,:,JSV),IGRID,ILENCH,    &
+                  YCOMMENT,IRESP)
+      JSA=JSA+1
+    END DO
+  !
+  END IF
   ! number of chemical variables (chem+aero+dust)
   ICH_NBR = 0
   IF (LUSECHEM) ICH_NBR = ICH_NBR +NSV_CHEMEND-NSV_CHEMBEG+1 
@@ -1113,7 +1113,7 @@ IF (NSV >=1) THEN
       CALL DUSTLFI_n(XSVT(:,:,:,NSV_DSTBEG:NSV_DSTEND), XRHODREF)
     !At this point, we have the tracer array in order of importance, i.e.
     !if mode 2 is most important it will occupy place 1-3 of XSVT  
-   IF ((CPROGRAM == 'REAL  ').AND.((LDSTINIT).OR.(LDSTPRES)).OR.&
+    IF ((CPROGRAM == 'REAL  ').AND.((LDSTINIT).OR.(LDSTPRES)).OR.&
        (CPROGRAM == 'IDEAL ')               ) THEN
       ! In this case CDUSTNAMES is not allocated. We will use YPDUST_INI,
       !but remember that this variable does not follow JPDUSTORDER
@@ -1128,38 +1128,41 @@ IF (NSV >=1) THEN
         STOP
       END IF ! Test IMOMENTS
       ALLOCATE(YDSTNAMES(NSV_DSTEND - NSV_DSTBEG+1))
-
-IF (IMOMENTS == 1) THEN
-
- DO JMODE=1, NMODE_DST
-     ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2
-     JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
-                +  1              & !Number of moments in this mode
-                + (NSV_DSTBEG -1)      !Previous list of tracers
-     YRECFM = TRIM(YPDUST_INI(ISV_NAME_IDX))//'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)
-
-          YDSTNAMES((JMODE-1)*IMOMENTS+1)=YRECFM(1:LEN_TRIM(YRECFM)-1)
- END DO ! Loop on mode
-ELSE
- DO JMODE=1,NMODE_DST
-   DO JMOM=1,IMOMENTS
-    ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM
-    JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
-                + JMOM               & !Number of moments in this mode
-                + (NSV_DSTBEG -1)
-    YRECFM = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'  !The refererence which will be written to file
-    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)
-    YDSTNAMES((JMODE-1)*IMOMENTS+JMOM)=YRECFM(1:LEN_TRIM(YRECFM)-1)
-   END DO ! Loop on moment
- END DO ! loop on mode
-END IF ! Valeur IMOMENTS
+      !
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
+      IF (IMOMENTS == 1) THEN
+        DO JMODE=1, NMODE_DST
+          ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + 2
+          JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
+                  +  1              & !Number of moments in this mode
+                  + (NSV_DSTBEG -1)      !Previous list of tracers
+          TZFIELD%CMNHNAME   = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+          CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
+          YDSTNAMES((JMODE-1)*IMOMENTS+1)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
+        END DO ! Loop on mode
+      ELSE
+        DO JMODE=1,NMODE_DST
+          DO JMOM=1,IMOMENTS
+            ISV_NAME_IDX = (JPDUSTORDER(JMODE) - 1)*3 + JMOM
+            JSV = (JMODE-1)*IMOMENTS  & !Number of moments previously counted
+                 + JMOM               & !Number of moments in this mode
+                 + (NSV_DSTBEG -1)
+            TZFIELD%CMNHNAME   = TRIM(YPDUST_INI(ISV_NAME_IDX))//'T'  !The refererence which will be written to file
+            TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+            WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+            CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
+            YDSTNAMES((JMODE-1)*IMOMENTS+JMOM)=TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
+          END DO ! Loop on moment
+        END DO ! loop on mode
+      END IF ! Valeur IMOMENTS
 !
       DO JSV = NSV_DSTBEG,NSV_DSTEND
         YCHNAMES(JSV-JSA) = YDSTNAMES(JSV-NSV_DSTBEG+1)
@@ -1168,18 +1171,25 @@ END IF ! Valeur IMOMENTS
     ELSE 
       ! We are in the subprogram MESONH, CDUSTNAMES are allocated and are 
       !in the same order as the variables in XSVT (i.e. following JPDUSTORDER)
+      !
+      TZFIELD%CSTDNAME   = ''
+      TZFIELD%CUNITS     = 'ppp'
+      TZFIELD%CDIR       = 'XY'
+      TZFIELD%NGRID      = 1
+      TZFIELD%NTYPE      = TYPEREAL
+      TZFIELD%NDIMS      = 3
+      !
       DO JSV = NSV_DSTBEG,NSV_DSTEND
-        YRECFM=TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+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)
+        TZFIELD%CMNHNAME   = TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))//'T'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A3,I3.3)')'X_Y_Z_','SVT',JSV
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XSVT(:,:,:,JSV))
         IF (JSV==NSV_DSTBEG) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTBEG ',JSV
         IF (JSV==NSV_DSTEND) WRITE(ILUOUT,*)'MNHC: write_lfin:NSV_DSTEND ',JSV
-        YCHNAMES(JSV-JSA) = YRECFM(1:LEN_TRIM(YRECFM)-1)
+        YCHNAMES(JSV-JSA) = TZFIELD%CMNHNAME(1:LEN_TRIM(TZFIELD%CMNHNAME)-1)
       END DO   ! Loop on dust scalar variables
     END IF 
-     IF (LDEPOS_DST(IMI)) THEN        
+    IF (LDEPOS_DST(IMI)) THEN
       DO JSV = NSV_DSTDEPBEG,NSV_DSTDEPEND
         YRECFM=TRIM(CDEDSTNAMES(JSV-NSV_DSTDEPBEG+1))//'T'
         WRITE(YCOMMENT,'(A6,A3,I3.3,A8)')'X_Y_Z_','SVT',JSV,' (ppp)'
@@ -1460,101 +1470,96 @@ IF (CDCONV /= 'NONE' .OR. CSCONV == 'KAFR') THEN
   END IF
 !
   IF ( LCHTRANS .AND. NSV > 0 ) THEN
-                                                ! scalar variables are recorded
-    IGRID=1                                     ! individually in the file
+   ! scalar variables are recorded
+   ! individually in the file
+    TZFIELD%CSTDNAME   = ''
+    TZFIELD%CUNITS     = 's-1'
+    TZFIELD%CDIR       = 'XY'
+    TZFIELD%NGRID      = 1
+    TZFIELD%NTYPE      = TYPEREAL
+    TZFIELD%NDIMS      = 3
+    !
     DO JSV = 1, NSV_USER
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH      = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_C2R2BEG, NSV_C2R2END
-      YRECFM = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C2R2NAMES(JSV-NSV_C2R2BEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_C1R3BEG, NSV_C1R3END
-      YRECFM = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(C1R3NAMES(JSV-NSV_C1R3BEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_ELECBEG, NSV_ELECEND
-      YRECFM = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CELECNAMES(JSV-NSV_ELECBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_PPBEG, NSV_PPEND
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
 #ifdef MNH_FOREFIRE
     IF (LFOREFIRE) THEN
-     DO JSV = NSV_FFBEG, NSV_FFEND
-      WRITE(YRECFM,'(A7,I3.3)')'DSVCONV',JSV
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-     ILENCH = LEN(YCOMMENT)
-     CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-       IGRID,ILENCH,YCOMMENT,IRESP)
-     END DO
+      DO JSV = NSV_FFBEG, NSV_FFEND
+        WRITE(TZFIELD%CMNHNAME,'(A7,I3.3)')'DSVCONV',JSV
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
+      END DO
     END IF
 #endif
     IF (LUSECHEM) THEN
       DO JSV = NSV_CHEMBEG, NSV_CHEMEND
-        YRECFM = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
-        WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-        ILENCH = LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),        &
-                    IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CNAMES(JSV-NSV_CHEMBEG+1)))
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
       END DO
       IF (LORILAM) THEN
         DO JSV = NSV_AERBEG, NSV_AEREND
-          YRECFM = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
-          WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-          ILENCH = LEN(YCOMMENT)
-          CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),      &
-                      IGRID,ILENCH,YCOMMENT,IRESP)
+          TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(UPCASE(CAERONAMES(JSV-NSV_AERBEG+1)))
+          TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+          WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+          CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
         END DO
       END IF
 ! linox scalar variables
     ELSE IF (LCH_CONV_LINOX) THEN
       DO JSV = NSV_LNOXBEG,NSV_LNOXEND
-        YRECFM='DSVCONV_LINOX'
-        WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-        ILENCH=LEN(YCOMMENT)
-        CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,'XY',XDSVCONV(:,:,:,JSV),        &
-                    IGRID,ILENCH,YCOMMENT,IRESP)
+        TZFIELD%CMNHNAME   = 'DSVCONV_LINOX'
+        TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+        WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+        CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
       END DO
     END IF
     DO JSV = NSV_LGBEG, NSV_LGEND
-      YRECFM = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CLGNAMES(JSV-NSV_LGBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_DSTBEG, NSV_DSTEND
-      YRECFM = 'DSVCONV_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CDUSTNAMES(JSV-NSV_DSTBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
     DO JSV = NSV_SLTBEG, NSV_SLTEND
-      YRECFM = 'DSVCONV_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
-      WRITE(YCOMMENT,'(A6,A7,I3.3,A6)')'X_Y_Z_','DSVCONV',JSV,' (1/S)'
-      ILENCH = LEN(YCOMMENT)
-      CALL FMWRIT(YFMFILE,YRECFM,CLUOUT,YDIR,XDSVCONV(:,:,:,JSV),          &
-           IGRID,ILENCH,YCOMMENT,IRESP)
+      TZFIELD%CMNHNAME   = 'DSVCONV_'//TRIM(CSALTNAMES(JSV-NSV_SLTBEG+1))
+      TZFIELD%CLONGNAME  = 'MesoNH: '//TRIM(TZFIELD%CMNHNAME)
+      WRITE(TZFIELD%CCOMMENT,'(A6,A7,I3.3)')'X_Y_Z_','DSVCONV',JSV
+      CALL IO_WRITE_FIELD(TPFILE,TZFIELD,CLUOUT,IRESP,XDSVCONV(:,:,:,JSV))
     END DO
   END IF
 !