diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index f3a4ffb2b0ff54cd422efc600dd73593912b714f..497aca4aa476ee02d6fb6adbe6e22e01320e3b0c 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -27,6 +27,7 @@
 !  P. Wautelet 11/01/2021: add coordinates for dimension variables in diachronic files
 !  P. Wautelet 14/01/2021: add IO_Field_write_nc4_N4, IO_Field_partial_write_nc4_N2,
 !                          IO_Field_partial_write_nc4_N3 and IO_Field_partial_write_nc4_N4 subroutines
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
 !-----------------------------------------------------------------
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
@@ -1777,7 +1778,7 @@ if ( tpfile%lmaster ) then
       if ( cles_level_type == 'K' ) then
         Allocate( zles_levels(nles_k) )
         do ji = 1, nles_k
-          zles_levels(ji) = zzhatm(nles_levels(ji))
+          zles_levels(ji) = zzhatm(nles_levels(ji) + JPVEXT)
         end do
         call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_BUDGET_LES_LEVEL),           &
                               'position z in the transformed space of the LES budgets', &
@@ -1796,10 +1797,12 @@ if ( tpfile%lmaster ) then
     !Coordinates for the number of horizontal wavelengths for non-local LES budgets (2 points correlations)
     if ( nspectra_ni > 0 ) &
       call Write_hor_coord1d( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_2PTS_NI), 'x-dimension of the LES budget cartesian box',    &
-                            trim(ystdnameprefix)//'_x_coordinate', 'X', 0., 0, 0, zxhatm_glob(nlesn_iinf(imi) : nlesn_isup(imi)) )
+                            trim(ystdnameprefix)//'_x_coordinate', 'X', 0., 0, 0,                                              &
+                            zxhatm_glob(nlesn_iinf(imi) + jphext : nlesn_isup(imi) + jphext) )
     if ( nspectra_nj > 0 .and. .not. l2d ) &
       call Write_hor_coord1d( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_2PTS_NJ), 'y-dimension of the LES budget cartesian box',    &
-                              trim(ystdnameprefix)//'_y_coordinate', 'Y', 0., 0, 0, zyhatm_glob(nlesn_jinf(imi) : nlesn_jsup(imi)) )
+                              trim(ystdnameprefix)//'_y_coordinate', 'Y', 0., 0, 0,                                            &
+                              zyhatm_glob(nlesn_jinf(imi) + jphext : nlesn_jsup(imi) + jphext) )
 
 
     !NMNHDIM_SPECTRA_SPEC_NI, NMNHDIM_SPECTRA_SPEC_NJ: not true dimensions: spectra wavelengths
@@ -1809,7 +1812,7 @@ if ( tpfile%lmaster ) then
       if ( cspectra_level_type == 'K' ) then
         Allocate( zspectra_levels(nspectra_k) )
         do ji = 1, nspectra_k
-          zspectra_levels(ji) = zzhatm(nspectra_levels(ji))
+          zspectra_levels(ji) = zzhatm(nspectra_levels(ji) + JPVEXT)
         end do
         call Write_ver_coord( tpfile%tncdims%tdims(NMNHDIM_SPECTRA_LEVEL),                        &
                               'position z in the transformed space of the non-local LES budgets', &
diff --git a/src/MNH/ini_budget.f90 b/src/MNH/ini_budget.f90
index a7e3208cd565e1e564ca8c7739ddb5c58b227b06..b5bc6f9ec702cf54ee5adec28b2583811af10d57 100644
--- a/src/MNH/ini_budget.f90
+++ b/src/MNH/ini_budget.f90
@@ -219,6 +219,7 @@ use modd_blowsnow_n,    only: lsnowsubl
 use modd_budget
 use modd_ch_aerosol,    only: lorilam
 use modd_conf,          only: l1d, lcartesian, lforcing, lthinshell, nmodel
+use modd_dim_n,         only: nimax_ll, njmax_ll, nkmax
 use modd_dragbldg_n,    only: ldragbldg
 use modd_dust,          only: ldust
 use modd_dyn,           only: lcorio, xseglen
@@ -378,22 +379,34 @@ end if
 
 IF (CBUTYPE=='CART') THEN              ! cartesian case only
 !
-  IF ( NBUIH < NBUIL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' )
+  IF ( NBUIL < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too small (<1)' )
+  IF ( NBUIL > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIL too large (>NIMAX)' )
+  IF ( NBUIH < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too small (<1)' )
+  IF ( NBUIH > NIMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH too large (>NIMAX)' )
+  IF ( NBUIH < NBUIL )    CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUIH < NBUIL' )
   IF (LBU_ICP) THEN
     NBUIMAX_ll = 1
   ELSE
     NBUIMAX_ll = NBUIH - NBUIL +1
   END IF
 
-  IF ( NBUJH < NBUJL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' )
+  IF ( NBUJL < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too small (<1)' )
+  IF ( NBUJL > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJL too large (>NJMAX)' )
+  IF ( NBUJH < 1 )        CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too small (<1)' )
+  IF ( NBUJH > NJMAX_ll ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH too large (>NJMAX)' )
+  IF ( NBUJH < NBUJL )    CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUJH < NBUJL' )
   IF (LBU_JCP) THEN
     NBUJMAX_ll = 1
   ELSE
     NBUJMAX_ll = NBUJH - NBUJL +1
   END IF
 
+  IF ( NBUKL < 1 )     CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too small (<1)' )
+  IF ( NBUKL > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKL too large (>NKMAX)' )
+  IF ( NBUKH < 1 )     CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too small (<1)' )
+  IF ( NBUKH > NKMAX ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH too large (>NKMAX)' )
   IF ( NBUKH < NBUKL ) CALL Print_msg( NVERB_ERROR, 'BUD', 'Ini_budget', 'NBUKH < NBUKL' )
-!
+
   CALL GET_INTERSECTION_ll(NBUIL+JPHEXT,NBUJL+JPHEXT,NBUIH+JPHEXT,NBUJH+JPHEXT, &
       NBUSIL,NBUSJL,NBUSIH,NBUSJH,"PHYS",IINFO_ll)
   IF ( IINFO_ll /= 1 ) THEN ! 
@@ -4055,6 +4068,19 @@ END IF
 
 call Ini_budget_groups( tbudgets, ibudim1, ibudim2, ibudim3 )
 
+if ( tbudgets(NBUDGET_U)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_U),   cbulist_ru   )
+if ( tbudgets(NBUDGET_V)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_V),   cbulist_rv   )
+if ( tbudgets(NBUDGET_W)  %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_W),   cbulist_rw   )
+if ( tbudgets(NBUDGET_TH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TH),  cbulist_rth  )
+if ( tbudgets(NBUDGET_TKE)%lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_TKE), cbulist_rtke )
+if ( tbudgets(NBUDGET_RV) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RV),  cbulist_rrv  )
+if ( tbudgets(NBUDGET_RC) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RC),  cbulist_rrc  )
+if ( tbudgets(NBUDGET_RR) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RR),  cbulist_rrr  )
+if ( tbudgets(NBUDGET_RI) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RI),  cbulist_rri  )
+if ( tbudgets(NBUDGET_RS) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RS),  cbulist_rrs  )
+if ( tbudgets(NBUDGET_RG) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RG),  cbulist_rrg  )
+if ( tbudgets(NBUDGET_RH) %lenabled ) call Sourcelist_nml_compact( tbudgets(NBUDGET_RH),  cbulist_rrh  )
+if ( lbu_rsv )                        call Sourcelist_sv_nml_compact( cbulist_rsv  )
 end subroutine Ini_budget
 
 
@@ -4406,12 +4432,68 @@ subroutine Sourcelist_scan( tpbudget, hbulist )
 
   character(len=:), allocatable :: yline
   character(len=:), allocatable :: ysrc
+  character(len=:), dimension(:), allocatable :: ymsg
   integer                       :: idx
   integer                       :: igroup
   integer                       :: igroup_idx
   integer                       :: ipos
+  integer                       :: istart
   integer                       :: ji
 
+  istart = 1
+
+  ! Case 'LIST_AVAIL': list all the available source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'LIST_AVAIL' ) then
+      Allocate( character(len=65) :: ymsg(tpbudget%nsources + 1) )
+      ymsg(1) = '---------------------------------------------------------------------'
+      ymsg(2) = 'Available source terms for budget ' // Trim( tpbudget%cname )
+      Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name'
+      idx = 3
+      do ji = 1, tpbudget%nsources
+        if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then
+          idx = idx + 1
+          Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname
+        end if
+      end do
+      ymsg(tpbudget%nsources + 1 ) = '---------------------------------------------------------------------'
+      call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg )
+      !To not read the 1st line again
+      istart = 2
+    end if
+  end if
+
+  ! Case 'LIST_ALL': list all the source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'LIST_ALL' ) then
+      Allocate( character(len=65) :: ymsg(tpbudget%nsourcesmax + 1) )
+      ymsg(1) = '---------------------------------------------------------------------'
+      ymsg(2) = 'Source terms for budget ' // Trim( tpbudget%cname )
+      Write( ymsg(3), '( A32, " ", A32 )' ) 'Name', 'Long name'
+      idx = 3
+      do ji = 1, tpbudget%nsourcesmax
+        if ( All( tpbudget%tsources(ji)%cmnhname /= [ 'INIF' , 'ENDF', 'AVEF' ] ) ) then
+          idx = idx + 1
+          Write( ymsg(idx), '( A32, " ", A32 )' ) tpbudget%tsources(ji)%cmnhname, tpbudget%tsources(ji)%clongname
+        end if
+      end do
+      ymsg(tpbudget%nsourcesmax + 1 ) = '---------------------------------------------------------------------'
+      call Print_msg_multi( NVERB_WARNING, 'BUD', 'Sourcelist_scan', ymsg )
+      !To not read the 1st line again
+      istart = 2
+    end if
+  end if
+
+  ! Case 'ALL': enable all available source terms
+  if ( Size( hbulist ) > 0 ) then
+    if ( Trim( hbulist(1) ) == 'ALL' ) then
+      do ji = 1, tpbudget%nsources
+        tpbudget%tsources(ji)%ngroup = 1
+      end do
+      return
+    end if
+  end if
+
   !Always enable INIF, ENDF and AVEF terms
   ipos = Source_find( tpbudget, 'INIF' )
   if ( ipos < 1 ) call Print_msg( NVERB_FATAL, 'BUD', 'Sourcelist_scan', 'source term ' // Trim( tpbudget%cname ) &
@@ -4431,7 +4513,7 @@ subroutine Sourcelist_scan( tpbudget, hbulist )
   !igroup_idx start at 2 because 1 is reserved for individually stored source terms
   igroup_idx = 2
 
-  do ji = 1, Size( hbulist )
+  do ji = istart, Size( hbulist )
     if ( Len_trim( hbulist(ji) ) > 0 ) then
       ! Scan the line and separate the different sources (separated by + signs)
       yline = Trim(hbulist(ji))
@@ -4481,6 +4563,87 @@ subroutine Sourcelist_scan( tpbudget, hbulist )
 end subroutine Sourcelist_scan
 
 
+subroutine Sourcelist_nml_compact( tpbudget, hbulist )
+  !This subroutine reduce the size of the hbulist to the minimum
+  !The list is generated from the group list
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  type(tbudgetdata),                           intent(in)    :: tpbudget
+  character(len=*), dimension(:), allocatable, intent(inout) :: hbulist
+
+  integer :: idx
+  integer :: isource
+  integer :: jg
+  integer :: js
+
+  if ( Allocated( hbulist ) ) Deallocate( hbulist )
+
+  if ( tpbudget%ngroups < 3 ) then
+    call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'ngroups is too small' )
+    return
+  end if
+
+  Allocate( character(len=NBULISTMAXLEN) :: hbulist(tpbudget%ngroups - 3) )
+  hbulist(:) = ''
+
+  idx = 0
+  do jg = 1, tpbudget%ngroups
+    if ( tpbudget%tgroups(jg)%nsources < 1 ) then
+      call Print_msg( NVERB_ERROR, 'BUD', 'Sourcelist_nml_compact', 'no source for group' )
+      cycle
+    end if
+
+    !Do not put 'INIF', 'ENDF', 'AVEF' in hbulist because their presence is automatic if the corresponding budget is enabled
+    isource = tpbudget%tgroups(jg)%nsourcelist(1)
+    if ( Any( tpbudget%tsources(isource)%cmnhname ==  [ 'INIF', 'ENDF', 'AVEF' ] ) ) cycle
+
+    idx = idx + 1
+#if 0
+    !Do not do this way because the group cmnhname may be truncated (NMNHNAMELGTMAX is smaller than NBULISTMAXLEN)
+    !and the name separator is different ('_')
+    hbulist(idx) = Trim( tpbudget%tgroups(jg)%cmnhname )
+#else
+    do js = 1, tpbudget%tgroups(jg)%nsources
+      isource = tpbudget%tgroups(jg)%nsourcelist(js)
+      hbulist(idx) = Trim( hbulist(idx) ) // Trim( tpbudget%tsources(isource)%cmnhname )
+      if ( js < tpbudget%tgroups(jg)%nsources ) hbulist(idx) = Trim( hbulist(idx) ) // '+'
+    end do
+#endif
+  end do
+end subroutine Sourcelist_nml_compact
+
+
+subroutine Sourcelist_sv_nml_compact( hbulist )
+  !This subroutine reduce the size of the hbulist
+  !For SV variables the reduction is simpler than for other variables
+  !because it is too complex to do this cleanly (the enabled source terms are different for each scalar variable)
+  use modd_budget, only: NBULISTMAXLEN, tbudgetdata
+
+  character(len=*), dimension(:), allocatable, intent(inout) :: hbulist
+
+  character(len=NBULISTMAXLEN), dimension(:), allocatable :: ybulist_new
+  integer :: ilines
+  integer :: ji
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) ilines = ilines + 1
+  end do
+
+  Allocate( ybulist_new(ilines) )
+
+  ilines = 0
+  do ji = 1, Size( hbulist )
+    if ( Len_trim(hbulist(ji)) > 0 ) then
+      ilines = ilines + 1
+      ybulist_new(ilines) = Trim( hbulist(ji) )
+    end if
+  end do
+
+  call Move_alloc( from = ybulist_new, to = hbulist )
+end subroutine Sourcelist_sv_nml_compact
+
+
 pure function Source_find( tpbudget, hsource ) result( ipos )
   use modd_budget,     only: tbudgetdata
 
