diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 4bfd2dc5e8e8453068b95e8dc0ae6f41c16faa3e..27362f835cb0c68aa4a53d87cf3678fa44e790ec 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1999-2021 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1999-2022 CNRS, Meteo-France and Universite Paul Sabatier
 !MNH_LIC This is part of the Meso-NH software governed by the CeCILL-C licence
 !MNH_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
@@ -156,6 +156,7 @@ USE MODE_MODELN_HANDLER
 USE MODE_MSG
 USE MODE_POS
 USE MODE_TIME
+USE MODE_WRITE_AIRCRAFT_BALLOON
 use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n
 !
 USE MODI_AIRCRAFT_BALLOON
@@ -166,7 +167,6 @@ USE MODI_INIT_MNH
 USE MODI_MNHGET_SURF_PARAM_n
 USE MODI_PHYS_PARAM_n
 USE MODI_VERSION
-USE MODI_WRITE_AIRCRAFT_BALLOON
 USE MODI_WRITE_DIAG_SURF_ATM_N
 USE MODI_WRITE_LFIFM1_FOR_DIAG
 USE MODI_WRITE_LFIFM1_FOR_DIAG_SUPP
diff --git a/src/MNH/modeln.f90 b/src/MNH/modeln.f90
index 01be406455d0fdb730ddb1beb61930d4eae62f3a..222333c7cba006527c43e621088d7e2f97ffd173 100644
--- a/src/MNH/modeln.f90
+++ b/src/MNH/modeln.f90
@@ -380,6 +380,7 @@ USE MODE_MODELN_HANDLER
 USE MODE_MPPDB
 USE MODE_MSG
 USE MODE_ONE_WAY_n
+USE MODE_WRITE_AIRCRAFT_BALLOON
 use mode_write_les_n,               only: Write_les_n
 use mode_write_lfifmn_fordiachro_n, only: WRITE_LFIFMN_FORDIACHRO_n
 USE MODE_WRITE_PROFILER_n,          ONLY: WRITE_PROFILER_n
@@ -446,7 +447,6 @@ USE MODI_TURB_CLOUD_INDEX
 USE MODI_TWO_WAY
 USE MODI_UPDATE_NSV
 USE MODI_VISCOSITY
-USE MODI_WRITE_AIRCRAFT_BALLOON
 USE MODI_WRITE_DESFM_n
 USE MODI_WRITE_DIAG_SURF_ATM_N
 USE MODI_WRITE_LFIFM_n
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 8c2132bf79951a7ed8c735c6dc3a5bc6d5401138..dc7726bcd2ab089886ebee69513cf98bb485150c 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -4,26 +4,28 @@
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !      ###########################
-MODULE MODI_WRITE_AIRCRAFT_BALLOON
+MODULE MODE_WRITE_AIRCRAFT_BALLOON
 !      ###########################
