diff --git a/src/MNH/mode_sensor.f90 b/src/MNH/mode_sensor.f90
index 1eb047b839d368fad17ea76f9e9a45e2cfd0396b..bd6c86b3b6ee45c674bba2638188b766f3cd947b 100644
--- a/src/MNH/mode_sensor.f90
+++ b/src/MNH/mode_sensor.f90
@@ -21,6 +21,9 @@ MODULE MODE_SENSOR
   PUBLIC :: ADD_FIXPOINT
   PUBLIC :: ADD_POINT
   PUBLIC :: ADD_PROFILE
+  PUBLIC :: ADD_ORILAM_DATA
+  PUBLIC :: ADD_DUST_DATA
+  PUBLIC :: ADD_SALT_DATA
   PUBLIC :: SENSOR_WRITE_WORKARRAYS_ALLOCATE
   PUBLIC :: SENSOR_WRITE_WORKARRAYS_DEALLOCATE
   PUBLIC :: SENSOR_CURRENT_PROCESSES_NUMBER_GET
@@ -513,6 +516,290 @@ CONTAINS
   END SUBROUTINE ADD_PROFILE
 
 
+  SUBROUTINE ADD_ORILAM_DATA( TPSENSOR, KLEVEL, KSTORE )
+    USE MODD_CH_AEROSOL
+    USE MODD_CONF_N,     ONLY: NRR
+    USE MODD_CH_AEROSOL, ONLY: NCARB, NSOA, NSP
+    USE MODD_CST,        ONLY: XP00, XCPD, XRD, XRV
+    USE MODD_NSV,        ONLY: NSV_AER, NSV_AERBEG, NSV_AEREND
+
+    USE MODE_AERO_PSD,   ONLY: PPP2AERO
+
+    CLASS(TSENSOR), INTENT(IN) :: TPSENSOR
+    INTEGER,        INTENT(IN) :: KLEVEL  ! Number of vertical levels
+    INTEGER,        INTENT(IN) :: KSTORE  ! Number of store instants
+
+    INTEGER                                   :: JRR
+    INTEGER                                   :: JSV
+    CHARACTER(LEN=NCOMMENTLGTMAX)             :: YCOMMENT
+    CHARACTER(LEN=NMNHNAMELGTMAX)             :: YTITLE
+    REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
+    REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG
+    REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
+
+    IF ( .NOT. LORILAM ) RETURN
+
+    ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_AER) )
+    ALLOCATE( ZRHO(1, KLEVEL, KSTORE) )
+    ALLOCATE( ZN0 (1, KLEVEL, KSTORE, JPMODE) )
+    ALLOCATE( ZRG (1, KLEVEL, KSTORE, JPMODE) )
+    ALLOCATE( ZSIG(1, KLEVEL, KSTORE, JPMODE) )
+    ALLOCATE( ZPTOTA(1, KLEVEL, KSTORE, NSP+NCARB+NSOA, JPMODE ))
+
+    ZSV(1,:,:,1:NSV_AER) = TPSENSOR%XSV(:,:,NSV_AERBEG:NSV_AEREND)
+
+    IF ( NRR  > 0 ) THEN
+      ZRHO(1,:,:) = 0.
+      DO JRR = 1, NRR
+        ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR)
+      END DO
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) )
+    ELSE
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:)
+    ENDIF
+
+    ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) )
+
+    CALL PPP2AERO( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA )
+
+    DO JSV = 1, JPMODE
+      ! mean radius
+      WRITE( YTITLE,   '( a6,  i1 )' ) 'AERRGA', JSV
+      WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) AERO MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) )
+
+      ! standard deviation
+      WRITE( YTITLE,   '( A7,  I1 )' ) 'AERSIGA', JSV
+      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA AERO MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, '1', ZSIG(1,:,:,JSV) )
+
+      ! particles number
+      WRITE( YTITLE,   '( A6,  I1 )' ) 'AERN0A', JSV
+      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 AERO MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) )
+
+      ! mass concentration in microg/m3
+      ! sulfate
+      WRITE( YTITLE,'(A,I1)')'MSO4',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SO4,JSV) )
+
+      ! nitrate
+      WRITE( YTITLE,'(A,I1)')'MNO3',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_NO3,JSV) )
+
+      ! amoniac
+      WRITE( YTITLE,'(A,I1)')'MNH3',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_NH3,JSV) )
+
+      ! water
+      WRITE( YTITLE,'(A,I1)')'MH2O',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_H2O,JSV) )
+
+      IF ( NSOA == 10 ) THEN
+        ! SOA1
+        WRITE( YTITLE,'(A,I1)')'MSOA1',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA1,JSV) )
+
+        ! SOA2
+        WRITE( YTITLE,'(A,I1)')'MSOA2',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA2,JSV) )
+
+        ! SOA3
+        WRITE( YTITLE,'(A,I1)')'MSOA3',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA3,JSV) )
+
+        ! SOA4
+        WRITE( YTITLE,'(A,I1)')'MSOA4',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA4,JSV) )
+
+        ! SOA5
+        WRITE( YTITLE,'(A,I1)')'MSOA5',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA5,JSV) )
+
+        ! SOA6
+        WRITE( YTITLE,'(A,I1)')'MSOA6',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA6,JSV) )
+
+        ! SOA7
+        WRITE( YTITLE,'(A,I1)')'MSOA7',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA7,JSV) )
+
+        ! SOA8
+        WRITE( YTITLE,'(A,I1)')'MSOA8',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA8,JSV) )
+
+        ! SOA9
+        WRITE( YTITLE,'(A,I1)')'MSOA9',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA9,JSV) )
+
+        ! SOA10
+        WRITE( YTITLE,'(A,I1)')'MSOA10',JSV
+        WRITE( YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV
+        CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_SOA10,JSV) )
+      END IF
+
+      ! OC
+      WRITE( YTITLE,'(A,I1)')'MOC',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_OC,JSV) )
+
+      ! BC
+      WRITE( YTITLE,'(A,I1)')'MBC',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_BC,JSV) )
+
+      ! dust
+      WRITE( YTITLE,'(A,I1)')'MDUST',JSV
+      WRITE( YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV
+      CALL ADD_PROFILE( TRIM( YTITLE ), TRIM( YCOMMENT ), 'ug m-3', ZPTOTA(1,:,:,JP_AER_DST,JSV) )
+    END DO
+
+    DEALLOCATE( ZSV, ZRHO, ZN0, ZRG, ZSIG, ZPTOTA )
+
+  END SUBROUTINE ADD_ORILAM_DATA
+
+  SUBROUTINE ADD_DUST_DATA( TPSENSOR, KLEVEL, KSTORE )
+    USE MODD_CONF_N,     ONLY: NRR
+    USE MODD_CST,        ONLY: XP00, XCPD, XRD, XRV
+    USE MODD_DUST
+    USE MODD_NSV,        ONLY: NSV_DST, NSV_DSTBEG, NSV_DSTEND
+
+    USE MODE_DUST_PSD,   ONLY: PPP2DUST
+
+    CLASS(TSENSOR), INTENT(IN) :: TPSENSOR
+    INTEGER,        INTENT(IN) :: KLEVEL  ! Number of vertical levels
+    INTEGER,        INTENT(IN) :: KSTORE  ! Number of store instants
+
+    INTEGER                                   :: JRR
+    INTEGER                                   :: JSV
+    CHARACTER(LEN=NCOMMENTLGTMAX)             :: YCOMMENT
+    CHARACTER(LEN=NMNHNAMELGTMAX)             :: YTITLE
+    REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
+    REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG
+
+    IF ( .NOT. LDUST ) RETURN
+
+    ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_DST) )
+    ALLOCATE( ZRHO(1, KLEVEL, KSTORE) )
+    ALLOCATE( ZN0 (1, KLEVEL, KSTORE, NMODE_DST) )
+    ALLOCATE( ZRG (1, KLEVEL, KSTORE, NMODE_DST) )
+    ALLOCATE( ZSIG(1, KLEVEL, KSTORE, NMODE_DST) )
+
+    ZSV(1,:,:,1:NSV_DST) = TPSENSOR%XSV(:,:,NSV_DSTBEG:NSV_DSTEND)
+
+    IF ( NRR > 0 ) THEN
+      ZRHO(1,:,:) = 0.
+      DO JRR = 1, NRR
+        ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR)
+      END DO
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) )
+    ELSE
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:)
+    ENDIF
+
+    ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) )
+
+    CALL PPP2DUST( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0 )
+
+    DO JSV = 1, NMODE_DST
+      ! mean radius
+      WRITE( YTITLE,   '( a6,  i1 )' ) 'DSTRGA', JSV
+      WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) DUST MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) )
+
+      ! standard deviation
+      WRITE( YTITLE,   '( A7,  I1 )' ) 'DSTSIGA', JSV
+      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, '', ZSIG(1,:,:,JSV) )
+
+      ! particles number
+      WRITE( YTITLE,   '( A6,  I1 )' ) 'DSTN0A', JSV
+      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) )
+    END DO
+
+    DEALLOCATE ( ZSV, ZRHO, ZN0, ZRG, ZSIG )
+
+  END SUBROUTINE ADD_DUST_DATA
+
+  SUBROUTINE ADD_SALT_DATA( TPSENSOR, KLEVEL, KSTORE )
+    USE MODD_CONF_N,     ONLY: NRR
+    USE MODD_CST,        ONLY: XP00, XCPD, XRD, XRV
+    USE MODD_NSV,        ONLY: NSV_SLT, NSV_SLTBEG, NSV_SLTEND
+    USE MODD_SALT
+
+    USE MODE_SALT_PSD,   ONLY: PPP2SALT
+
+    CLASS(TSENSOR), INTENT(IN) :: TPSENSOR
+    INTEGER,        INTENT(IN) :: KLEVEL  ! Number of vertical levels
+    INTEGER,        INTENT(IN) :: KSTORE  ! Number of store instants
+
+    INTEGER                                   :: JRR
+    INTEGER                                   :: JSV
+    CHARACTER(LEN=NCOMMENTLGTMAX)             :: YCOMMENT
+    CHARACTER(LEN=NMNHNAMELGTMAX)             :: YTITLE
+    REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
+    REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZRG, ZSIG
+
+    IF ( .NOT. LSALT ) RETURN
+
+    ALLOCATE( ZSV (1, KLEVEL, KSTORE, NSV_SLT) )
+    ALLOCATE( ZRHO(1, KLEVEL, KSTORE) )
+    ALLOCATE( ZN0 (1, KLEVEL, KSTORE, NMODE_SLT) )
+    ALLOCATE( ZRG (1, KLEVEL, KSTORE, NMODE_SLT) )
+    ALLOCATE( ZSIG(1, KLEVEL, KSTORE, NMODE_SLT) )
+
+    ZSV(1,:,:,1:NSV_SLT) = TPSENSOR%XSV(:,:,NSV_SLTBEG:NSV_SLTEND)
+
+    IF ( NRR > 0 ) THEN
+      ZRHO(1,:,:) = 0.
+      DO JRR = 1, NRR
+        ZRHO(1,:,:) = ZRHO(1,:,:) + TPSENSOR%XR(:,:,JRR)
+      END DO
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:) * ( 1. + XRV / XRD * TPSENSOR%XR(:,:,1) ) / ( 1. + ZRHO(1,:,:) )
+    ELSE
+      ZRHO(1,:,:) = TPSENSOR%XTH(:,:)
+    ENDIF
+
+    ZRHO(1,:,:) = TPSENSOR%XP(:,:) / ( XRD * ZRHO(1,:,:) * ( ( TPSENSOR%XP(:,:) / XP00 ) ** ( XRD / XCPD ) ) )
+
+    CALL PPP2SALT( ZSV, ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0 )
+
+    DO JSV = 1, NMODE_SLT
+      ! mean radius
+      WRITE( YTITLE,   '( a6,  i1 )' ) 'SLTRGA', JSV
+      WRITE( YCOMMENT, '( a18, i1 )' ) 'RG (nb) SALT MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'um', ZRG(1,:,:,JSV) )
+
+      ! standard deviation
+      WRITE( YTITLE,   '( A7,  I1 )' ) 'SLTSIGA', JSV
+      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA SALT MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, '', ZSIG(1,:,:,JSV) )
+
+      ! particles number
+      WRITE( YTITLE,   '( A6,  I1 )' ) 'SLTN0A', JSV
+      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 SALT MODE ', JSV
+      CALL ADD_PROFILE( YTITLE, YCOMMENT, 'm-3', ZN0(1,:,:,JSV) )
+    END DO
+
+    DEALLOCATE ( ZSV, ZRHO, ZN0, ZRG, ZSIG )
+
+  END SUBROUTINE ADD_SALT_DATA
+
+
   SUBROUTINE SENSOR_WRITE_WORKARRAYS_ALLOCATE( KLEVEL, KSTORE, KPROCMAX )
     INTEGER, INTENT(IN) :: KLEVEL  ! Number of vertical levels
     INTEGER, INTENT(IN) :: KSTORE  ! Number of store instants