diff --git a/src/MNH/ini_les_cart_maskn.f90 b/src/MNH/ini_les_cart_maskn.f90
index b162a3af54d3fca4d012e8a149ce176b40fb9d5d..a3e9c7840171d597857e56403768981a86b0ff4a 100644
--- a/src/MNH/ini_les_cart_maskn.f90
+++ b/src/MNH/ini_les_cart_maskn.f90
@@ -1,6 +1,6 @@
-!MNH_LIC Copyright 1994-2017 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-2021 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 version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
 !MNH_LIC for details. version 1.
 !-----------------------------------------------------------------
 !#############################
@@ -20,7 +20,7 @@ REAL, DIMENSION(:), INTENT(IN)  :: PXHAT_ll ! son model X coordinate
 REAL, DIMENSION(:), INTENT(IN)  :: PYHAT_ll ! son model X coordinate
 INTEGER,            INTENT(OUT) :: KLES_IINF ! limits of the cartesian
 INTEGER,            INTENT(OUT) :: KLES_JINF ! mask in son model
-INTEGER,            INTENT(OUT) :: KLES_ISUP ! domain
+INTEGER,            INTENT(OUT) :: KLES_ISUP ! physical domain
 INTEGER,            INTENT(OUT) :: KLES_JSUP !
 !
 END SUBROUTINE INI_LES_CART_MASK_n
@@ -58,9 +58,9 @@ END MODULE MODI_INI_LES_CART_MASKn
 !!      Original         07/02/00
 !!      Modification     01/02/01 (D.Gazen) add module MODD_NSV for NSV variable
 !!      J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
-!!      P.Wautelet: 19/10/2017 : IO: removed extern_userio.f90
-!!
-!! --------------------------------------------------------------------------
+!  P. Wautelet 19/10/2017: IO: removed extern_userio.f90
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -86,7 +86,7 @@ REAL, DIMENSION(:), INTENT(IN)  :: PXHAT_ll ! son model X coordinate
 REAL, DIMENSION(:), INTENT(IN)  :: PYHAT_ll ! son model X coordinate
 INTEGER,            INTENT(OUT) :: KLES_IINF ! limits of the cartesian
 INTEGER,            INTENT(OUT) :: KLES_JINF ! mask in son model
-INTEGER,            INTENT(OUT) :: KLES_ISUP ! domain
+INTEGER,            INTENT(OUT) :: KLES_ISUP ! physical domain
 INTEGER,            INTENT(OUT) :: KLES_JSUP !
 !
 !
@@ -140,32 +140,32 @@ IJE_ll=SIZE(PYHAT_ll)-JPHEXT
 !
 !* left limit
 !
-ZX = ZXHAT_ll(NLESn_IINF(IMI))
+ZX = ZXHAT_ll(NLESn_IINF(IMI) + JPHEXT)
 IF (PXHAT_ll(IIB_ll)>ZX) THEN
-  KLES_IINF=IIB_ll ! father mask starts left of son domain
+  KLES_IINF=1 ! father mask starts left of son domain
 ELSE IF (PXHAT_ll(IIE_ll+1)<ZX) THEN
   CALL MASK_OVER_ALL_DOMAIN
   RETURN
 ELSE
   DO JI=IIB_ll,IIE_ll
     IF (ABS(PXHAT_ll(JI)-ZX) <= (PXHAT_ll(JI+1)-PXHAT_ll(JI))/2. ) THEN
-      KLES_IINF=JI
+      KLES_IINF=JI-JPHEXT
     END IF
   END DO
 END IF
 !
 !* right limit
 !
-ZX = ZXHAT_ll(NLESn_ISUP(IMI)+1)
+ZX = ZXHAT_ll(NLESn_ISUP(IMI) + JPHEXT + 1)
 IF (PXHAT_ll(IIB_ll)>ZX) THEN
   CALL MASK_OVER_ALL_DOMAIN
   RETURN
 ELSE IF (PXHAT_ll(IIE_ll+1)<ZX) THEN
-  KLES_ISUP=IIE_ll ! father mask ends right of son domain
+  KLES_ISUP=IIE_ll-JPHEXT ! father mask ends right of son domain
 ELSE
   DO JI=IIB_ll,IIE_ll
     IF (ABS(PXHAT_ll(JI+1)-ZX) <= (PXHAT_ll(JI+1)-PXHAT_ll(JI))/2. ) THEN
-      KLES_ISUP=JI
+      KLES_ISUP=JI-JPHEXT
     END IF
   END DO
 END IF
@@ -177,32 +177,32 @@ END IF
 !
 !* bottom limit
 !
-ZY = ZYHAT_ll(NLESn_JINF(IMI))
+ZY = ZYHAT_ll(NLESn_JINF(IMI) + JPHEXT)
 IF (PYHAT_ll(IJB_ll)>ZY) THEN