-!
-INTERFACE
-!
-      SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
-!
-USE MODD_IO, ONLY: TFILEDATA
-!
-TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
-!
-END SUBROUTINE WRITE_AIRCRAFT_BALLOON
-!
-END INTERFACE
-!
-END MODULE MODI_WRITE_AIRCRAFT_BALLOON
-!
-!     ##########################################
-      SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
-!     ##########################################
+
+use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+
+implicit none
+
+private
+
+public :: WRITE_AIRCRAFT_BALLOON
+
+CHARACTER(LEN=NCOMMENTLGTMAX), DIMENSION(:), ALLOCATABLE :: CCOMMENT ! comment string(
+CHARACTER(LEN=NMNHNAMELGTMAX), DIMENSION(:), ALLOCATABLE :: CTITLE   ! title
+CHARACTER(LEN=NUNITLGTMAX),    DIMENSION(:), ALLOCATABLE :: CUNIT    ! physical unit
+
+REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: XWORK6   ! contains temporal serie
+
+contains
+
+! ##########################################
+SUBROUTINE WRITE_AIRCRAFT_BALLOON(TPDIAFILE)
+! ##########################################
 !
 !
 !!****  *WRITE_AIRCRAFT_BALLOON* - write the balloon and aircraft trajectories and records
@@ -77,20 +79,8 @@ END MODULE MODI_WRITE_AIRCRAFT_BALLOON
 !*      0. DECLARATIONS
 !          ------------
 !
-USE MODD_CST,             ONLY: XRV
-USE MODD_IO,              ONLY: TFILEDATA
-USE MODD_PARAMETERS,      ONLY: XUNDEF
-!
 USE MODD_AIRCRAFT_BALLOON
-USE MODD_NSV,             ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, &
-                                nsv_lima_beg, nsv_lima_end
-USE MODD_DIAG_IN_RUN,     ONLY: LDIAG_IN_RUN
-!
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-USE MODE_MODELN_HANDLER,  ONLY: GET_CURRENT_MODEL_INDEX
-use mode_msg
-use mode_write_diachro,   only: Write_diachro
+USE MODD_IO,              ONLY: TFILEDATA
 !
 IMPLICIT NONE
 !
@@ -103,70 +93,77 @@ TYPE(TFILEDATA), INTENT(IN) :: TPDIAFILE ! file to write
 !
 !       0.2  declaration of local variables
 !
-INTEGER :: IMI    ! current model index
 INTEGER :: JI
 !
 !----------------------------------------------------------------------------
 !
-IMI=GET_CURRENT_MODEL_INDEX()
-!
 DO JI = 1, NBALLOONS
-  CALL FLYER_DIACHRO( TBALLOONS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TBALLOONS(JI) )
 END DO
 
 DO JI = 1, NAIRCRAFTS
-  CALL FLYER_DIACHRO( TAIRCRAFTS(JI) )
+  CALL FLYER_DIACHRO( TPDIAFILE, TAIRCRAFTS(JI) )
 END DO
 !
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
-!
-CONTAINS
-!
-!----------------------------------------------------------------------------
-!----------------------------------------------------------------------------
+END SUBROUTINE WRITE_AIRCRAFT_BALLOON
 !
-SUBROUTINE FLYER_DIACHRO(TPFLYER)
+! ############################################
+SUBROUTINE FLYER_DIACHRO( TPDIAFILE, TPFLYER )
+! ############################################
+
+USE MODD_AIRCRAFT_BALLOON
+use modd_budget,           only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
+                                 tbudiachrometadata
+USE MODD_CST,              ONLY: XRV
+USE MODD_DIAG_IN_RUN,      ONLY: LDIAG_IN_RUN
+use modd_field,            only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, &
+                                 tfieldmetadata_base, TYPEREAL
+USE MODD_IO,               ONLY: TFILEDATA
+USE MODD_NSV,              ONLY: tsvlist, nsv, nsv_aer, nsv_aerbeg, nsv_aerend, nsv_dst, nsv_dstbeg, nsv_dstend, &
+                                 nsv_lima_beg, nsv_lima_end
+USE MODD_PARAMETERS,       ONLY: XUNDEF
+USE MODD_PARAM_n,          ONLY: CCLOUD
 
-use modd_budget, only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
-                       tbudiachrometadata
-use modd_field,  only: NMNHDIM_LEVEL, NMNHDIM_FLYER_PROC, NMNHDIM_FLYER_TIME, NMNHDIM_UNUSED, &
-                       tfieldmetadata_base, TYPEREAL
+USE MODE_AERO_PSD
+USE MODE_DUST_PSD
+USE MODE_MODELN_HANDLER,   ONLY: GET_CURRENT_MODEL_INDEX
+use mode_msg
+use mode_write_diachro,    only: Write_diachro
 
 use modi_aircraft_balloon, only: Aircraft_balloon_longtype_get
 
-CLASS(TFLYERDATA), INTENT(IN)       :: TPFLYER
+TYPE(TFILEDATA),   INTENT(IN) :: TPDIAFILE ! file to write
+CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER
 !
 !*      0.2  declaration of local variables for diachro
 !
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORK6 ! contains temporal serie
-REAL, DIMENSION(:,:,:,:,:,:), ALLOCATABLE :: ZWORKZ6! contains temporal serie
 REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
 REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
 !
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENT ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLE   ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNIT    ! physical unit
+CHARACTER(LEN=NMNHNAMELGTMAX) :: YTITLE
+CHARACTER(LEN=NCOMMENTLGTMAX) :: YCOMMENT
+CHARACTER(LEN=NUNITLGTMAX)    :: YUNIT
 !
+INTEGER :: IMI      ! current model index
 INTEGER :: IPROC    ! number of variables records
 INTEGER :: JPROC    ! loop counter
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YCOMMENTZ! comment string
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YTITLEZ  ! title
-CHARACTER(LEN=100), DIMENSION(:), ALLOCATABLE :: YUNITZ   ! physical unit
 INTEGER :: ISTORE
 INTEGER :: IPROCZ   ! number of variables records
-INTEGER :: JPROCZ   ! loop counter
+INTEGER :: IRR      ! number of hydrometeors
 INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
 INTEGER :: JPT      ! loop counter
-INTEGER :: IKU, IK
-INTEGER :: JLOOP
+INTEGER :: IKU
 type(tbudiachrometadata) :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
 !----------------------------------------------------------------------------
 !
+IMI = GET_CURRENT_MODEL_INDEX()
+
+IRR = SIZE( tpflyer%xr, 2 )
+
 IF (TPFLYER%NMODEL==0) RETURN
 IF (ALL(TPFLYER%XX==XUNDEF)) RETURN
 IF (COUNT(TPFLYER%XX/=XUNDEF)<=1) RETURN
@@ -174,7 +171,7 @@ IF ( IMI /= TPFLYER%NMODEL ) RETURN
 !
 IKU = SIZE(TPFLYER%XRTZ,2) !number of vertical levels
 !
-IPROC = 20 + SIZE(TPFLYER%XR,2) + SIZE(TPFLYER%XSV,2) &
+IPROC = 20 + IRR + SIZE(TPFLYER%XSV,2) &
        + 2 + SIZE(TPFLYER%XSVW_FLUX,2)
 IPROCZ = SIZE(TPFLYER%XRTZ,2)+ SIZE(TPFLYER%XRZ,2)+ SIZE(TPFLYER%XRZ,3)+  SIZE(TPFLYER%XCRARE,2)+ &
          SIZE(TPFLYER%XCRARE_ATT,2)+ SIZE(TPFLYER%XWZ,2) + SIZE(TPFLYER%XFFZ,2)+ &
@@ -189,120 +186,52 @@ IF (LDUST) IPROC = IPROC + NMODE_DST*3
 IF (SIZE(TPFLYER%XTSRAD)>0) IPROC = IPROC + 1
 !
 ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
-
-ALLOCATE (ZWORK6(1,1,1,ISTORE,1,IPROC))
-ALLOCATE (YCOMMENT(IPROC))
-ALLOCATE (YTITLE  (IPROC))
-ALLOCATE (YUNIT   (IPROC))
-ALLOCATE (ZWORKZ6(1,1,IKU,ISTORE,1,IPROCZ))
-ALLOCATE (YCOMMENTZ(IPROCZ))
-ALLOCATE (YTITLEZ (IPROCZ))
-ALLOCATE (YUNITZ  (IPROCZ))
 !
 !----------------------------------------------------------------------------
-JPROC = 0
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZS'
-YUNIT    (JPROC) = 'm'
-YCOMMENT (JPROC) = 'orography'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZS(:)
+!Treat point values
+ALLOCATE (XWORK6(1,1,1,ISTORE,1,IPROC))
+ALLOCATE (CCOMMENT(IPROC))
+ALLOCATE (CTITLE  (IPROC))
+ALLOCATE (CUNIT   (IPROC))
+
+jproc = 0
+
+call Add_point( 'ZS', 'orography', 'm', tpflyer%xzs(:) )
 !
 SELECT TYPE ( TPFLYER )
   CLASS IS ( TAIRCRAFTDATA )
     IF (TPFLYER%LALTDEF) THEN
-      JPROC = JPROC + 1
-      YTITLE   (JPROC) = 'P'
-      YUNIT    (JPROC) = 'Pascal'
-      YCOMMENT (JPROC) = 'pressure'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XP(:)
+      call Add_point( 'P', 'pressure', 'Pascal', tpflyer%xp(:) )
     ELSE
-      JPROC = JPROC + 1
-      YTITLE   (JPROC) = 'Z'
-      YUNIT    (JPROC) = 'm'
-      YCOMMENT (JPROC) = 'altitude'
-      ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
+      call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
     ENDIF
 
   CLASS IS ( TBALLOONDATA )
-    JPROC = JPROC + 1
-    YTITLE   (JPROC) = 'Z'
-    YUNIT    (JPROC) = 'm'
-    YCOMMENT (JPROC) = 'altitude'
-    ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZ(:)
+    call Add_point( 'Z', 'altitude', 'm', tpflyer%xz(:) )
 
 END SELECT
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LON'
-YUNIT    (JPROC) = 'degree'
-YCOMMENT (JPROC) = 'longitude'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLON(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LAT'
-YUNIT    (JPROC) = 'degree'
-YCOMMENT (JPROC) = 'latitude'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XLAT(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'ZON_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'zonal wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XZON(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'MER_WIND'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'meridian wind'
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XMER(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'W'
-YUNIT    (JPROC) = 'm s-1'
-YCOMMENT (JPROC) = 'air vertical speed' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XW(:)
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'Th'
-YUNIT    (JPROC) = 'K'
-YCOMMENT (JPROC) = 'potential temperature' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTH(:)
-!
-DO JRR=1,SIZE(TPFLYER%XR,2)
-  JPROC = JPROC+1
-  YUNIT    (JPROC) = 'kg kg-1'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,JRR)
-  IF (JRR==1) THEN
-    YTITLE   (JPROC) = 'Rv'
-    YCOMMENT (JPROC) = 'water vapor mixing ratio' 
-  ELSE IF (JRR==2) THEN
-    YTITLE   (JPROC) = 'Rc'
-    YCOMMENT (JPROC) = 'liquid cloud water mixing ratio' 
-  ELSE IF (JRR==3) THEN
-    YTITLE   (JPROC) = 'Rr'
-    YCOMMENT (JPROC) = 'Rain water mixing ratio' 
-  ELSE IF (JRR==4) THEN
-    YTITLE   (JPROC) = 'Ri'
-    YCOMMENT (JPROC) = 'Ice cloud water mixing ratio' 
-  ELSE IF (JRR==5) THEN
-    YTITLE   (JPROC) = 'Rs'
-    YCOMMENT (JPROC) = 'Snow mixing ratio' 
-  ELSE IF (JRR==6) THEN
-    YTITLE   (JPROC) = 'Rg'
-    YCOMMENT (JPROC) = 'Graupel mixing ratio' 
-  ELSE IF (JRR==7) THEN
-    YTITLE   (JPROC) = 'Rh'
-    YCOMMENT (JPROC) = 'Hail mixing ratio' 
-  END IF
-END DO
+call Add_point( 'LON',      'longitude',             'degree', tpflyer%xlon(:) )
+call Add_point( 'LAT',      'latitude',              'degree', tpflyer%xlat(:) )
+call Add_point( 'ZON_WIND', 'zonal wind',            'm s-1',  tpflyer%xzon(:) )
+call Add_point( 'MER_WIND', 'meridian wind',         'm s-1',  tpflyer%xmer(:) )
+call Add_point( 'W',        'air vertical speed',    'm s-1',  tpflyer%xw(:)   )
+call Add_point( 'Th',       'potential temperature', 'K',      tpflyer%xth(:)  )
+!
+if ( irr >= 1 ) call Add_point( 'Rv', 'water vapor mixing ratio',        'kg kg-1', tpflyer%xr(:,1) )
+if ( irr >= 2 ) call Add_point( 'Rc', 'liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xr(:,2) )
+if ( irr >= 3 ) call Add_point( 'Rr', 'Rain water mixing ratio',         'kg kg-1', tpflyer%xr(:,3) )
+if ( irr >= 4 ) call Add_point( 'Ri', 'Ice cloud water mixing ratio',    'kg kg-1', tpflyer%xr(:,4) )
+if ( irr >= 5 ) call Add_point( 'Rs', 'Snow mixing ratio',               'kg kg-1', tpflyer%xr(:,5) )
+if ( irr >= 6 ) call Add_point( 'Rg', 'Graupel mixing ratio',            'kg kg-1', tpflyer%xr(:,6) )
+if ( irr >= 7 ) call Add_point( 'Rh', 'Hail mixing ratio',               'kg kg-1', tpflyer%xr(:,7) )
 !
 !add cloud liquid water content in g/m3 to compare to measurements from FSSP
 !IF (.NOT.(ANY(TPFLYER%XP(:) == 0.))) THEN
 ALLOCATE (ZRHO(1,1,ISTORE))
-IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present
+IF ( IRR > 1 ) THEN !cloud water is present
   ZRHO(1,1,:) = 0.
-  DO JRR=1,SIZE(TPFLYER%XR,2)
+  DO JRR = 1, IRR
     ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
   ENDDO
   ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -315,64 +244,31 @@ IF (SIZE(TPFLYER%XR,2) >1) THEN !cloud water is present
                (XRD *ZRHO(1,1,JPT) *((TPFLYER%XP(JPT)/XP00)**(XRD/XCPD))  )
     ENDIF
   ENDDO
-  JPROC = JPROC + 1
-  YTITLE   (JPROC) = 'LWC'
-  YUNIT    (JPROC) = 'g m-3'
-  YCOMMENT (JPROC) = 'cloud liquid water content'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XR(:,2)*ZRHO(1,1,:)*1.E3
+  call Add_point( 'LWC', 'cloud liquid water content', 'g m-3', tpflyer%xr(:,2)*ZRHO(1,1,:)*1.E3 )
   DEALLOCATE (ZRHO)
 ENDIF
 !ENDIF
 !
-IF (SIZE(TPFLYER%XTKE)>0) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'Turbulent kinetic energy' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE(:)
-END IF
-!
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'H_FLUX'
-YUNIT    (JPROC) = 'W m-2'
-YCOMMENT (JPROC) = 'sensible flux' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTHW_FLUX(:)
+IF (SIZE(TPFLYER%XTKE)>0) call Add_point( 'Tke', 'Turbulent kinetic energy', 'm2 s-2', tpflyer%xtke(:) )
 !
-JPROC = JPROC + 1
-YTITLE   (JPROC) = 'LE_FLUX'
-YUNIT    (JPROC) = 'W m-2'
-YCOMMENT (JPROC) = 'latent flux' 
-ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XRCW_FLUX(:)
+call Add_point( 'H_FLUX',  'sensible flux', 'W m-2', tpflyer%xthw_flux(:) )
+call Add_point( 'LE_FLUX', 'latent flux',   'W m-2', tpflyer%xrcw_flux(:) )
 !
 DO JSV=1,SIZE(TPFLYER%XSVW_FLUX,2)
-  JPROC = JPROC + 1
-!PW: titre a modifier pour recuperer nom variables scalaires depuis TSVLIST?
-  WRITE ( YTITLE(JPROC), FMT = '( A7, I3.3 )' ) 'SV_FLUX', JSV
-  YUNIT    (JPROC) = 'SVUNIT m s-1'
-  YCOMMENT (JPROC) = 'scalar flux' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XSVW_FLUX(:,JSV)
+  WRITE ( YTITLE, FMT = '( A, I3.3 )' ) 'SV_FLUX', JSV
+  call Add_point( Trim( ytitle ), 'scalar flux', 'SVUNIT m s-1', tpflyer%xsvw_flux(:,jsv) )
 END DO
 IF (LDIAG_IN_RUN) THEN
-  JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tke_Diss'
-  YUNIT    (JPROC) = 'm2 s-2'
-  YCOMMENT (JPROC) = 'TKE dissipation rate' 
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTKE_DISS(:)
+  call Add_point( 'Tke_Diss', 'TKE dissipation rate', 'm2 s-2', tpflyer%xtke_diss(:) )
 ENDIF
 !
 IF (SIZE(TPFLYER%XSV,2)>=1) THEN
   ! Scalar variables
   DO JSV = 1, NSV
-    JPROC = JPROC + 1
-
-    YTITLE(JPROC)   = TRIM( TSVLIST(JSV)%CMNHNAME )
-    YCOMMENT(JPROC) = ''
     IF ( TRIM( TSVLIST(JSV)%CUNITS ) == 'ppv' ) THEN
-      YUNIT(JPROC)  = 'ppb'
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV) * 1.e9 !*1e9 for conversion ppv->ppb
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', 'ppb', tpflyer%xsv(:,jsv) * 1.e9 ) !*1e9 for conversion ppv->ppb
     ELSE
-      YUNIT(JPROC)  = TRIM( TSVLIST(JSV)%CUNITS )
-      ZWORK6(1,1,1,:,1,JPROC) = TPFLYER%XSV(:,JSV)
+      call Add_point( Trim( tsvlist(jsv)%cmnhname ), '', Trim( tsvlist(jsv)%cunits ), tpflyer%xsv(:,jsv) )
     END IF
   END DO
 
@@ -385,9 +281,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     ALLOCATE (ZSIG(1,1,ISTORE,JPMODE))
     ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE))
     ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(:,NSV_AERBEG:NSV_AEREND)
-    IF (SIZE(TPFLYER%XR,2) >0) THEN
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%XR,2)
+      DO JRR=1,IRR
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -408,128 +304,88 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     ENDDO
     DO JSV=1,JPMODE
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERRGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'RG (nb) AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) )
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'AERSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERSIGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'SIGMA AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) )
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'AERN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 AERO MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'AERN0A',JSV
+      WRITE(YCOMMENT,'(A,I1)')'N0 AERO MODE ',JSV
+      call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) )
       ! mass concentration in microg/m3
       ! sulfate
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MSO4',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SO4 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SO4,JSV)
+      WRITE(YTITLE,'(A,I1)')'MSO4',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SO4,JSV) )
       ! nitrate
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MNO3',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NO3 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NO3,JSV)
+      WRITE(YTITLE,'(A,I1)')'MNO3',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NO3,JSV) )
       ! amoniac
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MNH3',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS NH3 AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_NH3,JSV)
+      WRITE(YTITLE,'(A,I1)')'MNH3',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_NH3,JSV) )
       ! water
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MH2O',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS H2O AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_H2O,JSV)
+      WRITE(YTITLE,'(A,I1)')'MH2O',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_H2O,JSV) )
       IF (NSOA .EQ. 10) THEN
         ! SOA1
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA1',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA1 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA1,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA1',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA1,JSV) )
         ! SOA2
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA2',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA2 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA2,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA2',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA2,JSV) )
         ! SOA3
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA3',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA3 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA3,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA3',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA3,JSV) )
         ! SOA4
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA4',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA4 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA4,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA4',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA4,JSV) )
         ! SOA5
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA5',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA5 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA5,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA5',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA5,JSV) )
         ! SOA6
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA6',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA6 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA6,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA6',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA6,JSV) )
         ! SOA7
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA7',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA7 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA7,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA7',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA7,JSV) )
         ! SOA8
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA8',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA8 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA8,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA8',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA8,JSV) )
         ! SOA9
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA9',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA9 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA9,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA9',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA9,JSV) )
         ! SOA10