@@ -530,6 +817,7 @@ CONTAINS
 
 
   SUBROUTINE SENSOR_WRITE_WORKARRAYS_DEALLOCATE( )
+
     NPROCCUR = 0
     NPROCMAX = 0
 
@@ -544,4 +832,5 @@ CONTAINS
 
     KNPROCCUR = NPROCCUR
   END FUNCTION SENSOR_CURRENT_PROCESSES_NUMBER_GET
+
 END MODULE MODE_SENSOR
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 5d68623924719addff760e085c91c0ca574365db..367f1e762fe93959809b3e4228eb44a74a7494ad 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -7,7 +7,7 @@
 MODULE MODE_WRITE_AIRCRAFT_BALLOON
 !      ###########################
 
-use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+use modd_parameters, only: NMNHNAMELGTMAX
 
 use mode_msg
 
@@ -192,38 +192,31 @@ 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_CH_AEROSOL,       ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP
+USE MODD_CST,              ONLY: XP00, XCPD, XRD, XRV
+USE MODD_DUST,             ONLY: LDUST, NMODE_DST
 use modd_field,            only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, 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_NSV,              ONLY: tsvlist, nsv
 USE MODD_PARAMETERS,       ONLY: XUNDEF
 USE MODD_PARAM_n,          ONLY: CCLOUD