-  KLES_JINF=IJB_ll ! father mask starts under the son domain
+  KLES_JINF=1 ! father mask starts under the son domain
 ELSE IF (PYHAT_ll(IJE_ll+1)<ZY) THEN
   CALL MASK_OVER_ALL_DOMAIN
   RETURN
 ELSE
   DO JJ=IJB_ll,IJE_ll
     IF (ABS(PYHAT_ll(JJ)-ZY) <= (PYHAT_ll(JJ+1)-PYHAT_ll(JJ))/2. ) THEN
-      KLES_JINF=JJ
+      KLES_JINF=JJ-JPHEXT
     END IF
   END DO
 END IF
 !
 !* top limit
 !
-ZY = ZYHAT_ll(NLESn_JSUP(IMI)+1)
+ZY = ZYHAT_ll(NLESn_JSUP(IMI) + JPHEXT + 1)
 IF (PYHAT_ll(IJB_ll)>ZY) THEN
   CALL MASK_OVER_ALL_DOMAIN
   RETURN
 ELSE IF (PYHAT_ll(IJE_ll+1)<ZY) THEN
-  KLES_JSUP=IJE_ll ! father mask ends over the son domain
+  KLES_JSUP=IJE_ll-JPHEXT ! father mask ends over the son domain
 ELSE
   DO JJ=IJB_ll,IJE_ll
     IF (ABS(PYHAT_ll(JJ+1)-ZY) <= (PYHAT_ll(JJ+1)-PYHAT_ll(JJ))/2. ) THEN
-      KLES_JSUP=JJ
+      KLES_JSUP=JJ-JPHEXT
     END IF
   END DO
 END IF
@@ -215,10 +215,10 @@ DEALLOCATE(ZYHAT_ll)
   CONTAINS
 !
   SUBROUTINE MASK_OVER_ALL_DOMAIN
-    KLES_IINF=IIB_ll ! father mask not in son domain, so all domain is taken
-    KLES_ISUP=IIE_ll
-    KLES_JINF=IJB_ll
-    KLES_JSUP=IJE_ll
+    KLES_IINF=IIB_ll-JPHEXT ! father mask not in son domain, so all domain is taken
+    KLES_ISUP=IIE_ll-JPHEXT
+    KLES_JINF=IJB_ll-JPHEXT
+    KLES_JSUP=IJE_ll-JPHEXT
     DEALLOCATE(ZXHAT_ll)
     DEALLOCATE(ZYHAT_ll)
   END SUBROUTINE MASK_OVER_ALL_DOMAIN
diff --git a/src/MNH/ini_lesn.f90 b/src/MNH/ini_lesn.f90
index 63f05f89df388ec0d2cc72ae07d6bf4130ebda99..a0776d1feb3532f5b459764fa81ec0c13369bdd3 100644
--- a/src/MNH/ini_lesn.f90
+++ b/src/MNH/ini_lesn.f90
@@ -38,7 +38,8 @@
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
 !  P. Wautelet 12/08/2020: bugfix: use NUNDEF instead of XUNDEF for integer variables
 !  P. Wautelet 04/01/2021: bugfix: nles_k was used instead of nspectra_k for a loop index
-!! --------------------------------------------------------------------------
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -160,28 +161,39 @@ NLES_MASKS = 1
 !  -----------------------------------------------------------------------------
 !
 IF (IMI==1) THEN
-  NLESn_IINF(1)= NUNDEF
-  NLESn_ISUP(1)= NUNDEF
-  NLESn_JINF(1)= NUNDEF
-  NLESn_JSUP(1)= NUNDEF
-  !
-  IF (LLES_CART_MASK) THEN
-    IF (NLES_IINF==NUNDEF) NLES_IINF=JPHEXT+1
-    IF (NLES_JINF==NUNDEF) NLES_JINF=JPHEXT+1
-    IF (NLES_ISUP==NUNDEF) NLES_ISUP=IIU_ll-JPHEXT
-    IF (NLES_JSUP==NUNDEF) NLES_JSUP=IJU_ll-JPHEXT
-  END IF
-  !
-  IF (       NLES_IINF==JPHEXT+1      .AND. NLES_JINF==JPHEXT+1       &
-       .AND. NLES_ISUP==IIU_ll-JPHEXT .AND. NLES_ISUP==IJU_ll-JPHEXT  ) THEN
-    LLES_CART_MASK=.FALSE.
-  END IF
-  !
-  IF (.NOT. LLES_CART_MASK) THEN
-    NLES_IINF=JPHEXT+1
-    NLES_JINF=JPHEXT+1
-    NLES_ISUP=IIU_ll-JPHEXT
-    NLES_JSUP=IJU_ll-JPHEXT
+  IF ( LLES_CART_MASK ) THEN
+    !Compute LES diagnostics inside a cartesian mask
+
+    !Set default values to physical domain boundaries
+    IF ( NLES_IINF == NUNDEF ) NLES_IINF = 1
+    IF ( NLES_JINF == NUNDEF ) NLES_JINF = 1
+    IF ( NLES_ISUP == NUNDEF ) NLES_ISUP = NIMAX_ll
+    IF ( NLES_JSUP == NUNDEF ) NLES_JSUP = NJMAX_ll
+
+    !Check that selected indices are in physical domain
+    IF ( NLES_IINF < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too small (<1)' )
+    IF ( NLES_IINF > NIMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_IINF too large (>NIMAX)' )
+    IF ( NLES_ISUP < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too small (<1)' )
+    IF ( NLES_ISUP > NIMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_ISUP too large (>NIMAX)' )
+    IF ( NLES_ISUP < NLES_IINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_ISUP < NLES_IINF' )
+
+    IF ( NLES_JINF < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too small (<1)' )
+    IF ( NLES_JINF > NJMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JINF too large (>NJMAX)' )
+    IF ( NLES_JSUP < 1 )         CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too small (<1)' )
+    IF ( NLES_JSUP > NJMAX_ll )  CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_JSUP too large (>NJMAX)' )
+    IF ( NLES_JSUP < NLES_JINF ) CALL Print_msg( NVERB_ERROR, 'BUD', 'INI_LES_n', 'NLES_JSUP < NLES_JINF' )
+
+    !Set LLES_CART_MASK to false if whole domain is selected
+    IF (       NLES_IINF == 1        .AND. NLES_JINF == 1        &
+         .AND. NLES_ISUP == NIMAX_ll .AND. NLES_ISUP == NJMAX_ll ) THEN
+      LLES_CART_MASK = .FALSE.
+    END IF
+  ELSE
+    !Compute LES diagnostics on whole physical domain
+    NLES_IINF = 1
+    NLES_JINF = 1
+    NLES_ISUP = NIMAX_ll
+    NLES_JSUP = NJMAX_ll
   END IF
   !
   NLESn_IINF(1)= NLES_IINF
@@ -212,17 +224,16 @@ END IF
 !  ----------------------------------------------------------------------------
 !
 IF ( (.NOT. L1D) .AND. CLBCX(1)/='CYCL') THEN
-  NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),JPHEXT+2)
+  NLESn_IINF(IMI) = MAX(NLESn_IINF(IMI),2)
 END IF
 IF ( (.NOT. L1D) .AND. (.NOT. L2D) .AND. CLBCY(1)/='CYCL') THEN
-  NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),JPHEXT+2)
+  NLESn_JINF(IMI) = MAX(NLESn_JINF(IMI),2)
 END IF
 !
 !* X boundary conditions for 2points correlations computations
 !  -----------------------------------------------------------
 !
-IF ( NLESn_IINF(IMI)==JPHEXT+1 .AND. NLESn_ISUP(IMI)==IIU_ll-JPHEXT  &
-                              .AND. CLBCX(1)=='CYCL'               ) THEN
+IF ( CLBCX(1) == 'CYCL' .AND. NLESn_IINF(IMI) == 1 .AND. NLESn_ISUP(IMI) == NIMAX_ll ) THEN
   CLES_LBCX(:,IMI) = 'CYCL'
 ELSE
   CLES_LBCX(:,IMI) = 'OPEN'
@@ -231,8 +242,7 @@ END IF
 !* Y boundary conditions for 2points correlations computations
 !  -----------------------------------------------------------
 !
-IF ( NLESn_JINF(IMI)==JPHEXT+1 .AND. NLESn_JSUP(IMI)==IJU_ll-JPHEXT  &
-                              .AND. CLBCY(1)=='CYCL'               ) THEN
+IF ( CLBCY(1) == 'CYCL' .AND. NLESn_JINF(IMI) == 1 .AND. NLESn_JSUP(IMI) == NJMAX_ll ) THEN
   CLES_LBCY(:,IMI) = 'CYCL'
 ELSE
   CLES_LBCY(:,IMI) = 'OPEN'
@@ -365,6 +375,13 @@ END IF
 !            --------------------
 !
 IF (ANY(NLES_LEVELS(:)/=NUNDEF)) THEN
+  DO JK = 1, SIZE( NLES_LEVELS )
+    IF ( NLES_LEVELS(JK) /= NUNDEF ) THEN
+      IF ( NLES_LEVELS(JK) < 1 )     CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too small (<1)' )
+      IF ( NLES_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NLES_LEVELS too large (>NKMAX)' )
+    END IF
+  END DO
+
   NLES_K = COUNT (NLES_LEVELS(:)/=NUNDEF)
   CLES_LEVEL_TYPE='K'
 ELSE
@@ -372,7 +389,7 @@ ELSE
     NLES_K = MIN(SIZE(NLES_LEVELS),NKMAX)
     CLES_LEVEL_TYPE='K'
     DO JK=1,NLES_K
-      NLES_LEVELS(JK) = JK + JPVEXT
+      NLES_LEVELS(JK) = JK
     END DO
   END IF
 END IF
@@ -414,6 +431,13 @@ END IF
 !            --------------------
 !
 IF (ANY(NSPECTRA_LEVELS(:)/=NUNDEF)) THEN
+  DO JK = 1, SIZE( NSPECTRA_LEVELS )
+    IF ( NSPECTRA_LEVELS(JK) /= NUNDEF ) THEN
+      IF ( NSPECTRA_LEVELS(JK) < 1 )     CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too small (<1)' )
+      IF ( NSPECTRA_LEVELS(JK) > NKMAX ) CALL Print_msg( NVERB_ERROR, 'GEN', 'INI_LES_n', 'NSPECTRA_LEVELS too large (>NKMAX)' )
+    END IF
+  END DO
+
   NSPECTRA_K = COUNT (NSPECTRA_LEVELS(:)/=NUNDEF)
   CSPECTRA_LEVEL_TYPE='K'
 END IF
diff --git a/src/MNH/les_ini_timestepn.f90 b/src/MNH/les_ini_timestepn.f90
index 66a9748b82c53d51f1f1683ee8888afcdc203d33..c93c4c887d19394fa34a5e9ee91e760fddb04503 100644
--- a/src/MNH/les_ini_timestepn.f90
+++ b/src/MNH/les_ini_timestepn.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2002-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2002-2021 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.
@@ -49,8 +49,8 @@ END MODULE MODI_LES_INI_TIMESTEP_n
 !!    -------------
 !!      Original         06/11/02
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
-!!
-!! --------------------------------------------------------------------------
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+! --------------------------------------------------------------------------
 !
 !*      0. DECLARATIONS
 !          ------------
@@ -177,10 +177,10 @@ IMI = GET_CURRENT_MODEL_INDEX()
 !
 ALLOCATE(LLES_CURRENT_CART_MASK(IIU,IJU,NLES_K))
 !
-IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)-(IIB_ll-1-JPHEXT))
-IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)-(IJB_ll-1-JPHEXT))
-IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)-(IIB_ll-1-JPHEXT))
-IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)-(IJB_ll-1-JPHEXT))
+IIINF_MASK = MAX(IIB, NLESn_IINF(IMI)+JPHEXT-(IIB_ll-1-JPHEXT))
+IJINF_MASK = MAX(IJB, NLESn_JINF(IMI)+JPHEXT-(IJB_ll-1-JPHEXT))
+IISUP_MASK = MIN(IIE, NLESn_ISUP(IMI)+JPHEXT-(IIB_ll-1-JPHEXT))
+IJSUP_MASK = MIN(IJE, NLESn_JSUP(IMI)+JPHEXT-(IJB_ll-1-JPHEXT))
 !
 !
 LLES_CURRENT_CART_MASK(:,:,:) = .FALSE.