-        JPROC = JPROC + 1
-        WRITE(YTITLE(JPROC),'(A4,I1)')'MSOA10',JSV
-        YUNIT    (JPROC) = 'ug m-3'
-        WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS SOA10 AEROSOL MODE ',JSV
-        ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_SOA10,JSV)
+        WRITE(YTITLE,'(A,I1)')'MSOA10',JSV
+        WRITE(YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV
+        call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_SOA10,JSV) )
       ENDIF
       ! OC
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MOC',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS OC AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_OC,JSV)
+      WRITE(YTITLE,'(A,I1)')'MOC',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_OC,JSV) )
       ! BC
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MBC',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS BC AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_BC,JSV)
+      WRITE(YTITLE,'(A,I1)')'MBC',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_BC,JSV) )
       ! dust
-      JPROC = JPROC + 1
-      WRITE(YTITLE(JPROC),'(A4,I1)')'MDUST',JSV
-      YUNIT    (JPROC) = 'ug m-3'
-      WRITE(YCOMMENT(JPROC),'(A22,I1)')'MASS DUST AEROSOL MODE ',JSV
-      ZWORK6(1,1,1,:,1,JPROC) = ZPTOTA(1,1,:,JP_AER_DST,JSV)
+      WRITE(YTITLE,'(A,I1)')'MDUST',JSV
+      WRITE(YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV
+      call Add_point( Trim( ytitle ), 'ug m-3', Trim( ycomment ), ZPTOTA(1,1,:,JP_AER_DST,JSV) )
     ENDDO
     DEALLOCATE (ZSV,ZRHO)
     DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA)