+USE MODD_SALT,             ONLY: LSALT, NMODE_SLT
 
-USE MODE_AERO_PSD
 use mode_aircraft_balloon, only: Aircraft_balloon_longtype_get
-USE MODE_DUST_PSD
 USE MODE_MODELN_HANDLER,   ONLY: GET_CURRENT_MODEL_INDEX
-use mode_sensor,           only: Add_fixpoint, Add_point, Add_profile, Sensor_current_processes_number_get, &
+use mode_sensor,           only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_profile, Add_salt_data, &
+                                 Sensor_current_processes_number_get, &
                                  ccomment, ctitle, cunit, xwork6, &
                                  Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate
 use mode_write_diachro,    only: Write_diachro
 
-
 TYPE(TFILEDATA),   INTENT(IN) :: TPDIAFILE ! file to write
 CLASS(TFLYERDATA), INTENT(IN) :: TPFLYER
 !
 !*      0.2  declaration of local variables for diachro
 !
-REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
-REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
-REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
-!
 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
@@ -235,7 +228,8 @@ INTEGER :: JRR      ! loop counter
 INTEGER :: JSV      ! loop counter
 INTEGER :: JPT      ! loop counter
 INTEGER :: IKU
-REAL, DIMENSION(:), ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position
+REAL, DIMENSION(:),     ALLOCATABLE :: ZLWC ! Temporary array to store/compute Liquid Water Content at flyer position
+REAL, DIMENSION(:,:,:), ALLOCATABLE :: ZRHO
 type(tbudiachrometadata) :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
@@ -257,7 +251,8 @@ IF ( IRR > 1 ) IPROC = IPROC + 1
 IF ( SIZE( TPFLYER%XTKE ) > 0 ) IPROC = IPROC + 1
 IPROC = IPROC + 1 ! TKE_DISS
 IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP )
-IF ( LDUST ) IPROC = IPROC + NMODE_DST * 3
+IF ( LDUST )   IPROC = IPROC + NMODE_DST * 3
+IF ( LSALT )   IPROC = IPROC + NMODE_SLT * 3
 IF ( SIZE( TPFLYER%XTSRAD ) > 0 ) IPROC = IPROC + 1
 !
 ISTORE = SIZE( TPFLYER%TFLYER_TIME%TPDATES )
@@ -346,167 +341,15 @@ IF (SIZE(TPFLYER%XSV,3)>=1) THEN
     END IF
   END DO
 