diff --git a/src/MNH/les_ver_int.f90 b/src/MNH/les_ver_int.f90
index b864e4747ef60897e6e1f2ceb48ee0fe32786bc6..4045cec781e8e2110b78fc27858d1e655d4eb4b0 100644
--- a/src/MNH/les_ver_int.f90
+++ b/src/MNH/les_ver_int.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2000-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2000-2021 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.
@@ -49,8 +49,8 @@ END MODULE MODI_LES_VER_INT
 !!    -------------
 !!      Original         07/02/00
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
-!!
-!! --------------------------------------------------------------------------
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
+! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
 !          ------------
@@ -80,7 +80,7 @@ INTEGER :: JK  ! vertical loop counter
 !
 IF (CLES_LEVEL_TYPE=='K') THEN
   DO JK = 1, NLES_K
-    PA_LES(:,:,JK) = PA_MNH(:,:,NLES_LEVELS(JK))
+    PA_LES(:,:,JK) = PA_MNH(:,:,NLES_LEVELS(JK) + JPVEXT )
   END DO
 ELSE IF (CLES_LEVEL_TYPE=='Z') THEN
   PA_LES = VER_INTERP_LIN(PA_MNH,NKLIN_CURRENT_LES,XCOEFLIN_CURRENT_LES)
diff --git a/src/MNH/modd_budget.f90 b/src/MNH/modd_budget.f90
index 4b0c256f0d10d2d6f2e415b95708faed7b3e00be..44a3cfff0e0cdd4c5a930be3631aadba593c9ef9 100644
--- a/src/MNH/modd_budget.f90
+++ b/src/MNH/modd_budget.f90
@@ -47,6 +47,7 @@
 !  P. Wautelet 14/01/2021: change xbusurf type to integer (+ rename it to nbusurf)
 !  P. Wautelet 03/03/2021: add tbudiachrometadata type (useful to pass more information to Write_diachro)
 !  P. Wautelet 17/03/2021: choose source terms for budgets with character strings instead of multiple integer variables
+!  P. Wautelet 30/03/2021: budgets: cartesian subdomain limits are defined in the physical domain
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -59,8 +60,8 @@ implicit none
 
 public
 
-integer, parameter :: NBULISTMAXLEN   = 512
-integer, parameter :: NBULISTMAXLINES = 40
+integer, parameter :: NBULISTMAXLEN   = 256
+integer, parameter :: NBULISTMAXLINES = 50
 
 integer, parameter :: NBUDGET_RHO = 0  ! Reference number for budget of RhoJ
 integer, parameter :: NBUDGET_U   = 1  ! Reference number for budget of RhoJu  and/or LES budgets with u
@@ -107,10 +108,13 @@ type :: tbudiachrometadata
   character(len=NBUNAMELGTMAX)  :: cname       = 'not set'
   character(len=NCOMMENTLGTMAX) :: ccomment    = 'not set'
   character(len=NBUNAMELGTMAX)  :: ctype       = 'not set'
+  character(len=NBUNAMELGTMAX)  :: ccategory   = 'not set' !budget, LES, aircraft, balloon, series, station, profiler
+  character(len=NBUNAMELGTMAX)  :: cshape      = 'not set' !Shape of the domain (mask, cartesian, vertical profile, point)
+  logical :: lmobile    = .false.                          !Is the domain moving? (ie for aircrafts and balloons)
   logical :: licompress = .false.
   logical :: ljcompress = .false.
   logical :: lkcompress = .false.
-  integer :: nil = -1
+  integer :: nil = -1 !Cartesian box boundaries in physical domain coordinates
   integer :: nih = -1
   integer :: njl = -1
   integer :: njh = -1
@@ -167,16 +171,16 @@ integer, save :: nbusubwrite = 0           ! Number of budget time average perio
 integer, save :: nbutotwrite = 0           ! Total number of budget time average periods
 !
 INTEGER, SAVE :: NBUKL, NBUKH              ! lowest and highest K indice values 
-                                           ! of the budget box 
+                                           ! of the budget box in the physical domain
 LOGICAL, SAVE :: LBU_KCP                   ! switch for compression in K
                                            ! direction
 !
 !                Variables used by the cartesian box case ('CART') only
 !
 INTEGER, SAVE :: NBUIL, NBUIH              ! lowest and highest I indice values 
-                                           ! of the cartesian box 
+                                           ! of the cartesian box in the physical domain
 INTEGER, SAVE :: NBUJL, NBUJH              ! lowest and highest J indice values 
-                                           ! of the cartesian box 
+                                           ! of the cartesian box in the physical domain
 LOGICAL, SAVE :: LBU_ICP                   ! switch for compression in I
                                            ! direction
 LOGICAL, SAVE :: LBU_JCP                   ! switch for comppression in J
@@ -222,105 +226,105 @@ INTEGER, SAVE :: NBUKMAX                   ! dimension along K of the budget
 !     
 !      Allowed processes for the budget of RU (wind component along x)
 !
-! Courant namelist: NAM_BURU
+! Current namelist: NAM_BU_RU
 !
 LOGICAL, SAVE :: LBU_RU = .FALSE. ! True when the budget of RU is performed
 !                         
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RU = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RU
 !
 !      Allowed processes for the budget of RV (wind component along y)
 !                                                  
-! Courant namelist: NAM_BURV
+! Current namelist: NAM_BU_RV
 !
 LOGICAL, SAVE :: LBU_RV = .FALSE. ! True when the budget of RV is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RV
 !
 !      Allowed processes for the budget of RW (wind vertical component)
 !                                                  
-! Courant namelist: NAM_BURW
+! Current namelist: NAM_BU_RW
 !
 LOGICAL, SAVE :: LBU_RW = .FALSE. ! True when the budget of RW is performed
 !                                                  
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RW = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RW
 !
 !      Allowed processes for the budget of RTH (potential temperature)
 !                                                  
-! Courant namelist: NAM_BURTH
+! Current namelist: NAM_BU_RTH
 !
 LOGICAL, SAVE :: LBU_RTH = .FALSE. ! True when the budget of RTH is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTH = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTH
 !
 !      Allowed processes for the budget of RTKE (kinetic energy)
 !                                                  
-! Courant namelist: NAM_BURTKE
+! Current namelist: NAM_BU_RTKE
 !
 LOGICAL, SAVE :: LBU_RTKE = .FALSE. ! True when the budget of RTKE is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RTKE = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RTKE
 !
 !      Allowed processes for the budget of moist variable RRV (water vapor)
 !                                                  
-! Courant namelist: NAM_BURRV
+! Current namelist: NAM_BU_RRV
 !
 LOGICAL, SAVE :: LBU_RRV = .FALSE. ! true when the budget of RRV is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRV
 !
 !      Allowed processes for the budget of moist variable RRC (cloud water)
 !                                                  