@@ -542,9 +398,9 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST))
     ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST))
     ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(:,NSV_DSTBEG:NSV_DSTEND)
-    IF (SIZE(TPFLYER%XR,2) >0) THEN
+    IF (IRR >0) THEN
       ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPFLYER%XR,2)
+      DO JRR=1,IRR
         ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(:,JRR)
       ENDDO
       ZRHO(1,1,:) = TPFLYER%XTH(:) * ( 1. + XRV/XRD*TPFLYER%XR(:,1) )  &
@@ -557,23 +413,17 @@ IF (SIZE(TPFLYER%XSV,2)>=1) THEN
     CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
     DO JSV=1,NMODE_DST
       ! mean radius
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTRGA',JSV
-      YUNIT    (JPROC) = 'um'
-      WRITE(YCOMMENT(JPROC),'(A18,I1)')'RG (nb) DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZRG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTRGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'RG (nb) DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), 'um', Trim( ycomment ), ZRG(1,1,:,JSV) )
       ! standard deviation
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A7,I1)')'DSTSIGA',JSV
-      YUNIT    (JPROC) = '  '
-      WRITE(YCOMMENT(JPROC),'(A16,I1)')'SIGMA DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZSIG(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTSIGA',JSV
+      WRITE(YCOMMENT,'(A,I1)')'SIGMA DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), '1', Trim( ycomment ), ZSIG(1,1,:,JSV) )
       ! particles number