-  IF ((LORILAM).AND. .NOT.(ANY(TPFLYER%XP(1,:) == 0.))) THEN
-
-    ALLOCATE (ZSV(1,1,ISTORE,NSV_AER))
-    ALLOCATE (ZRHO(1,1,ISTORE))
-    ALLOCATE (ZN0(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZRG(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZSIG(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE))
-    ZSV(1,1,:,1:NSV_AER) = TPFLYER%XSV(1,:,NSV_AERBEG:NSV_AEREND)
-    IF (IRR >0) THEN
-      ZRHO(1,1,:) = 0.
-      DO JRR=1,IRR
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(1,:,JRR)
-      ENDDO
-      ZRHO(1,1,:) = TPFLYER%XTH(1,:) * ( 1. + XRV/XRD*TPFLYER%XR(1,:,1) )  &
-                                     / ( 1. + ZRHO(1,1,:)               )
-    ELSE
-      ZRHO(1,1,:) = TPFLYER%XTH(1,:)
-    ENDIF
-    ZRHO(1,1,:) =  TPFLYER%XP(1,:) / &
-                  (XRD *ZRHO(1,1,:) *((TPFLYER%XP(1,:)/XP00)**(XRD/XCPD))  )
-    ZSIG = 0.
-    ZRG = 0.
-    ZN0 = 0.
-    ZPTOTA = 0.
-    DO JPT=1,ISTORE ! prevent division by zero if ZSV = 0.
-      IF (ALL(ZSV(1,1,JPT,:)/=0.)) THEN
-        CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0, PCTOTA=ZPTOTA)
-      ENDIF
-    ENDDO
-    DO JSV=1,JPMODE
-      ! mean radius
-      WRITE(YTITLE,'(A,I1)')'AERRGA',JSV
-      WRITE(YCOMMENT,'(A,I1)')'RG (nb) AERO MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'um', ZRG(1,1,:,JSV) )
-      ! standard deviation
-      WRITE(YTITLE,'(A,I1)')'AERSIGA',JSV
-      WRITE(YCOMMENT,'(A,I1)')'SIGMA AERO MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), '1', ZSIG(1,1,:,JSV) )
-      ! particles number
-      WRITE(YTITLE,'(A,I1)')'AERN0A',JSV
-      WRITE(YCOMMENT,'(A,I1)')'N0 AERO MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'm-3', ZN0(1,1,:,JSV) )
-      ! mass concentration in microg/m3
-      ! sulfate
-      WRITE(YTITLE,'(A,I1)')'MSO4',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS SO4 AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) )
-      ! nitrate
-      WRITE(YTITLE,'(A,I1)')'MNO3',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS NO3 AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) )
-      ! amoniac
-      WRITE(YTITLE,'(A,I1)')'MNH3',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS NH3 AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) )
-      ! water
-      WRITE(YTITLE,'(A,I1)')'MH2O',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS H2O AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) )
-      IF (NSOA .EQ. 10) THEN
-        ! SOA1
-        WRITE(YTITLE,'(A,I1)')'MSOA1',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA1 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) )
-        ! SOA2
-        WRITE(YTITLE,'(A,I1)')'MSOA2',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA2 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) )
-        ! SOA3
-        WRITE(YTITLE,'(A,I1)')'MSOA3',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA3 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) )
-        ! SOA4
-        WRITE(YTITLE,'(A,I1)')'MSOA4',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA4 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) )
-        ! SOA5
-        WRITE(YTITLE,'(A,I1)')'MSOA5',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA5 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) )
-        ! SOA6
-        WRITE(YTITLE,'(A,I1)')'MSOA6',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA6 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) )
-        ! SOA7
-        WRITE(YTITLE,'(A,I1)')'MSOA7',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA7 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) )
-        ! SOA8
-        WRITE(YTITLE,'(A,I1)')'MSOA8',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA8 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) )
-        ! SOA9
-        WRITE(YTITLE,'(A,I1)')'MSOA9',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA9 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) )
-        ! SOA10
-        WRITE(YTITLE,'(A,I1)')'MSOA10',JSV
-        WRITE(YCOMMENT,'(A,I1)')'MASS SOA10 AEROSOL MODE ',JSV
-        call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) )
-      ENDIF
-      ! OC
-      WRITE(YTITLE,'(A,I1)')'MOC',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS OC AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) )
-      ! BC
-      WRITE(YTITLE,'(A,I1)')'MBC',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS BC AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) )
-      ! dust
-      WRITE(YTITLE,'(A,I1)')'MDUST',JSV
-      WRITE(YCOMMENT,'(A,I1)')'MASS DUST AEROSOL MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG,ZPTOTA)
-  END IF
-
-  IF ((LDUST).AND. .NOT.(ANY(TPFLYER%XP(1,:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,ISTORE,NSV_DST))
-    ALLOCATE (ZRHO(1,1,ISTORE))
-    ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST))
-    ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST))
-    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST))
-    ZSV(1,1,:,1:NSV_DST) = TPFLYER%XSV(1,:,NSV_DSTBEG:NSV_DSTEND)
-    IF (IRR >0) THEN
-      ZRHO(1,1,:) = 0.
-      DO JRR=1,IRR
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPFLYER%XR(1,:,JRR)
-      ENDDO
-      ZRHO(1,1,:) = TPFLYER%XTH(1,:) * ( 1. + XRV/XRD*TPFLYER%XR(1,:,1) )  &
-                                     / ( 1. + ZRHO(1,1,:)                )
-    ELSE
-      ZRHO(1,1,:) = TPFLYER%XTH(1,:)
-    ENDIF
-    ZRHO(1,1,:) =  TPFLYER%XP(1,:) / &
-                  (XRD *ZRHO(1,1,:) *((TPFLYER%XP(1,:)/XP00)**(XRD/XCPD)) )
-    CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
-    DO JSV=1,NMODE_DST
-      ! mean radius
-      WRITE(YTITLE,'(A,I1)')'DSTRGA',JSV
-      WRITE(YCOMMENT,'(A,I1)')'RG (nb) DUST MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'um', ZRG(1,1,:,JSV) )
-      ! standard deviation
-      WRITE(YTITLE,'(A,I1)')'DSTSIGA',JSV
-      WRITE(YCOMMENT,'(A,I1)')'SIGMA DUST MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), '1', ZSIG(1,1,:,JSV) )
-      ! particles number
-      WRITE(YTITLE,'(A,I1)')'DSTN0A',JSV
-      WRITE(YCOMMENT,'(A,I1)')'N0 DUST MODE ',JSV
-      call Add_point( Trim( ytitle ), Trim( ycomment ), 'm-3', ZN0(1,1,:,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
+  if ( lorilam ) call Add_orilam_data( tpflyer, 1, istore )
+  if ( ldust   ) call Add_dust_data  ( tpflyer, 1, istore )
+  if ( lsalt   ) call Add_salt_data  ( tpflyer, 1, istore )
 ENDIF
 !
 IF ( SIZE( TPFLYER%XTSRAD ) > 0 ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', TPFLYER%XTSRAD(:) )
 !
 jproc = Sensor_current_processes_number_get()
+
 allocate( tzfields( jproc ) )
 
 tzfields(:)%cmnhname  = ctitle(1 : jproc)
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index 99e8dc6bbac11f74b33ef11720a3503dce123bc8..1c26e3c0ececf39cefc4ebd537c639b8cc33a510 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -25,7 +25,7 @@
 MODULE MODE_WRITE_PROFILER_n
 !      ###########################
 
-use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
+use modd_parameters, only: NMNHNAMELGTMAX, NUNITLGTMAX
 
 implicit none
 
@@ -42,7 +42,7 @@ SUBROUTINE PROFILER_DIACHRO_n( TPDIAFILE, TPPROFILER )
 USE MODD_ALLPROFILER_n,   ONLY: LDIAG_SURFRAD_PROF
 use modd_budget,          only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
                                 tbudiachrometadata
-USE MODD_CH_AEROSOL,      ONLY: LORILAM, JPMODE
+USE MODD_CH_AEROSOL,      ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP
 USE MODD_CONF,            ONLY: LCARTESIAN
 USE MODD_CONF_n,          ONLY: NRR
 USE MODD_CST,             ONLY: XRV
@@ -51,19 +51,18 @@ USE MODD_DIM_n,           ONLY: NKMAX
 use modd_field,           only: NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_PROFILER_TIME, NMNHDIM_PROFILER_PROC, 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
+USE MODD_NSV,             ONLY: tsvlist, nsv
 USE MODD_PARAMETERS,      ONLY: JPVEXT, XUNDEF
 USE MODD_PARAM_n,         ONLY: CCLOUD, CRAD, CTURB
 USE MODD_PROFILER_n
 USE MODD_RADIATIONS_n,    ONLY: NAER
-USE MODD_SALT,            ONLY: LSALT
+USE MODD_SALT,            ONLY: LSALT, NMODE_SLT
 USE MODD_TYPE_STATPROF
 !
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-use mode_sensor,           only: Add_fixpoint, Add_point, Add_profile, Sensor_current_processes_number_get, &
-                                 ccomment, ctitle, cunit, xwork6, &
-                                 Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate
+use mode_sensor,          only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_profile, Add_salt_data, &
+                                Sensor_current_processes_number_get, &
+                                ccomment, ctitle, cunit, xwork6, &
+                                Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate
 use mode_write_diachro,   only: Write_diachro
 !
 TYPE(TFILEDATA),     INTENT(IN) :: TPDIAFILE ! diachronic file to write
@@ -71,7 +70,6 @@ TYPE(TPROFILERDATA), INTENT(IN) :: TPPROFILER
 !
 !*      0.2  declaration of local variables for diachro
 !
-character(len=NCOMMENTLGTMAX)                        :: ycomment
 character(len=NMNHNAMELGTMAX)                        :: ytitle
 character(len=NUNITLGTMAX)                           :: yunit
 INTEGER                                              :: IKU
@@ -80,11 +78,9 @@ INTEGER                                              :: JPROC
 integer                                              :: jproc_alt, jproc_w
 INTEGER                                              :: JRR      ! loop counter
 INTEGER                                              :: JSV      ! loop counter
-integer                                              :: ji
 INTEGER                                              :: ISTORE
 REAL, DIMENSION(:,:,:),                  ALLOCATABLE :: ZRHO
 REAL, DIMENSION(:,:),                    ALLOCATABLE :: ZWORK
-REAL, DIMENSION(:,:,:,:),                ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
 type(tbudiachrometadata)                             :: tzbudiachro
 type(tfieldmetadata_base), dimension(:), allocatable :: tzfields
 !
@@ -97,8 +93,9 @@ if ( ccloud == 'C2R2' .or. ccloud == 'KHKO' )  IPROC = IPROC + 1
 if ( ccloud /= 'NONE' .and. ccloud /= 'REVE' ) IPROC = IPROC + 1
 if ( ccloud == 'ICE3' .or. ccloud == 'ICE4' )  IPROC = IPROC + 1
 if ( ccloud == 'LIMA' )  IPROC = IPROC + 3
-IF (LORILAM) IPROC = IPROC + JPMODE * 3
-IF (LDUST) IPROC = IPROC + NMODE_DST * 3
+IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP )
+IF ( LDUST )   IPROC = IPROC + NMODE_DST * 3
+IF ( LSALT )   IPROC = IPROC + NMODE_SLT * 3
 IF (LDUST .OR. LORILAM .OR. LSALT) IPROC=IPROC+NAER
 IF ( CTURB == 'TKEL' ) IPROC = IPROC + 1
 
@@ -166,100 +163,10 @@ if ( nsv > 0  ) then
   end do
   Deallocate( zwork )
 
-  IF ( LORILAM .AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.)) ) THEN
-    ALLOCATE (ZSV (1,iku,ISTORE,NSV_AER))
-    ALLOCATE (ZRHO(1,iku,ISTORE))
-    ALLOCATE (ZN0 (1,iku,ISTORE,JPMODE))
-    ALLOCATE (ZRG (1,iku,ISTORE,JPMODE))
-    ALLOCATE (ZSIG(1,iku,ISTORE,JPMODE))
-    do ji = 1, iku
-      ZSV(1,ji,:,1:NSV_AER) = TPPROFILER%XSV(ji,:,NSV_AERBEG:NSV_AEREND)
-    end do
-    IF ( NRR  > 0) THEN
-      ZRHO(1,:,:) = 0.
-      do ji = 1, iku
-        DO JRR = 1, NRR
-          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(ji,:,JRR)
-        ENDDO
-        ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) * ( 1. + XRV/XRD*TPPROFILER%XR(ji,:,1) )  &
-                                             / ( 1. + ZRHO(1,ji,:)                )
-      end do
-    ELSE
-      do ji = 1, iku
-        ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:)
-      end do
-    ENDIF
-    do ji = 1, iku
-      ZRHO(1,ji,:) =  TPPROFILER%XP(ji,:) / &
-                      (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(ji,:)/XP00)**(XRD/XCPD)) )
-    end do
-    CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
-    DO JSV=1,JPMODE
-      ! mean radius
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'AERRGA', JSV
-      WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) AERO MODE ', JSV
-      call Add_profile( ytitle, ycomment, 'um', ZRG(1,:,:,JSV) )
-
-      ! standard deviation
-      WRITE( YTITLE,   '( A7,  I1 )' ) 'AERSIGA', JSV
-      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA AERO MODE ', JSV
-      call Add_profile( ytitle, ycomment, '', ZSIG(1,:,:,JSV) )
-
-      ! particles number
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'AERN0A', JSV
-      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 AERO MODE ', JSV
-      call Add_profile( ytitle, ycomment, 'm-3', ZN0(1,:,:,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
-  IF ((LDUST).AND. .NOT.(ANY(TPPROFILER%XP(:,:) == 0.))) THEN
-    ALLOCATE (ZSV (1,iku,ISTORE,NSV_DST))
-    ALLOCATE (ZRHO(1,iku,ISTORE))
-    ALLOCATE (ZN0 (1,iku,ISTORE,NMODE_DST))
-    ALLOCATE (ZRG (1,iku,ISTORE,NMODE_DST))
-    ALLOCATE (ZSIG(1,iku,ISTORE,NMODE_DST))
-    do ji = 1, iku
-      ZSV(1,ji,:,1:NSV_DST) = TPPROFILER%XSV(ji,:,NSV_DSTBEG:NSV_DSTEND)
-    end do
-    IF ( NRR > 0 ) THEN
-      ZRHO(1,:,:) = 0.
-      do ji = 1, iku
-        DO JRR = 1, NRR
-          ZRHO(1,ji,:) = ZRHO(1,ji,:) + TPPROFILER%XR(ji,:,JRR)
-        ENDDO
-        ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:) * ( 1. + XRV/XRD*TPPROFILER%XR(ji,:,1) )  &
-                                             / ( 1. + ZRHO(1,ji,:)                )
-      end do
-    ELSE
-      do ji = 1, iku
-        ZRHO(1,ji,:) = TPPROFILER%XTH(ji,:)
-      end do
-    ENDIF
-    do ji = 1, iku
-      ZRHO(1,ji,:) =  TPPROFILER%XP(ji,:) / &
-                     (XRD *ZRHO(1,ji,:) *((TPPROFILER%XP(ji,:)/XP00)**(XRD/XCPD)) )
-    end do
-    CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
-    DO JSV=1,NMODE_DST
-      ! mean radius
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'DSTRGA', JSV
-      WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) DUST MODE ', JSV
-      call Add_profile( ytitle, ycomment, 'um', ZRG(1,:,:,JSV) )
-
-      ! standard deviation
-      WRITE(YTITLE,   '( A7,  I1 )' ) 'DSTSIGA', JSV
-      WRITE(YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV
-      call Add_profile( ytitle, ycomment, '', ZSIG(1,:,:,JSV) )
-
-      ! particles number
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'DSTN0A', JSV
-      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV
-      call Add_profile( ytitle, ycomment, 'm-3', ZN0(1,:,:,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
+  if ( lorilam ) call Add_orilam_data( tpprofiler, iku, istore )
+  if ( ldust   ) call Add_dust_data  ( tpprofiler, iku, istore )
+  if ( lsalt   ) call Add_salt_data  ( tpprofiler, iku, istore )
+
   if ( ldust .or. lorilam .or. lsalt ) then
     do jsv = 1, naer
       Write( ytitle, '( a, i1 )' ) 'AEREXT', jsv
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 2dff296341de7b4d047ba8fc294936e3b04fd139..38e050a283f3804aa8ba0f59acd26fb133100424 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -18,8 +18,6 @@
 MODULE MODE_WRITE_STATION_n
 !      ###########################
 
-use modd_parameters, only: NCOMMENTLGTMAX, NMNHNAMELGTMAX, NUNITLGTMAX
-
 implicit none
 
 private
@@ -35,22 +33,20 @@ SUBROUTINE STATION_DIACHRO_n( TPDIAFILE, TPSTATION )
 USE MODD_ALLSTATION_n,  ONLY: LDIAG_SURFRAD_STAT
 use modd_budget,        only: NLVL_CATEGORY, NLVL_SUBCATEGORY, NLVL_GROUP, NLVL_SHAPE, NLVL_TIMEAVG, NLVL_NORM, NLVL_MASK, &
                               tbudiachrometadata
+USE MODD_CH_AEROSOL,    ONLY: JPMODE, LORILAM, NCARB, NSOA, NSP
 USE MODD_CONF,          ONLY: LCARTESIAN
-USE MODD_CST,           ONLY: XRV
+USE MODD_DUST,          ONLY: LDUST, NMODE_DST
 use modd_field,         only: NMNHDIM_STATION_TIME, NMNHDIM_STATION_PROC, NMNHDIM_UNUSED, &
                               tfieldmetadata_base, TYPEREAL
 USE MODD_IO,            ONLY: TFILEDATA
-USE MODD_NSV,           ONLY: nsv, nsv_aer, nsv_aerbeg, nsv_aerend, &
-                              nsv_dst, nsv_dstbeg, nsv_dstend, nsv_slt, nsv_sltbeg, nsv_sltend, &
-                              tsvlist
+USE MODD_NSV,           ONLY: nsv, tsvlist
 USE MODD_PARAM_n,       ONLY: CRAD, CSURF, CTURB
+USE MODD_SALT,          ONLY: LSALT, NMODE_SLT
 use modd_station_n,     only: tstations_time
 use modd_type_statprof, only: tstationdata
 
-USE MODE_AERO_PSD
-USE MODE_DUST_PSD
-USE MODE_SALT_PSD
-use mode_sensor,         only: Add_fixpoint, Add_point, Sensor_current_processes_number_get, &
+use mode_sensor,         only: Add_dust_data, Add_fixpoint, Add_orilam_data, Add_point, Add_salt_data, &
+                               Sensor_current_processes_number_get, &
                                ccomment, ctitle, cunit, xwork6, &
                                Sensor_write_workarrays_allocate, Sensor_write_workarrays_deallocate
 use MODE_WRITE_DIACHRO,  ONLY: Write_diachro
@@ -60,13 +56,6 @@ TYPE(TSTATIONDATA), INTENT(IN) :: TPSTATION
 !
 !*      0.2  declaration of local variables for diachro
 !
-REAL, DIMENSION(:,:,:,:),     ALLOCATABLE :: ZSV, ZN0, ZSIG, ZRG
-REAL, DIMENSION(:,:,:,:,:),   ALLOCATABLE :: ZPTOTA
-REAL, DIMENSION(:,:,:),       ALLOCATABLE :: ZRHO
-!
-CHARACTER(LEN=NCOMMENTLGTMAX)     :: YCOMMENT ! comment string
-CHARACTER(LEN=NMNHNAMELGTMAX)     :: YTITLE   ! title
-!
 !!! do not forget to increment the IPROC value if you add diagnostic !!!
 INTEGER :: IPROC    ! number of variables records
 !!! do not forget to increment the JPROC value if you add diagnostic !!!
@@ -88,9 +77,9 @@ IF (LDIAG_SURFRAD_STAT) THEN
   IF(CRAD/="NONE")  IPROC = IPROC + 8
   IPROC = IPROC + 1 ! XSFCO2 term
 END IF
-IF (LORILAM) IPROC = IPROC + JPMODE*(3+NSOA+NCARB+NSP)
-IF (LDUST) IPROC = IPROC + NMODE_DST*3
-IF (LSALT) IPROC = IPROC + NMODE_SLT*3
+IF ( LORILAM ) IPROC = IPROC + JPMODE * ( 3 + NSOA + NCARB + NSP )
+IF ( LDUST )   IPROC = IPROC + NMODE_DST * 3
+IF ( LSALT )   IPROC = IPROC + NMODE_SLT * 3
 IF ( CRAD /= 'NONE' )  IPROC = IPROC + 1
 
 ISTORE = SIZE( TSTATIONS_TIME%TPDATES )
@@ -169,199 +158,9 @@ if ( nsv > 0 ) then
     END IF
   END DO
 
-  IF ((LORILAM).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,ISTORE,NSV_AER))
-    ALLOCATE (ZRHO(1,1,ISTORE))
-    ALLOCATE (ZN0(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZRG(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZSIG(1,1,ISTORE,JPMODE))
-    ALLOCATE (ZPTOTA(1,1,ISTORE,NSP+NCARB+NSOA,JPMODE))
-    ZSV(1,1,:,1:NSV_AER) = TPSTATION%XSV(1,:,NSV_AERBEG:NSV_AEREND)
-    IF (SIZE(TPSTATION%XR,3) >0) THEN
-      ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPSTATION%XR,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR)
-      ENDDO
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) )  &
-                                       / ( 1. + ZRHO(1,1,:)                 )
-    ELSE
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:)
-    ENDIF
-    ZRHO(1,1,:) =  TPSTATION%XP(1,:) / &
-                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) )
-
-    CALL PPP2AERO(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0,PCTOTA=ZPTOTA)
-
-    DO JSV=1,JPMODE
-      ! mean radius
-      WRITE(YTITLE,'(A6,I1)')'AERRGA',JSV
-      WRITE(YCOMMENT,'(A18,I1)')'RG (nb) AERO MODE ',JSV
-      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) )
-
-      ! standard deviation
-      WRITE(YTITLE,'(A7,I1)')'AERSIGA',JSV
-      WRITE(YCOMMENT,'(A16,I1)')'SIGMA AERO MODE ',JSV
-      call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) )
-
-      ! particles number
-      WRITE(YTITLE,'(A6,I1)')'AERN0A',JSV
-      WRITE(YCOMMENT,'(A13,I1)')'N0 AERO MODE ',JSV
-      call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MOC  ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS OC   AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_OC,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MBC  ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS BC   AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_BC,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MDST  ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS DST   AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_DST,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MSO4 ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS SO4  AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SO4,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MNO3 ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS NO3  AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NO3,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MH2O ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS H2O  AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_H2O,JSV) )
-
-      WRITE(YTITLE,'(A5,I1)')'MNH3 ',JSV
-      WRITE(CCOMMENT,'(A23,I1)')'MASS NH3  AEROSOL MODE ',JSV
-      call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_NH3,JSV) )
-
-      IF ( NSOA == 10 ) THEN
-        WRITE(YTITLE,'(A5,I1)')'MSOA1',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA1 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA1,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA2',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA2 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA2,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA3',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA3 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA3,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA4',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA4 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA4,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA5',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA5 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA5,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA6',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA6 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA6,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA7',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA7 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA7,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA8',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA8 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA8,JSV) )
-
-        WRITE(YTITLE,'(A5,I1)')'MSOA9',JSV
-        WRITE(CCOMMENT,'(A23,I1)')'MASS SOA9 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA9,JSV) )
-
-        WRITE(YTITLE,'(A6,I1)')'MSOA10',JSV
-        WRITE(CCOMMENT,'(A24,I1)')'MASS SOA10 AEROSOL MODE ',JSV
-        call Add_point( ytitle, ycomment, 'ug m-3', ZPTOTA(1,1,:,JP_AER_SOA10,JSV) )
-      END IF
-    END DO
-
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
-
-  IF ((LDUST).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,ISTORE,NSV_DST))
-    ALLOCATE (ZRHO(1,1,ISTORE))
-    ALLOCATE (ZN0(1,1,ISTORE,NMODE_DST))
-    ALLOCATE (ZRG(1,1,ISTORE,NMODE_DST))
-    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_DST))
-    ZSV(1,1,:,1:NSV_DST) = TPSTATION%XSV(1,:,NSV_DSTBEG:NSV_DSTEND)
-    IF (SIZE(TPSTATION%XR,3) >0) THEN
-      ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPSTATION%XR,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR)
-      ENDDO
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) )  &
-                                       / ( 1. + ZRHO(1,1,:)                 )
-    ELSE
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:)
-    ENDIF
-    ZRHO(1,1,:) =  TPSTATION%XP(1,:) / &
-                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) )
-    CALL PPP2DUST(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
-    DO JSV=1,NMODE_DST
-      ! mean radius
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'DSTRGA', JSV
-      WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) DUST MODE ', JSV
-      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) )
-
-      ! standard deviation
-      WRITE( YTITLE,   '( A7,  I1 )' ) 'DSTSIGA', JSV
-      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV
-      call Add_point( ytitle, ycomment, '', ZSIG(1,1,:,JSV) )
-
-      ! particles number
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'DSTN0A', JSV
-      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV
-      call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
-
-  IF ((LSALT).AND. .NOT.(ANY(TPSTATION%XP(1,:) == 0.))) THEN
-    ALLOCATE (ZSV(1,1,ISTORE,NSV_SLT))
-    ALLOCATE (ZRHO(1,1,ISTORE))
-    ALLOCATE (ZN0(1,1,ISTORE,NMODE_SLT))
-    ALLOCATE (ZRG(1,1,ISTORE,NMODE_SLT))
-    ALLOCATE (ZSIG(1,1,ISTORE,NMODE_SLT))
-    ZSV(1,1,:,1:NSV_SLT) = TPSTATION%XSV(1,:,NSV_SLTBEG:NSV_SLTEND)
-    IF (SIZE(TPSTATION%XR,3) >0) THEN
-      ZRHO(1,1,:) = 0.
-      DO JRR=1,SIZE(TPSTATION%XR,3)
-        ZRHO(1,1,:) = ZRHO(1,1,:) + TPSTATION%XR(1,:,JRR)
-      ENDDO
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:) * ( 1. + XRV/XRD*TPSTATION%XR(1,:,1) )  &
-                                      / ( 1. + ZRHO(1,1,:)                )
-    ELSE
-      ZRHO(1,1,:) = TPSTATION%XTH(1,:)
-    ENDIF
-    ZRHO(1,1,:) =  TPSTATION%XP(1,:) / &
-                  (XRD *ZRHO(1,1,:) *((TPSTATION%XP(1,:)/XP00)**(XRD/XCPD)) )
-    CALL PPP2SALT(ZSV,ZRHO, PSIG3D=ZSIG, PRG3D=ZRG, PN3D=ZN0)
-    DO JSV=1,NMODE_SLT
-      ! mean radius
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'SLTRGA', JSV
-      WRITE( YCOMMENT, '( A18, I1 )' ) 'RG (nb) SALT MODE ', JSV
-      call Add_point( ytitle, ycomment, 'um', ZRG(1,1,:,JSV) )
-
-      ! standard deviation
-      WRITE( YTITLE,   '( A7,  I1 )' ) 'SLTSIGA', JSV
-      WRITE( YCOMMENT, '( A16, I1 )' ) 'SIGMA DUST MODE ', JSV
-      call Add_point( ytitle, ycomment, '',ZSIG(1,1,:,JSV) )
-
-      ! particles number
-      WRITE( YTITLE,   '( A6,  I1 )' ) 'SLTN0A', JSV
-      WRITE( YCOMMENT, '( A13, I1 )' ) 'N0 DUST MODE ', JSV
-      call Add_point( ytitle, ycomment, 'm-3', ZN0(1,1,:,JSV) )
-    ENDDO
-    DEALLOCATE (ZSV,ZRHO)
-    DEALLOCATE (ZN0,ZRG,ZSIG)
-  END IF
+  if ( lorilam ) call Add_orilam_data( tpstation, 1, istore )
+  if ( ldust   ) call Add_dust_data  ( tpstation, 1, istore )
+  if ( lsalt   ) call Add_salt_data  ( tpstation, 1, istore )
 end if
 
 if ( crad /= 'NONE' ) call Add_point( 'Tsrad', 'Radiative Surface Temperature', 'K', tpstation%xtsrad(:) )