-! Courant namelist: NAM_BURRC
+! Current namelist: NAM_BU_RRC
 !
 LOGICAL, SAVE :: LBU_RRC = .FALSE. ! True when the budget of RRC is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRC = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRC
 !
 !      Allowed processes for the budget of moist variable RRR (rain water)
 !
-! Courant namelist: NAM_BURRR
+! Current namelist: NAM_BU_RRR
 !
 LOGICAL, SAVE :: LBU_RRR = .FALSE. ! True when the budget of RRR is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRR = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRR
 !
 !      Allowed processes for the budget of moist variable RRI (ice)
 !
-! Courant namelist: NAM_BURRI
+! Current namelist: NAM_BU_RRI
 !
 LOGICAL, SAVE :: LBU_RRI = .FALSE. ! True when the budget of RRI is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRI = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRI
 !
 !      Allowed processes for the budget of moist variable RRS (snow)
 !
-! Courant namelist: NAM_BURRS
+! Current namelist: NAM_BU_RRS
 !
 LOGICAL, SAVE :: LBU_RRS = .FALSE. ! True when the budget of RRS is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRS = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRS
 !
 !      Allowed processes for the budget of moist variable RRG (graupel)
 !
-! Courant namelist: NAM_BURRG
+! Current namelist: NAM_BU_RRG
 !
 LOGICAL, SAVE :: LBU_RRG = .FALSE. ! True when the budget of RRG is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRG = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRG
 !
 !      Allowed processes for the budget of moist variable RRH (hail)
 !
-! Courant namelist: NAM_BURRH
+! Current namelist: NAM_BU_RRH
 !
 LOGICAL, SAVE :: LBU_RRH = .FALSE. ! True when the budget of RRH is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RRH = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RRH
 !
-! Courant namelist: NAM_BURSV
+! Current namelist: NAM_BU_RSV
 !
 LOGICAL, SAVE :: LBU_RSV = .FALSE. ! True when the budget of RSVx is performed
 !
-CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(NBULISTMAXLINES), SAVE :: CBULIST_RSV = ''
+CHARACTER(LEN=NBULISTMAXLEN), DIMENSION(:), ALLOCATABLE :: CBULIST_RSV
 !
 !
 REAL :: XTIME_BU          ! budget time in this time-step
diff --git a/src/MNH/modd_les.f90 b/src/MNH/modd_les.f90
index e830ed1a4331fd3716cda326390bb7b22f0085bd..db71d6f33aa854d4fa66308dece4c9cc7ad7bbcd 100644
--- a/src/MNH/modd_les.f90
+++ b/src/MNH/modd_les.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1995-2019 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1995-2021 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.
@@ -41,8 +41,9 @@
 !!       J.Pergaud   Oct    , 2007  MF LES     
 !!       P. Aumond   Oct     ,2009  User multimaskS + 4th order
 !!       C.Lac       Oct     ,2014  Correction on user masks
-!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 13/09/2019: budget: simplify and modernize date/time management
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
 !-------------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
@@ -64,9 +65,9 @@ LOGICAL :: LLES_DOWNDRAFT ! flag to activate the computations in downdrafts
 LOGICAL :: LLES_SPECTRA   ! flag to activate the spectra computations
 LOGICAL :: LLES_PDF      ! flag to activate the pdf computations      
 !
-INTEGER, DIMENSION(900) :: NLES_LEVELS         ! model levels for LES comp.
+INTEGER, DIMENSION(900) :: NLES_LEVELS         ! physical model levels for LES comp.
 REAL,    DIMENSION(900) :: XLES_ALTITUDES      ! alt.  levels for LES comp.
-INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS     ! model levels for spectra comp.
+INTEGER, DIMENSION(900) :: NSPECTRA_LEVELS     ! physical model levels for spectra comp.
 REAL,    DIMENSION(900) :: XSPECTRA_ALTITUDES  ! alt.  levels for spectra comp.
 !
 INTEGER, DIMENSION( 10) :: NLES_TEMP_SERIE_I   ! I, J and Z point
@@ -82,7 +83,7 @@ REAL :: XLES_TEMP_MEAN_END    ! for start and end of the temporal averaged comp.
 REAL :: XLES_TEMP_MEAN_STEP   ! time step for each averaging
 
 LOGICAL :: LLES_CART_MASK     ! flag to use a cartesian mask
-INTEGER :: NLES_IINF          ! definition of the cartesians mask
+INTEGER :: NLES_IINF          ! definition of the cartesians mask in physical domain
 INTEGER :: NLES_ISUP          !     for NLES_CART_MODNBR model
 INTEGER :: NLES_JINF          !               "
 INTEGER :: NLES_JSUP          !               "
@@ -95,7 +96,7 @@ INTEGER :: NPDF         ! number of pdf intervals
 !
 !-------------------------------------------------------------------------------
 !
-INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask
+INTEGER, DIMENSION(JPMODELMAX) :: NLESn_IINF ! definition of the cartesians mask in physical domain
 INTEGER, DIMENSION(JPMODELMAX) :: NLESn_ISUP !          for all models
 INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JINF !               "
 INTEGER, DIMENSION(JPMODELMAX) :: NLESn_JSUP !               "
@@ -138,7 +139,7 @@ INTEGER :: NLES_CURRENT_TIMES
 ! current model NLES_TIMES (number of LES samplings)
 !
 INTEGER :: NLES_CURRENT_IINF, NLES_CURRENT_ISUP, NLES_CURRENT_JINF, NLES_CURRENT_JSUP
-! coordinates for write_diachro, set to NLESn_IINF(current model), etc...
+! coordinates (in physical domain) for write_diachro, set to NLESn_IINF(current model), etc...
 !
 REAL :: XLES_CURRENT_DOMEGAX, XLES_CURRENT_DOMEGAY
 ! minimum wavelength in spectra analysis
diff --git a/src/MNH/mode_les_diachro.f90 b/src/MNH/mode_les_diachro.f90
index 6627a8eff08a032e77f4391ecf414a04e710e904..27764a382b7ad500d65dfde90516e50bcbb897df 100644
--- a/src/MNH/mode_les_diachro.f90
+++ b/src/MNH/mode_les_diachro.f90
@@ -1029,6 +1029,9 @@ if ( iresp == 0 .and. any( zfield /= XUNDEF ) ) then
   !tzbudiachro%ccomment   = DONE BEFORE
 !   tzbudiachro%ctype      = 'SSOL'
   tzbudiachro%ctype      = 'TLES' !T for trajectory (used in Write_diachro_lfi to add trajectory terms)
+  tzbudiachro%ccategory  = 'LES'
+  tzbudiachro%cshape     = 'cartesian'
+  tzbudiachro%lmobile    = .false.
   tzbudiachro%licompress = .false.
   tzbudiachro%ljcompress = .false.
   tzbudiachro%lkcompress = .false.
@@ -1207,6 +1210,9 @@ else
   tzbudiachro%ccomment = Trim( tzfield%ccomment ) // ' (time averaged)'
 end if
 tzbudiachro%ctype      = 'SPXY'
+tzbudiachro%ccategory  = 'LES'
+tzbudiachro%cshape     = 'spectrum'
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .false.
 tzbudiachro%ljcompress = .false.
 tzbudiachro%lkcompress = .false.
@@ -1360,6 +1366,9 @@ tzbudiachro%cgroupname = ygroup
 tzbudiachro%cname      = ygroup
 tzbudiachro%ccomment   = tzfield%ccomment
 tzbudiachro%ctype      = 'SPXY'
+tzbudiachro%ccategory  = 'LES'
+tzbudiachro%cshape     = 'spectrum'
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .false.
 tzbudiachro%ljcompress = .false.
 tzbudiachro%lkcompress = .false.
@@ -1385,6 +1394,9 @@ tzbudiachro%cgroupname = ygroup
 tzbudiachro%cname      = ygroup
 tzbudiachro%ccomment   = Trim( tzfield%ccomment ) // ' (time averaged)'
 tzbudiachro%ctype      = 'SPXY'
+tzbudiachro%ccategory  = 'LES'
+tzbudiachro%cshape     = 'spectrum'
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .false.
 tzbudiachro%ljcompress = .false.
 tzbudiachro%lkcompress = .false.
diff --git a/src/MNH/read_desfmn.f90 b/src/MNH/read_desfmn.f90
index 294bafd4550f4587cd8e8d6d913b82d3aee35b64..b32584f8eb7bfa280d4b4400076f5dcfc1c62149 100644
--- a/src/MNH/read_desfmn.f90
+++ b/src/MNH/read_desfmn.f90
@@ -508,34 +508,36 @@ IF (KMI == 1) THEN
     END IF
     READ(UNIT=ILUDES,NML=NAM_OUTPUT)
   END IF
-  CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
-  CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU)
-  CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV)
-  CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW)
-  CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH)
-  CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE)
-  CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV)
-  CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC)
-  CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR)
-  CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI)
-  CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS)
-  CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG)
-  CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH)
-  CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND)
-  IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV)
+! Note: it is not useful to read the budget namelists in the .des files
+! The value here (if present in file) don't need to be compared with the ones in the EXSEGn files
+!   CALL POSNAM(ILUDES,'NAM_BUDGET',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BUDGET)
+!   CALL POSNAM(ILUDES,'NAM_BU_RU',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RU)
+!   CALL POSNAM(ILUDES,'NAM_BU_RV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RV)
+!   CALL POSNAM(ILUDES,'NAM_BU_RW',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RW)
+!   CALL POSNAM(ILUDES,'NAM_BU_RTH',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTH)
+!   CALL POSNAM(ILUDES,'NAM_BU_RTKE',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RTKE)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRV)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRC',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRC)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRR',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRR)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRI',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRI)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRS',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRS)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRG',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRG)
+!   CALL POSNAM(ILUDES,'NAM_BU_RRH',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RRH)
+!   CALL POSNAM(ILUDES,'NAM_BU_RSV',GFOUND)
+!   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_BU_RSV)
   CALL POSNAM(ILUDES,'NAM_LES',GFOUND)
   IF (GFOUND) READ(UNIT=ILUDES,NML=NAM_LES)
   CALL POSNAM(ILUDES,'NAM_PDF',GFOUND)