-      JPROC = JPROC+1
-      WRITE(YTITLE(JPROC),'(A6,I1)')'DSTN0A',JSV
-      YUNIT    (JPROC) = 'm-3'
-      WRITE(YCOMMENT(JPROC),'(A13,I1)')'N0 DUST MODE ',JSV
-      ZWORK6 (1,1,1,:,1,JPROC) = ZN0(1,1,:,JSV)
+      WRITE(YTITLE,'(A,I1)')'DSTN0A',JSV
+      WRITE(YCOMMENT,'(A,I1)')'N0 DUST MODE ',JSV
+      call Add_point( Trim( ytitle ), 'm-3', Trim( ycomment ), ZN0(1,1,:,JSV) )
     ENDDO
     DEALLOCATE (ZSV,ZRHO)
     DEALLOCATE (ZN0,ZRG,ZSIG)
@@ -582,124 +432,19 @@ ENDIF
 !
 IF (SIZE(TPFLYER%XTSRAD)>0) THEN
   JPROC = JPROC+1
-  YTITLE   (JPROC) = 'Tsrad'
-  YUNIT    (JPROC) = 'K'
-  YCOMMENT (JPROC) = 'Radiative Surface Temperature'
-  ZWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:)
+  CTITLE   (JPROC) = 'Tsrad'
+  CUNIT    (JPROC) = 'K'
+  CCOMMENT (JPROC) = 'Radiative Surface Temperature'
+  XWORK6 (1,1,1,:,1,JPROC) = TPFLYER%XTSRAD(:)
 END IF
 !