@@ -705,47 +707,48 @@ IF (NVERB >= 10) THEN
     WRITE(UNIT=ILUOUT,FMT="('************ DYNAMIC **************************')")
     WRITE(UNIT=ILUOUT,NML=NAM_DYN)
 !    
-    WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
-!    
-    WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
-    WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
+! Budget namelists not read anymore in READ_DESFM_n
+!     WRITE(UNIT=ILUOUT,FMT="('************ BUDGET ***************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BUDGET)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ U BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RU)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ V BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ W BUDGET *************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RW)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ TKE BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RTKE)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RV BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRV)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RC BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRC)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RR BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRR)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RI BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRI)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RS BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRS)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RG BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRG)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ RH BUDGET ************************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RRH)
+! !
+!     WRITE(UNIT=ILUOUT,FMT="('************ SVx BUDGET ***********************')")
+!     WRITE(UNIT=ILUOUT,NML=NAM_BU_RSV)
 !    
     WRITE(UNIT=ILUOUT,FMT="('************ LES ******************************')")
     WRITE(UNIT=ILUOUT,NML=NAM_LES)
diff --git a/src/MNH/read_exsegn.f90 b/src/MNH/read_exsegn.f90
index 8ad06729886bb8500521c981941fe4ce30cbb64c..cd9d6ea125770025a819d9386f65d5fb2eba176b 100644
--- a/src/MNH/read_exsegn.f90
+++ b/src/MNH/read_exsegn.f90
@@ -302,91 +302,93 @@ END MODULE MODI_READ_EXSEG_n
 !
 !*       0.    DECLARATIONS
 !              ------------
-USE MODD_PARAMETERS
+USE MODD_BLOWSNOW
+USE MODD_BUDGET
+USE MODD_CH_AEROSOL
+USE MODD_CH_M9_n, ONLY : NEQ
+USE MODD_CONDSAMP
 USE MODD_CONF
-USE MODD_CONFZ
 USE MODD_CONF_n,  ONLY: CSTORAGE_TYPE
+USE MODD_CONFZ
+! USE MODD_DRAG_n
+USE MODD_DUST
+USE MODD_DYN
+USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA
+#ifdef MNH_FOREFIRE
+USE MODD_FOREFIRE
+#endif
+USE MODD_GET_n
+USE MODD_GR_FIELD_n
 USE MODD_IO,   ONLY: TFILEDATA
 USE MODD_LUNIT_n, ONLY: TLUOUT
+USE MODD_NSV,NSV_USER_n=>NSV_USER
+USE MODD_PARAMETERS
+USE MODD_PASPOL
+USE MODD_SALT
 USE MODD_VAR_ll,  ONLY: NPROC
-!
+USE MODD_VISCOSITY
+
+USE MODE_MSG
+USE MODE_POS
+
+USE MODI_INI_NSV
+USE MODI_TEST_NAM_VAR
+
+USE MODN_2D_FRC
+USE MODN_ADV_n      ! The final filling of these modules for the model n is
 USE MODN_BACKUP
+USE MODN_BLANK
+USE MODN_BLOWSNOW
+USE MODN_BLOWSNOW_n
 USE MODN_BUDGET
-USE MODN_LES
+USE MODN_CH_MNHC_n
+USE MODN_CH_ORILAM
+USE MODN_CH_SOLVER_n
+USE MODN_CONDSAMP
 USE MODN_CONF
+USE MODN_CONF_n
 USE MODN_CONFZ
-USE MODN_FRC
+USE MODN_DRAGBLDG_n
+USE MODN_DRAG_n
+USE MODN_DRAGTREE_n
+USE MODN_DUST
 USE MODN_DYN
-USE MODN_NESTING
-USE MODN_OUTPUT
-USE MODN_CONF_n
-USE MODN_LBC_n      ! routine is used for each nested model. This has been done 
 USE MODN_DYN_n      ! to avoid the duplication of this routine for each model.
-USE MODN_ADV_n      ! The final filling of these modules for the model n is
-USE MODN_PARAM_n    ! realized in subroutine ini_model n
-USE MODN_PARAM_RAD_n
-USE MODN_PARAM_ECRAD_n
-USE MODN_PARAM_KAFR_n
-USE MODN_PARAM_MFSHALL_n
-USE MODN_PARAM_ICE
+USE MODN_ELEC
+#ifdef MNH_FOREFIRE
+USE MODN_FOREFIRE
+#endif
+USE MODN_FRC
+USE MODN_LATZ_EDFLX
+USE MODN_LBC_n      ! routine is used for each nested model. This has been done
+USE MODN_LES
 USE MODN_LUNIT_n
+USE MODN_MEAN
+USE MODN_NESTING
 USE MODN_NUDGING_n
-USE MODN_TURB_n
-USE MODN_DRAG_n
-USE MODN_BLANK
-USE MODN_CH_MNHC_n
-USE MODN_CH_SOLVER_n
-USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, &
-                            WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2
+USE MODN_OUTPUT
 USE MODN_PARAM_C1R3, ONLY : NAM_PARAM_C1R3, CPRISTINE_ICE_C1R3,    &
                             CHEVRIMED_ICE_C1R3
+USE MODN_PARAM_C2R2, ONLY : EPARAM_CCN=>HPARAM_CCN, EINI_CCN=>HINI_CCN, &
+                            WNUC=>XNUC, WALPHAC=>XALPHAC, NAM_PARAM_C2R2
+USE MODN_PARAM_ECRAD_n
+USE MODN_PARAM_ICE
+USE MODN_PARAM_KAFR_n
 USE MODN_PARAM_LIMA, ONLY : FINI_CCN=>HINI_CCN,NAM_PARAM_LIMA,NMOD_CCN,LSCAV, &
                             CPRISTINE_ICE_LIMA, CHEVRIMED_ICE_LIMA, NMOD_IFN, &
                             LCOLD, LACTI, LNUCL, XALPHAC, XNUC, LMEYERS, LHAIL
-USE MODN_ELEC
+USE MODN_PARAM_MFSHALL_n
+USE MODN_PARAM_n    ! realized in subroutine ini_model n
+USE MODN_PARAM_RAD_n
+USE MODN_PASPOL
+USE MODN_SALT
 USE MODN_SERIES
-USE MODN_SERIES_n 
-USE MODN_TURB_CLOUD
+USE MODN_SERIES_n
 USE MODN_TURB
-USE MODN_MEAN
-USE MODN_DRAGTREE_n
-USE MODN_DRAGBLDG_n
-USE MODN_LATZ_EDFLX
-!
-USE MODD_NSV,NSV_USER_n=>NSV_USER
-USE MODD_DYN
-USE MODD_DYN_n, ONLY : LHORELAX_SVLIMA
-USE MODD_GET_n
-USE MODD_GR_FIELD_n
-!
-USE MODE_POS
-USE MODE_MSG
-!
-USE MODI_TEST_NAM_VAR
-USE MODI_INI_NSV
-USE MODN_CH_ORILAM
-USE MODD_CH_AEROSOL
-USE MODD_DUST
-USE MODD_SALT
-USE MODD_PASPOL
-#ifdef MNH_FOREFIRE
-USE MODD_FOREFIRE
-USE MODN_FOREFIRE
-#endif
-USE MODD_CONDSAMP
-USE MODD_BLOWSNOW
-USE MODN_DUST
-USE MODN_SALT
-USE MODD_CH_M9_n, ONLY : NEQ
-USE MODN_PASPOL
-USE MODN_CONDSAMP
-USE MODN_BLOWSNOW
-USE MODN_BLOWSNOW_n
-USE MODN_2D_FRC
+USE MODN_TURB_CLOUD
+USE MODN_TURB_n
 USE MODN_VISCOSITY
-USE MODD_VISCOSITY
-USE MODD_DRAG_n
-!
+
 IMPLICIT NONE
 !
 !*       0.1   declarations of arguments
@@ -593,32 +595,176 @@ IF (KMI == 1) THEN
   END IF
   CALL POSNAM(ILUSEG,'NAM_BUDGET',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BUDGET)
+
   CALL POSNAM(ILUSEG,'NAM_BU_RU',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RU)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RU ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RU was already allocated' )
+      DEALLOCATE( CBULIST_RU )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(NBULISTMAXLINES) )
+    CBULIST_RU(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RU)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RU(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RV was already allocated' )
+      DEALLOCATE( CBULIST_RV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(NBULISTMAXLINES) )
+    CBULIST_RV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RV(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RW',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RW)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RW ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RW was already allocated' )
+      DEALLOCATE( CBULIST_RW )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(NBULISTMAXLINES) )
+    CBULIST_RW(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RW)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RW(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RTH',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTH)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTH was already allocated' )
+      DEALLOCATE( CBULIST_RTH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(NBULISTMAXLINES) )
+    CBULIST_RTH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTH)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTH(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RTKE',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RTKE ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RTKE was already allocated' )
+      DEALLOCATE( CBULIST_RTKE )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(NBULISTMAXLINES) )
+    CBULIST_RTKE(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RTKE)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RTKE(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRV was already allocated' )
+      DEALLOCATE( CBULIST_RRV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(NBULISTMAXLINES) )
+    CBULIST_RRV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRV(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRC',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRC)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRC ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRC was already allocated' )
+      DEALLOCATE( CBULIST_RRC )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(NBULISTMAXLINES) )
+    CBULIST_RRC(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRC)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRC(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRR',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRR)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRR ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRR was already allocated' )
+      DEALLOCATE( CBULIST_RRR )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(NBULISTMAXLINES) )
+    CBULIST_RRR(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRR)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRR(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRI',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRI)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRI ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRI was already allocated' )
+      DEALLOCATE( CBULIST_RRI )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(NBULISTMAXLINES) )
+    CBULIST_RRI(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRI)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRI(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRS',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRS)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRS ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRS was already allocated' )
+      DEALLOCATE( CBULIST_RRS )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(NBULISTMAXLINES) )
+    CBULIST_RRS(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRS)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRS(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRG',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRG)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRG ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRG was already allocated' )
+      DEALLOCATE( CBULIST_RRG )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(NBULISTMAXLINES) )
+    CBULIST_RRG(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRG)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRG(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RRH',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RRH)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RRH ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RRH was already allocated' )
+      DEALLOCATE( CBULIST_RRH )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(NBULISTMAXLINES) )
+    CBULIST_RRH(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RRH)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RRH(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_BU_RSV',GFOUND,ILUOUT)
-  IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_BU_RSV)
+  IF (GFOUND) THEN
+    IF ( ALLOCATED( CBULIST_RSV ) ) THEN
+      CALL Print_msg( NVERB_WARNING, 'IO', 'READ_EXSEG_n', 'unexpected: CBULIST_RSV was already allocated' )
+      DEALLOCATE( CBULIST_RSV )
+    END IF
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(NBULISTMAXLINES) )
+    CBULIST_RSV(:) = ''
+    READ(UNIT=ILUSEG,NML=NAM_BU_RSV)
+  ELSE
+    ALLOCATE( CHARACTER(LEN=NBULISTMAXLEN) :: CBULIST_RSV(0) )
+  END IF
+
   CALL POSNAM(ILUSEG,'NAM_LES',GFOUND,ILUOUT)
   IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_LES)
   CALL POSNAM(ILUSEG,'NAM_MEAN',GFOUND,ILUOUT)
diff --git a/src/MNH/spawn_model2.f90 b/src/MNH/spawn_model2.f90
index 0f1a298d8116dd355397dc0e6270ad9b5b2e510d..82c8f1ecac1eb09d844ef9c48dd3e30a7b0e3d5e 100644
--- a/src/MNH/spawn_model2.f90
+++ b/src/MNH/spawn_model2.f90
@@ -199,6 +199,7 @@ END MODULE MODI_SPAWN_MODEL2
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
 !  P. Wautelet 09/03/2021: move some chemistry initializations to ini_nsv
+!  P. Wautelet 24/03/2021: bugfix: allocate XLSRVM, XINPAP and XACPAP to zero size when not needed
 !-------------------------------------------------------------------------------
 !
 !*       0.     DECLARATIONS
@@ -766,6 +767,8 @@ ALLOCATE(XLSWM(IIU,IJU,IKU))
 ALLOCATE(XLSTHM(IIU,IJU,IKU))
 IF ( NRR >= 1) THEN
   ALLOCATE(XLSRVM(IIU,IJU,IKU))
+ELSE
+  ALLOCATE(XLSRVM(0,0,0))
 ENDIF
                 !          LB fields for lbc coupling
 !
@@ -931,6 +934,9 @@ IF ( CCLOUD=='LIMA' .AND. LSCAV ) THEN
   ALLOCATE(XACPAP(IIU,IJU))
   XINPAP(:,:)=0.0
   XACPAP(:,:)=0.0  
+ELSE
+  ALLOCATE(XINPAP(0,0))
+  ALLOCATE(XACPAP(0,0))
 END IF
 !
 !        4.8bis electric variables  
diff --git a/src/MNH/spec_ver_int.f90 b/src/MNH/spec_ver_int.f90
index 5c7f1df0134ab9093a94c9ebb931e773bc1b6bdd..c09b57ffdfcc749dba786f4d11c2d47feb42ffe7 100644
--- a/src/MNH/spec_ver_int.f90
+++ b/src/MNH/spec_ver_int.f90
@@ -52,6 +52,7 @@ END MODULE MODI_SPEC_VER_INT
 !!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
 !  P. Wautelet 10/04/2019: replace ABORT and STOP calls by Print_msg
 !  P. Wautelet 05/01/2021: bugfix: CSPECTRA_LEVEL_TYPE='Z' computation was wrong
+!  P. Wautelet 30/03/2021: budgets: LES cartesian subdomain limits are defined in the physical domain
 ! --------------------------------------------------------------------------
 !       
 !*      0. DECLARATIONS
@@ -96,7 +97,7 @@ IF (CSPECTRA_LEVEL_TYPE=='N') THEN
   RETURN
 ELSE IF (CSPECTRA_LEVEL_TYPE=='K') THEN
   DO JK = 1, NSPECTRA_K
-    ZA(:,:,JK) = PA_MNH(:,:,NSPECTRA_LEVELS(JK))
+    ZA(:,:,JK) = PA_MNH(:,:,NSPECTRA_LEVELS(JK) + JPVEXT)
   END DO
 ELSE IF (CSPECTRA_LEVEL_TYPE=='Z') THEN
   ZA(:,:,:) = VER_INTERP_LIN(PA_MNH,NKLIN_CURRENT_SPEC,XCOEFLIN_CURRENT_SPEC)
@@ -121,7 +122,7 @@ CALL GATHERALL_FIELD_ll('XY',ZA,ZA_ll,IRESP)
 !
 !-------------------------------------------------------------------------------
 !
-PA_SPEC(:,:,:) = ZA_ll(NLESn_IINF(KMI):NLESn_ISUP(KMI),NLESn_JINF(KMI):NLESn_JSUP(KMI),:)
+PA_SPEC(:,:,:) = ZA_ll(NLESn_IINF(KMI)+JPHEXT:NLESn_ISUP(KMI)+JPHEXT,NLESn_JINF(KMI)+JPHEXT:NLESn_JSUP(KMI)+JPHEXT,:)
 !
 DO JK=1,SIZE(PA_SPEC,3)
   ZA_MEAN(JK) = SUM(PA_SPEC(:,:,JK)) / SIZE(PA_SPEC(:,:,JK))
diff --git a/src/MNH/write_aircraft_balloon.f90 b/src/MNH/write_aircraft_balloon.f90
index 2ff4254e6919fef020bc6b40a468b17011e74538..993ce2f91077560b34f1509d56bbf6b637145d2b 100644
--- a/src/MNH/write_aircraft_balloon.f90
+++ b/src/MNH/write_aircraft_balloon.f90
@@ -105,6 +105,7 @@ USE MODD_PARAM_LIMA     , ONLY: NINDICE_CCN_IMM,NMOD_CCN,NMOD_IFN,NMOD_IMM
 USE MODE_MODELN_HANDLER
 USE MODE_DUST_PSD
 USE MODE_AERO_PSD
+use mode_msg
 use mode_write_diachro,   only: Write_diachro
 !
 IMPLICIT NONE
@@ -855,6 +856,20 @@ tzbudiachro%cgroupname = ygroup
 tzbudiachro%cname      = ygroup
 tzbudiachro%ccomment   = 'Values at position of flyer ' // Trim( tpflyer%title )
 tzbudiachro%ctype      = 'RSPL'