-DO IK=1, IKU
-!
-  JPROCZ=0
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'Rt'
-  YUNITZ   (JPROCZ) = 'kg kg-1'
-  YCOMMENTZ(JPROCZ) = '1D Total hydrometeor mixing ratio'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRTZ(:,IK)
-!
-  DO JRR=1,SIZE(TPFLYER%XRZ,3)
-    JPROCZ = JPROCZ+1
-    YUNITZ    (JPROCZ) = 'kg kg-1'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XRZ(:,IK,JRR)
-    IF (JRR==1) THEN
-      YTITLEZ   (JPROCZ) = 'Rv'
-      YCOMMENTZ (JPROCZ) = '1D water vapor mixing ratio' 
-    ELSE IF (JRR==2) THEN
-      YTITLEZ   (JPROCZ) = 'Rc'
-      YCOMMENTZ (JPROCZ) = '1D liquid cloud water mixing ratio' 
-    ELSE IF (JRR==3) THEN
-      YTITLEZ   (JPROCZ) = 'Rr'
-      YCOMMENTZ (JPROCZ) = '1D Rain water mixing ratio' 
-    ELSE IF (JRR==4) THEN
-      YTITLEZ   (JPROCZ) = 'Ri'
-      YCOMMENTZ (JPROCZ) = '1D Ice cloud water mixing ratio' 
-    ELSE IF (JRR==5) THEN
-      YTITLEZ   (JPROCZ) = 'Rs'
-      YCOMMENTZ (JPROCZ) = '1D Snow mixing ratio' 
-    ELSE IF (JRR==6) THEN
-      YTITLEZ   (JPROCZ) = 'Rg'
-      YCOMMENTZ (JPROCZ) = '1D Graupel mixing ratio' 
-    ELSE IF (JRR==7) THEN
-      YTITLEZ   (JPROCZ) = 'Rh'
-      YCOMMENTZ (JPROCZ) = '1D Hail mixing ratio' 
-    END IF
-  END DO
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'FF'
-  YUNITZ   (JPROCZ) = 'm s-1'
-  YCOMMENTZ(JPROCZ) = 'Horizontal wind'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XFFZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'IWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Ice water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XIWCZ(:,IK)
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'LWC'
-  YUNITZ   (JPROCZ) = 'kg m-3'
-  YCOMMENTZ(JPROCZ) = 'Liquid water content'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XLWCZ(:,IK)
-!
-  IF (NSV_LIMA_BEG/=NSV_LIMA_END) THEN
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CIT'
-    YUNITZ   (JPROCZ) = 'm-3'
-    YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,IK)
-  ELSE
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CCLOUDT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'liquid cloud concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCCZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CRAINT'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Rain concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRZ(:,IK)
-!
-    JPROCZ = JPROCZ + 1
-    YTITLEZ  (JPROCZ) = 'CICET'
-    YUNITZ   (JPROCZ) = 'kg-1'
-    YCOMMENTZ(JPROCZ) = 'Ice concentration'
-    ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCIZ(:,IK)
- ENDIF
-!
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RARE'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar reflectivity'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'RAREatt'
-  YUNITZ   (JPROCZ) = 'dBZ'
-  YCOMMENTZ(JPROCZ) = '1D cloud radar attenuated reflectivity' 
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XCRARE_ATT(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'W'
-  YUNITZ   (JPROCZ) = 'm s-1'
-  YCOMMENTZ(JPROCZ) = '1D vertical velocity' 
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XWZ(:,IK)
-  JPROCZ = JPROCZ + 1
-  YTITLEZ  (JPROCZ) = 'Z'
-  YUNITZ   (JPROCZ) = 'm'
-  YCOMMENTZ(JPROCZ) = '1D altitude above sea'
-  ZWORKZ6 (1,1,IK,:,1,JPROCZ) = TPFLYER%XZZ(:,IK)
-END DO
-!----------------------------------------------------------------------------
-
 allocate( tzfields( jproc ) )
 
-tzfields(:)%cmnhname  = ytitle(1 : jproc)
+tzfields(:)%cmnhname  = ctitle(1 : jproc)
 tzfields(:)%cstdname  = ''
-tzfields(:)%clongname = ytitle(1 : jproc)
-tzfields(:)%cunits    = yunit(1 : jproc)
-tzfields(:)%ccomment  = ycomment(1 : jproc)
+tzfields(:)%clongname = ctitle(1 : jproc)
+tzfields(:)%cunits    = cunit(1 : jproc)
+tzfields(:)%ccomment  = ccomment(1 : jproc)
 tzfields(:)%ngrid     = 0
 tzfields(:)%ntype     = TYPEREAL
 tzfields(:)%ndims     = 2
@@ -755,18 +500,61 @@ tzbudiachro%lnorm      = .false.
 ! tzbudiachro%nkl        = NOT SET (default values)
 ! tzbudiachro%nkh        = NOT SET (default values)
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zwork6(:,:,:,:,:,:jproc), &
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), &
                     tpflyer = tpflyer                                                                        )
 