+if ( Trim( tpflyer%type ) == 'AIRCRA' ) then
+  tzbudiachro%ccategory  = 'aircraft'
+else if ( Trim( tpflyer%type ) == 'RADIOS' ) then
+  tzbudiachro%ccategory  = 'radiosonde balloon'
+else if ( Trim( tpflyer%type ) == 'ISODEN' ) then
+  tzbudiachro%ccategory  = 'iso-density balloon'
+else if ( Trim( tpflyer%type ) == 'CVBALL' ) then
+  tzbudiachro%ccategory  = 'constant volume balloon'
+else
+  call Print_msg( NVERB_ERROR, 'IO', 'WRITE_AIRCRAFT_BALLOON', 'unknown category for flyer ' // Trim( tpflyer%title ) )
+  tzbudiachro%ccategory  = 'unknown'
+end if
+tzbudiachro%cshape     = 'point'
+tzbudiachro%lmobile    = .true.
 ! tzbudiachro%licompress = NOT SET (default values)
 ! tzbudiachro%ljcompress = NOT SET (default values)
 ! tzbudiachro%lkcompress = NOT SET (default values)
@@ -891,6 +906,9 @@ tzbudiachro%cgroupname = ygroupz
 tzbudiachro%cname      = ygroupz
 tzbudiachro%ccomment   = 'Vertical profiles at position of flyer ' // Trim( tpflyer%title )
 tzbudiachro%ctype      = 'CART'
+! tzbudiachro%ccategory  =  !unchanged
+tzbudiachro%cshape     = 'vertical profile'
+tzbudiachro%lmobile    = .true.
 tzbudiachro%licompress = .true.
 tzbudiachro%ljcompress = .true.
 tzbudiachro%lkcompress = .false.
diff --git a/src/MNH/write_budget.f90 b/src/MNH/write_budget.f90
index 72a9ec46ffa25a9c5644d90e1cbf28f9d2d843db..be4f2d5a2d56ce97923cd3cf146b6b3a04ba3816 100644
--- a/src/MNH/write_budget.f90
+++ b/src/MNH/write_budget.f90
@@ -559,6 +559,13 @@ subroutine Store_one_budget_rho( tpdiafile, tpdates, tprhodj, kp, knocompress, p
   tzbudiachro%cname      = tprhodj%cmnhname
   tzbudiachro%ccomment   = tprhodj%ccomment
   tzbudiachro%ctype      = ybutype
+  tzbudiachro%ccategory  = 'budget'
+  if ( ybutype == 'CART' ) then
+    tzbudiachro%cshape   = 'cartesian'
+  else
+    tzbudiachro%cshape   = 'mask'
+  end if
+  tzbudiachro%lmobile    = .false.
   tzbudiachro%licompress = lbu_icp
   tzbudiachro%ljcompress = lbu_jcp
   tzbudiachro%lkcompress = lbu_kcp
@@ -805,6 +812,13 @@ subroutine Store_one_budget( tpdiafile, tpdates, tpbudget, prhodjn, knocompress,
   tzbudiachro%cname      = tpbudget%cname
   tzbudiachro%ccomment   = tpbudget%ccomment
   tzbudiachro%ctype      = ybutype
+  tzbudiachro%ccategory  = 'budget'
+  if ( ybutype == 'CART' ) then
+    tzbudiachro%cshape   = 'cartesian'
+  else
+    tzbudiachro%cshape   = 'mask'
+  end if
+  tzbudiachro%lmobile    = .false.
   tzbudiachro%licompress = lbu_icp
   tzbudiachro%ljcompress = lbu_jcp
   tzbudiachro%lkcompress = lbu_kcp
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 50d7f1e446ea3b83fcec0338853eae7e9281f966..77c2c8eb61d7c7fa4e4f7c24ed161c6582b756c1 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -539,8 +539,9 @@ ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 3
   TZFIELD%LTIMEDEP   = .FALSE.
+  !TRAJX is given in extended domain coordinates (=> +jphext) for backward compatibility
   CALL IO_Field_write(tzfile,TZFIELD, Reshape( &
-                       Spread( source = ( nles_current_iinf + nles_current_isup) / 2, dim = 1, ncopies = IN ), &
+                       Spread( source = ( nles_current_iinf + nles_current_isup) / 2 + jphext, dim = 1, ncopies = IN ), &
                        [1, 1, IN] ) )
 ENDIF
 !
@@ -569,8 +570,9 @@ ELSE IF ( tpbudiachro%ctype == 'TLES' ) THEN
   TZFIELD%NTYPE      = TYPEREAL
   TZFIELD%NDIMS      = 3
   TZFIELD%LTIMEDEP   = .FALSE.
+  !TRAJY is given in extended domain coordinates (=> +jphext) for backward compatibility
   CALL IO_Field_write(tzfile,TZFIELD, Reshape( &
-                       Spread( source = ( nles_current_jinf + nles_current_jsup) / 2, dim = 1, ncopies = IN ), &
+                       Spread( source = ( nles_current_jinf + nles_current_jsup) / 2 + jphext, dim = 1, ncopies = IN ), &
                        [1, 1, IN] ) )
 ENDIF
 !
@@ -765,27 +767,27 @@ MASTER: if ( isp == tzfile%nmaster_rank) then
       call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'type for '//trim(ygroup)//' group' )
 
     if ( trim ( ytype ) == 'CART' .or. trim ( ytype ) == 'MASK' .or. trim ( ytype ) == 'SPXY') then
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min x index', iil )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min x index in physical domain', iil )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min x index for '//trim(ygroup)//' group' )
 
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max x index', iih )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max x index in physical domain', iih )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max x index for '//trim(ygroup)//' group' )
 
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min y index', ijl )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min y index in physical domain', ijl )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min y index for '//trim(ygroup)//' group' )
 
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max y index', ijh )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max y index in physical domain', ijh )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max y index for '//trim(ygroup)//' group' )
 
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min z index', ikl )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'min z index in physical domain', ikl )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'min z index for '//trim(ygroup)//' group' )
 
-      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max z index', ikh )
+      istatus = NF90_PUT_ATT( igrpid, NF90_GLOBAL, 'max z index in physical domain', ikh )
       if (istatus /= NF90_NOERR ) &
         call IO_Err_handle_nc4( istatus, 'Write_diachro_nc4', 'NF90_PUT_ATT', 'max z index for '//trim(ygroup)//' group' )
     end if
diff --git a/src/MNH/write_profilern.f90 b/src/MNH/write_profilern.f90
index eba14d51eefe087361d40342f1074f1888ef3ff0..e0ed5fcfd6b4bb0d8e4117996d9d8a85f67da5e1 100644
--- a/src/MNH/write_profilern.f90
+++ b/src/MNH/write_profilern.f90
@@ -654,6 +654,9 @@ tzbudiachro%cgroupname = ygroup
 tzbudiachro%cname      = ygroup
 tzbudiachro%ccomment   = 'Vertical profiles at position of profiler ' // Trim( ygroup )
 tzbudiachro%ctype      = 'CART'
+tzbudiachro%ccategory  = 'profiler'
+tzbudiachro%cshape     = 'vertical profile'
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .true.
 tzbudiachro%ljcompress = .true.
 tzbudiachro%lkcompress = .false.
diff --git a/src/MNH/write_seriesn.f90 b/src/MNH/write_seriesn.f90
index 1729e726dc566c4a82eb7e346b6e1328f609de71..e0aa67be2a6e3884202bd00288f5cbff50d3594c 100644
--- a/src/MNH/write_seriesn.f90
+++ b/src/MNH/write_seriesn.f90
@@ -263,15 +263,18 @@ tzbudiachro%cgroupname = 'TSERIES'
 tzbudiachro%cname      = 'TSERIES'
 tzbudiachro%ccomment   = 'Time series of horizontally and vertically averaged fields'
 tzbudiachro%ctype      = 'CART'
+tzbudiachro%ccategory  = 'time series'
+tzbudiachro%cshape     = 'cartesian' !It is based on a cartesian domain (with compression in all directions)
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .true.
 tzbudiachro%ljcompress = .true.
 tzbudiachro%lkcompress = .true.
-tzbudiachro%nil        = 1
-tzbudiachro%nih        = 1
-tzbudiachro%njl        = 1
-tzbudiachro%njh        = 1
+tzbudiachro%nil        = niboxl
+tzbudiachro%nih        = niboxh
+tzbudiachro%njl        = njboxl
+tzbudiachro%njh        = njboxh
 tzbudiachro%nkl        = 1
-tzbudiachro%nkh        = 1
+tzbudiachro%nkh        = ikmax
 
 call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), &
                     xsseries1(1:1,1:1,1:1,1:nsnbstept,1:1,:)                 )
@@ -355,15 +358,18 @@ tzbudiachro%cgroupname = 'ZTSERIES'
 tzbudiachro%cname      = 'ZTSERIES'
 tzbudiachro%ccomment   = 'Time series of horizontally averaged vertical profile'
 tzbudiachro%ctype      = 'CART'
+tzbudiachro%ccategory  = 'time series'
+tzbudiachro%cshape     = 'cartesian'  !It is based on a cartesian domain (with horizontal compression)
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .true.
 tzbudiachro%ljcompress = .true.
 tzbudiachro%lkcompress = .false.
-tzbudiachro%nil        = 1
-tzbudiachro%nih        = 1
-tzbudiachro%njl        = 1
-tzbudiachro%njh        = 1
-tzbudiachro%nkl        = ikb
-tzbudiachro%nkh        = ike
+tzbudiachro%nil        = niboxl
+tzbudiachro%nih        = niboxh
+tzbudiachro%njl        = njboxl
+tzbudiachro%njh        = njboxh
+tzbudiachro%nkl        = 1
+tzbudiachro%nkh        = ikmax
 
 call Write_diachro( tpdiafile, tzbudiachro, tzfields, tpsdates(1:nsnbstept), &
                     xsseries2(1:1,1:1,1:ikmax,1:nsnbstept,1:1,:)             )
@@ -451,6 +457,9 @@ DO JS=1,NBJSLICE
   tzbudiachro%cname      = ygroup
   tzbudiachro%ccomment   = 'Time series of y-horizontally averaged fields at one level or vertically averaged between 2 levels'
   tzbudiachro%ctype      = 'SSOL'
+  tzbudiachro%ccategory  = 'time series'
+  tzbudiachro%cshape     = 'cartesian' !It is based on a cartesian domain (with compression in 1 direction)
+  tzbudiachro%lmobile    = .false.
   tzbudiachro%licompress = .false.
   tzbudiachro%ljcompress = .true.
   tzbudiachro%lkcompress = .true.
diff --git a/src/MNH/write_stationn.f90 b/src/MNH/write_stationn.f90
index 2c6f6553ffdf971f184ffba397635e65cdff1032..ecacfb93518111d04e6787461c881bb4f14c4648 100644
--- a/src/MNH/write_stationn.f90
+++ b/src/MNH/write_stationn.f90
@@ -739,6 +739,9 @@ tzbudiachro%cgroupname = ygroup
 tzbudiachro%cname      = ygroup
 tzbudiachro%ccomment   = 'Values at position of station ' // Trim( ygroup )
 tzbudiachro%ctype      = 'CART'
+tzbudiachro%ccategory  = 'station'
+tzbudiachro%cshape     = 'point'
+tzbudiachro%lmobile    = .false.
 tzbudiachro%licompress = .true.
 tzbudiachro%ljcompress = .true.
 tzbudiachro%lkcompress = .false.