-deallocate( tzfields )
+Deallocate( tzfields )
+Deallocate( xwork6 )
+Deallocate( ccomment )
+Deallocate( ctitle )
+Deallocate( cunit )
 
-allocate( tzfields( jprocz ) )
+!----------------------------------------------------------------------------
+!Treat vertical profiles
+
+ALLOCATE (XWORK6(1,1,IKU,ISTORE,1,IPROCZ))
+ALLOCATE (CCOMMENT(IPROCZ))
+ALLOCATE (CTITLE (IPROCZ))
+ALLOCATE (CUNIT  (IPROCZ))
 
-tzfields(:)%cmnhname  = ytitlez(1 : jprocz)
+JPROC = 0
+
+call Add_profile( 'Rt', '1D Total hydrometeor mixing ratio', 'kg kg-1', tpflyer%xrtz(:,:) )
+
+if ( irr >= 1 ) call Add_profile( 'Rv', '1D water vapor mixing ratio',        'kg kg-1', tpflyer%xrz(:,:,1) )
+if ( irr >= 2 ) call Add_profile( 'Rc', '1D liquid cloud water mixing ratio', 'kg kg-1', tpflyer%xrz(:,:,2) )
+if ( irr >= 3 ) call Add_profile( 'Rr', '1D Rain water mixing ratio',         'kg kg-1', tpflyer%xrz(:,:,3) )
+if ( irr >= 4 ) call Add_profile( 'Ri', '1D Ice cloud water mixing ratio',    'kg kg-1', tpflyer%xrz(:,:,4) )
+if ( irr >= 5 ) call Add_profile( 'Rs', '1D Snow mixing ratio',               'kg kg-1', tpflyer%xrz(:,:,5) )
+if ( irr >= 6 ) call Add_profile( 'Rg', '1D Graupel mixing ratio',            'kg kg-1', tpflyer%xrz(:,:,6) )
+if ( irr >= 7 ) call Add_profile( 'Rh', '1D Hail mixing ratio',               'kg kg-1', tpflyer%xrz(:,:,7) )
+
+call Add_profile( 'FF', 'Horizontal wind', 'm s-1', tpflyer%xffz(:,:) )
+
+call Add_profile( 'IWC', 'Ice water content',    'kg m-3', tpflyer%xiwcz(:,:) )
+call Add_profile( 'LWC', 'Liquid water content', 'kg m-3', tpflyer%xlwcz(:,:) )
+
+IF ( CCLOUD == 'LIMA' ) THEN
+  call Add_profile( 'CCLOUDT', 'liquid cloud concentration', 'kg-1', tpflyer%xccz(:,:) )
+  call Add_profile( 'CRAINT',  'Rain concentration',         'kg-1', tpflyer%xcrz(:,:) )
+  call Add_profile( 'CICET',   'Ice concentration',          'kg-1', tpflyer%xciz(:,:) )
+ELSE IF ( CCLOUD == 'ICE3' .OR. CCLOUD == 'ICE4' ) THEN
+  call Add_profile( 'CIT', 'Ice concentration', 'm-3', tpflyer%xciz(:,:) )
+END IF
+
+call Add_profile( 'RARE',    '1D cloud radar reflectivity',            'dBZ', tpflyer%xcrare(:,:) )
+call Add_profile( 'RAREatt', '1D cloud radar attenuated reflectivity', 'dBZ', tpflyer%xcrare_att(:,:) )
+
+call Add_profile( 'W', '1D vertical velocity', 'm s-1', tpflyer%xwz(:,:) )
+call Add_profile( 'Z', '1D altitude above sea', 'm', tpflyer%xzz(:,:) )
+
+allocate( tzfields( jproc ) )
+
+tzfields(:)%cmnhname  = ctitle(1 : jproc)
 tzfields(:)%cstdname  = ''
-tzfields(:)%clongname = ytitlez(1 : jprocz)
-tzfields(:)%cunits    = yunitz(1 : jprocz)
-tzfields(:)%ccomment  = ycommentz(1 : jprocz)
+tzfields(:)%clongname = ctitle(1 : jproc)
+tzfields(:)%cunits    = cunit(1 : jproc)
+tzfields(:)%ccomment  = ccomment(1 : jproc)
 tzfields(:)%ngrid     = 0
 tzfields(:)%ntype     = TYPEREAL
 tzfields(:)%ndims     = 3
@@ -827,22 +615,71 @@ tzbudiachro%njh        = 1
 tzbudiachro%nkl        = 1
 tzbudiachro%nkh        = iku
 
-call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, zworkz6(:,:,:,:,:,:jprocz), &
-                    tpflyer = tpflyer                                                                          )
+call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpflyer%tflyer_time%tpdates, xwork6(:,:,:,:,:,:jproc), &
+                    tpflyer = tpflyer                                                                        )
 
 deallocate( tzfields )
 
-DEALLOCATE (ZWORK6)
-DEALLOCATE (YCOMMENT)
-DEALLOCATE (YTITLE  )
-DEALLOCATE (YUNIT   )
-DEALLOCATE (ZWORKZ6)
-DEALLOCATE (YCOMMENTZ)
-DEALLOCATE (YTITLEZ )
-DEALLOCATE (YUNITZ  )
+DEALLOCATE (XWORK6)
+DEALLOCATE (CCOMMENT)
+DEALLOCATE (CTITLE  )
+DEALLOCATE (CUNIT   )
+
+contains
+
+subroutine Add_profile( htitle, hcomment, hunits, pfield )
+
+use mode_msg
+
+character(len=*),     intent(in) :: htitle
+character(len=*),     intent(in) :: hcomment
+character(len=*),     intent(in) :: hunits
+real, dimension(:,:), intent(in) :: pfield
+
+integer :: jk
+
+jproc = jproc + 1
+
+if ( jproc > iprocz ) call Print_msg( NVERB_FATAL, 'IO', 'Add_profile', 'more processes than expected' )
+
+ctitle(jproc)   = Trim( htitle )
+ccomment(jproc) = Trim( hcomment )
+cunit(jproc)    = Trim( hunits )
+
+do jk = 1, iku
+  xwork6(1, 1, jk, :, 1, jproc) = pfield(:, jk)
+end do
+
+end subroutine Add_profile
+
+
+subroutine Add_point( htitle, hcomment, hunits, pfield )
+
+use mode_msg
+
+character(len=*),   intent(in) :: htitle
+character(len=*),   intent(in) :: hcomment
+character(len=*),   intent(in) :: hunits
+real, dimension(:), intent(in) :: pfield
+
+integer :: jk
+
+jproc = jproc + 1
+
+if ( jproc > iproc ) call Print_msg( NVERB_FATAL, 'IO', 'Add_point', 'more processes than expected' )
+
+ctitle(jproc)   = Trim( htitle)
+ccomment(jproc) = Trim( hcomment )
+cunit(jproc)    = Trim( hunits )
+
+xwork6(1, 1, 1, :, 1, jproc) = pfield(:)
+
+end subroutine Add_point
+
 !----------------------------------------------------------------------------
 END SUBROUTINE FLYER_DIACHRO
 !----------------------------------------------------------------------------
 !----------------------------------------------------------------------------
 !
-END SUBROUTINE WRITE_AIRCRAFT_BALLOON
+
+END MODULE MODE_WRITE_AIRCRAFT_BALLOON