diff --git a/src/arome/aux/get_halo.F90 b/src/arome/aux/get_halo.F90
new file mode 100644
index 0000000000000000000000000000000000000000..443d33f13241e2a260c8c44e9368a58c57515ac9
--- /dev/null
+++ b/src/arome/aux/get_halo.F90
@@ -0,0 +1,33 @@
+!MNH_LIC Copyright 1994-2019 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.
+!-----------------------------------------------------------------
+! Modifications:
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!-----------------------------------------------------------------
+!     ####################
+      MODULE MODI_GET_HALO
+!     ####################
+!
+INTERFACE
+!
+SUBROUTINE GET_HALO(PSRC)
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+!
+END SUBROUTINE GET_HALO
+!
+END INTERFACE
+!
+END MODULE MODI_GET_HALO         
+!
+!-------------------------------------------------------------------------------
+!     #########################
+      SUBROUTINE GET_HALO(PSRC)
+!     #########################
+!
+REAL, DIMENSION(:,:,:), INTENT(IN)  :: PSRC    ! variable at t
+!
+END SUBROUTINE GET_HALO
+!-----------------------------------------------------------------------
diff --git a/src/arome/aux/modd_argslist_ll.F90 b/src/arome/aux/modd_argslist_ll.F90
new file mode 100644
index 0000000000000000000000000000000000000000..03db23cd5a89650e7edb31d43c3f24d97a602bec
--- /dev/null
+++ b/src/arome/aux/modd_argslist_ll.F90
@@ -0,0 +1,6 @@
+MODULE MODD_ARGSLIST_ll
+IMPLICIT NONE
+TYPE LIST_ll
+END TYPE LIST_ll
+CONTAINS
+END MODULE MODD_ARGSLIST_ll
diff --git a/src/arome/aux/modd_field.F90 b/src/arome/aux/modd_field.F90
new file mode 100644
index 0000000000000000000000000000000000000000..be5755c73358e0bfa715f4e4f4120b1a53364927
--- /dev/null
+++ b/src/arome/aux/modd_field.F90
@@ -0,0 +1,29 @@
+MODULE MODD_FIELD
+  USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN, NMNHNAMELGTMAX, NSTDNAMELGTMAX
+  INTEGER, PARAMETER :: NMNHDIM_UNKNOWN             = -2
+  INTEGER, PARAMETER :: NMNHMAXDIMS = 6 ! Cannot be less than 6
+  INTEGER,PARAMETER :: TYPEUNDEF = -1, TYPEINT = 1, TYPELOG = 2, TYPEREAL = 3, TYPECHAR = 4, TYPEDATE = 5
+!
+TYPE TFIELDDATA
+  CHARACTER(LEN=NMNHNAMELGTMAX) :: CMNHNAME  = '' !Name of the field (for MesoNH, non CF convention)
+  CHARACTER(LEN=NSTDNAMELGTMAX) :: CSTDNAME  = '' !Standard name (CF convention)
+  CHARACTER(LEN=32)  :: CLONGNAME = '' !Long name (CF convention)
+  CHARACTER(LEN=40)  :: CUNITS    = '' !Canonical units (CF convention)
+  CHARACTER(LEN=100) :: CCOMMENT  = '' !Comment (for MesoNH, non CF convention)
+  INTEGER            :: NGRID     = NGRIDUNKNOWN !Localization on the model grid
+  INTEGER            :: NTYPE     = TYPEUNDEF !Datatype
+  INTEGER            :: NDIMS     = 0  !Number of dimensions
+  INTEGER, DIMENSION(NMNHMAXDIMS) :: NDIMLIST = NMNHDIM_UNKNOWN ! List of dimensions of the data field
+  !
+  INTEGER            :: NFILLVALUE =  -2147483647            !Fill value for integer fields
+  REAL               :: XFILLVALUE =  9.9692099683868690e+36 !Fill value for real fields
+  INTEGER            :: NVALIDMIN  = -2147483646 !Minimum valid value for integer fields
+  INTEGER            :: NVALIDMAX  =  2147483647 !Maximum valid value for integer fields
+  REAL               :: XVALIDMIN  = -1.E36 !Minimum valid value for real fields
+  REAL               :: XVALIDMAX  =  1.E36 !Maximum valid value for real fields
+  CHARACTER(LEN=2)   :: CDIR      = '' !Type of the data field (XX,XY,--...)
+  CHARACTER(LEN=4)   :: CLBTYPE   = 'NONE' !Type of the lateral boundary (LBX,LBY,LBXU,LBYV)
+  LOGICAL            :: LTIMEDEP  = .FALSE. !Is the field time-dependent?
+END TYPE TFIELDDATA
+!
+END MODULE MODD_FIELD
diff --git a/src/arome/aux/mode_argslist_ll.F90 b/src/arome/aux/mode_argslist_ll.F90
new file mode 100644
index 0000000000000000000000000000000000000000..42eaf543e67b98ba9d5b03c4ac7c5b6f84aaf79c
--- /dev/null
+++ b/src/arome/aux/mode_argslist_ll.F90
@@ -0,0 +1,21 @@
+MODULE MODE_ARGSLIST_ll
+USE MODD_ARGSLIST_ll, ONLY : LIST_ll
+CONTAINS
+
+!
+  SUBROUTINE CLEANLIST_ll(TPLIST)
+IMPLICIT NONE
+
+    TYPE(LIST_ll),  POINTER :: TPLIST ! List of fields
+  END SUBROUTINE CLEANLIST_ll
+!
+  SUBROUTINE ADD3DFIELD_ll(TPLIST, PFIELD, HNAME)
+IMPLICIT NONE
+          
+    TYPE(LIST_ll), POINTER         :: TPLIST   ! list of fields
+    REAL, DIMENSION(:,:,:), TARGET :: PFIELD   ! field to be added to the list
+  !                                              of fields
+    character(len=*), intent(in) :: HNAME ! Name of the field to be added
+  !
+  END SUBROUTINE ADD3DFIELD_ll
+END MODULE MODE_ARGSLIST_ll
diff --git a/src/arome/aux/mode_io_field_write.F90 b/src/arome/aux/mode_io_field_write.F90
new file mode 100644
index 0000000000000000000000000000000000000000..39e6f7fec9a7603ad617ff3921ddc97eb788ae5a
--- /dev/null
+++ b/src/arome/aux/mode_io_field_write.F90
@@ -0,0 +1,15 @@
+MODULE MODE_IO_FIELD_WRITE
+USE MODD_IO,         ONLY: TFILEDATA
+USE MODD_FIELD, ONLY: TFIELDDATA
+CONTAINS
+SUBROUTINE IO_FIELD_WRITE(TPFILE,TZFIELD,PFIELD)
+    !
+    !*      0.1   Declarations of arguments
+    !
+    TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
+    TYPE(TFIELDDATA), INTENT(IN)          :: TZFIELD
+    REAL, DIMENSION(:,:,:),    INTENT(IN) :: PFIELD   ! array containing the data field
+    !
+END SUBROUTINE IO_FIELD_WRITE
+END MODULE MODE_IO_FIELD_WRITE
+
diff --git a/src/arome/aux/mode_ll.F90 b/src/arome/aux/mode_ll.F90
index 790a3acac9312351c098993143fe731baf8f60e7..030d629310c1918c8b3f7779ff880b31324457cc 100644
--- a/src/arome/aux/mode_ll.F90
+++ b/src/arome/aux/mode_ll.F90
@@ -1,4 +1,6 @@
 MODULE MODE_ll
+use mode_argslist_ll
+        
 IMPLICIT NONE
 CONTAINS
   SUBROUTINE GET_INDICE_ll(KXOR, KYOR, KXEND, KYEND, KSIZE1, KSIZE2)
@@ -11,4 +13,10 @@ CONTAINS
   KXEND=KSIZE1-JPHEXT
   KYEND=KSIZE2-JPHEXT
   END SUBROUTINE GET_INDICE_ll
+
+  SUBROUTINE UPDATE_HALO_ll(TPLIST, KINFO)
+  USE MODD_ARGSLIST_ll, ONLY : LIST_ll  
+  TYPE(LIST_ll), POINTER :: TPLIST ! pointer to the list of fields to be updated
+  INTEGER                :: KINFO  ! return status
+  END SUBROUTINE UPDATE_HALO_ll
 END MODULE MODE_ll
diff --git a/src/arome/micro/modd_parameters.F90 b/src/arome/micro/modd_parameters.F90
index 4a1ea98602b6c3ed50c1bb4db0c6c4a46c94d075..931c6fb588d2dd2b76e5cf631c94b93d5113c4ed 100644
--- a/src/arome/micro/modd_parameters.F90
+++ b/src/arome/micro/modd_parameters.F90
@@ -60,7 +60,21 @@ INTEGER, PARAMETER :: JPDUMMY  = 20   ! Size of dummy array
 !
 INTEGER, PARAMETER :: JPOUTMAX = 192 ! Maximum allowed number of OUTput files
 !
+INTEGER, PARAMETER :: NBUNAMELGTMAX  = 32  ! Maximum length of a budget name
+INTEGER, PARAMETER :: NCOMMENTLGTMAX = 100 ! Maximum length of a comment
+INTEGER, PARAMETER :: NMNHNAMELGTMAX = 32  ! Maximum length of a MNH variable name
+INTEGER, PARAMETER :: NSTDNAMELGTMAX = 64  ! Maximum length of the standard name of a variable (CF convention)
+!
+INTEGER, PARAMETER :: NDIRNAMELGTMAX = 512 ! Maximum length of a directory name
+INTEGER, PARAMETER :: NFILENAMELGTMAX = 32 ! Maximum length of a file name (must be at least NFILENAMELGTMAXLFI)
+INTEGER, PARAMETER :: NFILENAMELGTMAXLFI = 28 ! Maximum length of a file name in LFI file (this is necessary
+                                              ! to keep backward compatibility), MUST BE 28
+!
+INTEGER, PARAMETER :: NLFIMAXCOMMENTLENGTH = 100 ! Length of comments in LFI files
+!
 INTEGER, PARAMETER :: JPLIMACCNMAX = 10 ! Maximum allowed number of CCN modes in LIMA
 INTEGER, PARAMETER :: JPLIMAIFNMAX = 10 ! Maximum allowed number of IFN modes in LIMA
 !
+INTEGER, PARAMETER :: NGRIDUNKNOWN = -1 ! Unknown Arakawa grid number
+!
 END MODULE MODD_PARAMETERS
diff --git a/src/arome/turb/modi_tke_eps_sources.F90 b/src/arome/turb/modi_tke_eps_sources.F90
index 6df0247c32c30a5916e5d60446bbf8fd2b8e4b76..f15aacae111577715479d28b1660c0148e2704d5 100644
--- a/src/arome/turb/modi_tke_eps_sources.F90
+++ b/src/arome/turb/modi_tke_eps_sources.F90
@@ -3,22 +3,26 @@
 !     ###########################
 INTERFACE
 !
-      SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,PTRH,  &
-                     & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,             &
-                     & PTSTEP,PIMPL,PEXPL,                              &
-                     & HTURBLEN,HTURBDIM,                               &
-                     & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG,            &
-                  & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,      &
-                  & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH)
+      SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,  &
+                    & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,        &
+                    & PTSTEP,PIMPL,PEXPL,                              &
+                    & HTURBLEN,HTURBDIM,                               &
+                    & TPFILE,OTURB_DIAG,                               &
+                    & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,&
+                    & PEDR, YDDDH, YDLDDH, YDMDDH,TBUDGETS, KBUDGETS,  &
+                    & PTR,PDISS,PRTKESM                                )
 !
 USE DDH_MIX, ONLY : TYP_DDH
 USE YOMLDDH, ONLY : TLDDH
 USE YOMMDDH, ONLY : TMDDH
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_BUDGET, ONLY : TBUDGETDATA
 !
-INTEGER,                 INTENT(IN)   :: KKA      !near ground array index  
-INTEGER,                 INTENT(IN)   :: KKU      !uppest atmosphere array index
-INTEGER,                 INTENT(IN)   :: KKL      !vert. levels type 1=MNH -1=ARO
-INTEGER                               ::  KMI          ! model index number  
+INTEGER,                 INTENT(IN)   :: KKA           !near ground array index  
+INTEGER,                 INTENT(IN)   :: KKU           !uppest atmosphere array index
+INTEGER,                 INTENT(IN)   :: KKL           !vert. levels type 1=MNH -1=ARO
+
+INTEGER,                 INTENT(IN)   ::  KMI          ! model index number  
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PTKEM        ! TKE at t-deltat
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PLM          ! mixing length         
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PLEPS        ! dissipative length
@@ -26,33 +30,32 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PRHODJ       ! density * grid volume
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PDXX,PDYY,PDZZ,PDZX,PDZY
                                                        ! metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PZZ          ! physical height w-pt
-REAL,                    INTENT(IN)   ::  PTSTEP       ! Double Time step ( *.5 for
-                                                       ! the first time step ) 
+REAL,                    INTENT(IN)   ::  PTSTEP       ! Time step 
 REAL,                    INTENT(IN)   ::  PEXPL, PIMPL ! Coef. temporal. disc.
-CHARACTER*4,             INTENT(IN)   ::  HTURBDIM     ! dimensionality of the 
+CHARACTER(LEN=4),        INTENT(IN)   ::  HTURBDIM     ! dimensionality of the
                                                        ! turbulence scheme
-CHARACTER*4,             INTENT(IN)   ::  HTURBLEN     ! kind of mixing length 
-CHARACTER(LEN=*),        INTENT(IN)   ::  HFMFILE      ! Name of the output
-                                                       ! FM-file
-CHARACTER(LEN=*),        INTENT(IN)   ::  HLUOUT       ! Output-listing name for
-                                                       ! model n
-LOGICAL,                 INTENT(IN)   ::  OCLOSE_OUT   ! switch for syncronous
-                                                       ! file opening
+CHARACTER(LEN=4),        INTENT(IN)   ::  HTURBLEN     ! kind of mixing length
+TYPE(TFILEDATA),         INTENT(IN)   ::  TPFILE       ! Output file
 LOGICAL,                 INTENT(IN)   ::  OTURB_DIAG   ! switch to write some
                                   ! diagnostic fields in the syncronous FM-file
-REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PDP, PTRH          ! Dyn. prod. of TKE
-REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PTP          ! Ther. prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PDP          ! Dyn. prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PTRH
+REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PTP          ! Ther. prod. of TKE
 REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PRTKES       ! RHOD * Jacobian *
                                                        ! TKE at t+deltat
 REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PRTHLS       ! Source of Theta_l
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PCOEF_DISS   ! 1/(Cph*Exner)
-REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDIFF     ! Diffusion TKE term
-REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDISS     ! Dissipation TKE term
-
-REAL, DIMENSION(:,:,:),  INTENT(INOUT)   ::  PEDR      ! eddy dissipation rate
-TYPE(TYP_DDH),                       INTENT(INOUT) :: YDDDH
-TYPE(TLDDH),                       INTENT(IN) :: YDLDDH
-TYPE(TMDDH),                       INTENT(IN) :: YDMDDH
+REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDIFF       ! Diffusion TKE term
+REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDISS       ! Dissipation TKE term
+TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH
+TYPE(TLDDH), INTENT(IN) :: YDLDDH
+TYPE(TMDDH), INTENT(IN) :: YDMDDH
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+INTEGER, INTENT(IN) :: KBUDGETS
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PTR          ! Transport prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PDISS        ! Dissipation of TKE
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PEDR         ! EDR 
+REAL, DIMENSION(:,:,:),  INTENT(IN),  OPTIONAL  ::  PRTKESM      ! Advection source 
 !
 !
 !
diff --git a/src/arome/turb/modi_turb.F90 b/src/arome/turb/modi_turb.F90
index 2a15db137e613a63a888128d9abfb866c0d3eed8..c862c0824749fbcadb055863bb9d471619525ce2 100644
--- a/src/arome/turb/modi_turb.F90
+++ b/src/arome/turb/modi_turb.F90
@@ -22,9 +22,9 @@ INTERFACE
               & PHGRAD,PSIGS,                                         &
               & PDRUS_TURB,PDRVS_TURB,                                &
               & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB,                 &
-              & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,       &
-              & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH)
-
+              & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,PTDISS,&
+              & YDDDH,YDLDDH,YDMDDH,                                  &
+              & PTR,PDISS,PEDR                                        ) 
 !
 USE DDH_MIX, ONLY : TYP_DDH
 USE YOMLDDH, ONLY  : TLDDH
@@ -143,17 +143,17 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTP        ! Thermal TKE production
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTPMF      ! Thermal TKE production
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTDIFF     ! Diffusion TKE term
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTDISS     ! Dissipation TKE term
-
-REAL, DIMENSION(:,:,:),INTENT(OUT)   :: PEDR       ! eddy dissipation rate
-
+!
 REAL, DIMENSION(:,:,:), INTENT(IN)      ::  PLENGTHM 
 REAL, DIMENSION(:,:,:), INTENT(IN)      ::  PLENGTHH 
 !
-
 TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH
 TYPE(TLDDH),   INTENT(IN)    :: YDLDDH
 TYPE(TMDDH),   INTENT(IN)    :: YDMDDH
-
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  :: PTR   ! Transport production of TKE
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  :: PDISS ! Dissipation of TKE
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  ::  PEDR       ! EDR
 !
 !-------------------------------------------------------------------------------
 !
diff --git a/src/common/aux/modd_io.F90 b/src/common/aux/modd_io.F90
index c111e469fb3d2014b7021eb698d564a94f0cf413..56ae6db2b0feebb2decd74b3d29fafaa44a9d1e0 100644
--- a/src/common/aux/modd_io.F90
+++ b/src/common/aux/modd_io.F90
@@ -1,6 +1,34 @@
 MODULE MODD_IO
+USE MODD_PARAMETERS, ONLY: NFILENAMELGTMAX
+!
 IMPLICIT NONE
-
+!
 INTEGER, PARAMETER :: NVERB_NO=0, NVERB_FATAL=1, NVERB_ERROR=2, NVERB_WARNING=3, NVERB_INFO=4, NVERB_DEBUG=5
 INTEGER, SAVE :: N_ABORT_LEVEL = NVERB_ERROR
+!
+!Structure describing the characteristics of a file
+TYPE TFILEDATA
+  CHARACTER(LEN=NFILENAMELGTMAX) :: CNAME = '' !Filename
+  CHARACTER(LEN=:),ALLOCATABLE   :: CDIRNAME   !Directory name
+  CHARACTER(LEN=13) :: CTYPE   = "UNKNOWN" !Filetype (PGD, MNH, DES, NML...)
+  CHARACTER(LEN=7)  :: CFORMAT = "UNKNOWN" !Fileformat (NETCDF4, LFI, LFICDF4...)
+  CHARACTER(LEN=7)  :: CMODE   = "UNKNOWN" !Opening mode (read, write...)
+  LOGICAL           :: LOPENED = .FALSE.   !Is the file opened
+  INTEGER           :: NOPEN_CURRENT = 0   !Number of times the file is currently opened (several opens without close are allowed)
+  INTEGER           :: NOPEN   = 0         !Number of times the file has been opened (during the current execution)
+  INTEGER           :: NCLOSE  = 0         !Number of times the file has been closed (during the current execution)
+  !
+  INTEGER           :: NMASTER_RANK  = -1      !Rank of the master process (no meaning if LMULTIMASTERS=.T.)
+  INTEGER           :: NMPICOMM      = -1      !MPI communicator used for IO on this file
+  LOGICAL           :: LMASTER       = .FALSE. !True if process is master of the file (process that open/read/write/close)
+  LOGICAL           :: LMULTIMASTERS = .FALSE. !True if several processes may access the file
+  INTEGER           :: NSUBFILES_IOZ = 0       !Number of sub-files (Z-split files based on this file)
+                                               !For example if 2 sub-files and this file is abcd,
+                                               !the 2 sub-files are abcd.Z001 and abcd.Z002
+!  TYPE(TFILE_ELT),DIMENSION(:),ALLOCATABLE :: TFILES_IOZ !Corresponding Z-split files
+  !
+  INTEGER              :: NMODEL = 0              !Model number corresponding to the file (field not always set)
+  INTEGER,DIMENSION(3) :: NMNHVERSION = (/0,0,0/) !MesoNH version used to create the file
+  !
+END TYPE TFILEDATA
 ENDMODULE MODD_IO
diff --git a/src/arome/turb/tke_eps_sources.F90 b/src/common/turb/tke_eps_sources.F90
similarity index 65%
rename from src/arome/turb/tke_eps_sources.F90
rename to src/common/turb/tke_eps_sources.F90
index 672987f182e17653c639b6206b88e93acd184127..72ed8b202d12285f91b50a841ff8dfdd9e66810c 100644
--- a/src/arome/turb/tke_eps_sources.F90
+++ b/src/common/turb/tke_eps_sources.F90
@@ -1,13 +1,17 @@
+!MNH_LIC Copyright 1994-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.
+!-----------------------------------------------------------------
 !     ######spl
       SUBROUTINE TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,PLM,PLEPS,PDP,  &
                     & PTRH,PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,        &
                     & PTSTEP,PIMPL,PEXPL,                              &
                     & HTURBLEN,HTURBDIM,                               &
-                    & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG,            &
-                 & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS, &
-                 & PEDR,YDDDH, YDLDDH, YDMDDH)
-      USE PARKIND1, ONLY : JPRB
-      USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+                    & TPFILE,OTURB_DIAG,                               &
+                    & PTP,PRTKES,PRTHLS,PCOEF_DISS,PTDIFF,PTDISS,&
+                    & PEDR, YDDDH, YDLDDH, YDMDDH, TBUDGETS, KBUDGETS, &
+                    & PTR,PDISS,PRTKESM                                )
 !     ##################################################################
 !
 !
@@ -68,7 +72,6 @@
 !!                          'CART' for cartesian box configuration
 !!                          'MASK' for budget zone defined by a mask 
 !!                          'NONE'  ' for no budget
-!!         NBUPROCCTR   : process counter used for each budget variable
 !!         LBU_RTKE     : logical for budget of RTKE (turbulent kinetic energy)
 !!                        .TRUE. = budget of RTKE       
 !!                        .FALSE. = no budget of RTKE
@@ -112,35 +115,48 @@
 !!                                    vertical levels
 !!                     2014-11 Y. Seity,  add output terms for TKE DDHs budgets
 !! --------------------------------------------------------------------------
+!!                     2015-01 (J. Escobar) missing get_halo(ZRES) for JPHEXT<> 1 
+!!     J.Escobar : 15/09/2015 : WENO5 & JPHEXT <> 1 
+!!  Philippe Wautelet: 05/2016-04/2018: new data structures and calls for I/O
+!  P. Wautelet 20/05/2019: add name argument to ADDnFIELD_ll + new ADD4DFIELD_ll subroutine
+!  P. Wautelet    02/2020: use the new data structures and subroutines for budgets
+! --------------------------------------------------------------------------
 !
 !*       0.   DECLARATIONS
 !             ------------
 !
-USE MODD_CST
+USE PARKIND1, ONLY : JPRB
+USE YOMHOOK , ONLY : LHOOK, DR_HOOK
+!
+USE MODD_ARGSLIST_ll,    ONLY: LIST_ll
+USE MODD_BUDGET, ONLY: LBUDGET_TKE, LBUDGET_TH, NBUDGET_TKE, NBUDGET_TH, TBUDGETDATA
 USE MODD_CONF
+USE MODD_CST
 USE MODD_CTURB
-USE MODD_PARAMETERS
-USE MODD_BUDGET
-USE MODD_LES
 USE MODD_DIAG_IN_RUN, ONLY : LDIAG_IN_RUN, XCURRENT_TKE_DISS
+USE MODD_FIELD, ONLY: TFIELDDATA, TYPEREAL
+USE MODD_IO, ONLY: TFILEDATA
+USE MODD_LES
+USE MODD_PARAMETERS
+!
+USE MODE_BUDGET, ONLY: BUDGET_STORE_ADD, BUDGET_STORE_END, BUDGET_STORE_INIT
+USE MODE_IO_FIELD_WRITE, ONLY: IO_FIELD_WRITE
+USE MODE_ll
 !
+USE MODI_GET_HALO
 USE MODI_GRADIENT_M
 USE MODI_GRADIENT_U
 USE MODI_GRADIENT_V
 USE MODI_GRADIENT_W
-USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF
-USE MODI_TRIDIAG 
-USE MODI_TRIDIAG_TKE
 USE MODI_BUDGET_DDH
-USE MODE_FMWRIT
 USE MODI_LES_MEAN_SUBGRID
+USE MODI_TRIDIAG_TKE
+USE MODI_SHUMAN , ONLY : DZM, DZF, MZM, MZF
 !
 USE DDH_MIX, ONLY  : TYP_DDH
 USE YOMLDDH, ONLY  : TLDDH
 USE YOMMDDH, ONLY  : TMDDH
 !
-!!!!!AROME!!USE MODE_ll
-!!!!!AROME!!USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 !
 IMPLICIT NONE
 !
@@ -160,32 +176,32 @@ REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PRHODJ       ! density * grid volume
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PDXX,PDYY,PDZZ,PDZX,PDZY
                                                        ! metric coefficients
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PZZ          ! physical height w-pt
-REAL,                    INTENT(IN)   ::  PTSTEP       ! Double Time step ( *.5 for
-                                                       ! the first time step ) 
+REAL,                    INTENT(IN)   ::  PTSTEP       ! Time step 
 REAL,                    INTENT(IN)   ::  PEXPL, PIMPL ! Coef. temporal. disc.
-CHARACTER*4,             INTENT(IN)   ::  HTURBDIM     ! dimensionality of the 
+CHARACTER(LEN=4),        INTENT(IN)   ::  HTURBDIM     ! dimensionality of the
                                                        ! turbulence scheme
-CHARACTER*4,             INTENT(IN)   ::  HTURBLEN     ! kind of mixing length 
-CHARACTER(LEN=*),        INTENT(IN)   ::  HFMFILE      ! Name of the output
-                                                       ! FM-file
-CHARACTER(LEN=*),        INTENT(IN)   ::  HLUOUT       ! Output-listing name for
-                                                       ! model n
-LOGICAL,                 INTENT(IN)   ::  OCLOSE_OUT   ! switch for syncronous
-                                                       ! file opening
+CHARACTER(LEN=4),        INTENT(IN)   ::  HTURBLEN     ! kind of mixing length
+TYPE(TFILEDATA),         INTENT(IN)   ::  TPFILE       ! Output file
 LOGICAL,                 INTENT(IN)   ::  OTURB_DIAG   ! switch to write some
                                   ! diagnostic fields in the syncronous FM-file
-REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PDP, PTRH          ! Dyn. prod. of TKE
-REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PTP          ! Ther. prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PDP          ! Dyn. prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PTRH
+REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PTP          ! Ther. prod. of TKE
 REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PRTKES       ! RHOD * Jacobian *
                                                        ! TKE at t+deltat
 REAL, DIMENSION(:,:,:),  INTENT(INOUT)::  PRTHLS       ! Source of Theta_l
 REAL, DIMENSION(:,:,:),  INTENT(IN)   ::  PCOEF_DISS   ! 1/(Cph*Exner)
-REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDIFF     ! Diffusion TKE term
-REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDISS     ! Dissipation TKE term
-REAL, DIMENSION(:,:,:),  INTENT(OUT)   ::  PEDR         ! EDR 
+REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDIFF       ! Diffusion TKE term
+REAL, DIMENSION(:,:,:),  INTENT(OUT)  ::  PTDISS       ! Dissipation TKE term
 TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH
 TYPE(TLDDH), INTENT(IN) :: YDLDDH
 TYPE(TMDDH), INTENT(IN) :: YDMDDH
+TYPE(TBUDGETDATA), DIMENSION(KBUDGETS), INTENT(INOUT) :: TBUDGETS
+INTEGER, INTENT(IN) :: KBUDGETS
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PTR          ! Transport prod. of TKE
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PDISS        ! Dissipation of TKE
+REAL, DIMENSION(:,:,:),  INTENT(OUT), OPTIONAL  ::  PEDR         ! EDR 
+REAL, DIMENSION(:,:,:),  INTENT(IN),  OPTIONAL  ::  PRTKESM      ! Advection source 
 !
 !
 !
@@ -200,45 +216,40 @@ REAL, DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3))::         &
                    ! temporarily store some diagnostics stored in FM file
        ZFLX,     & ! horizontal or vertical flux of the treated variable
        ZSOURCE,  & ! source of evolution for the treated variable
-       ZTR,      & ! turbulent transport of TKE 
-       ZKEFF       ! effectif diffusion coeff = LT * SQRT( TKE )
+       ZKEFF,    & ! effectif diffusion coeff = LT * SQRT( TKE )
+       ZTR,ZRTKESM ! Transport term and Advective TKE source 
 LOGICAL,DIMENSION(SIZE(PTKEM,1),SIZE(PTKEM,2),SIZE(PTKEM,3)) :: GTKENEG
                    ! 3D mask .T. if TKE < XTKEMIN
 INTEGER             :: IIB,IIE,IJB,IJE,IKB,IKE
                                     ! Index values for the Beginning and End
                                     ! mass points of the domain 
 INTEGER             :: IIU,IJU,IKU  ! array size in the 3 dimensions 
-INTEGER             :: IRESP        ! Return code of FM routines
-INTEGER             :: IGRID        ! C-grid indicator in LFIFM file
-INTEGER             :: ILENCH       ! Length of comment string in LFIFM file
-CHARACTER (LEN=100) :: YCOMMENT     ! comment string in LFIFM file
-CHARACTER (LEN=16)  :: YRECFM       ! Name of the desired field in LFIFM file
 !
-!!!!!AROME!!TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange
-!!!!!AROME!!INTEGER                :: IINFO_ll       ! return code of parallel routine
+TYPE(LIST_ll), POINTER :: TZFIELDDISS_ll ! list of fields to exchange
+INTEGER                :: IINFO_ll       ! return code of parallel routine
+TYPE(TFIELDDATA) :: TZFIELD
+REAL(KIND=JPRB) :: ZHOOK_HANDLE
 !
-
 !----------------------------------------------------------------------------
-!!!!!AROME!!NULLIFY(TZFIELDDISS_ll)
+NULLIFY(TZFIELDDISS_ll)
 !
 !*       1.   PRELIMINARY COMPUTATIONS
 !             ------------------------
 !
-!
-REAL(KIND=JPRB) :: ZHOOK_HANDLE
+
 IF (LHOOK) CALL DR_HOOK('TKE_EPS_SOURCES',0,ZHOOK_HANDLE)
-IIB=1+JPHEXT
+!
 IIU=SIZE(PTKEM,1)
-IIE=IIU-JPHEXT
-IJB=1+JPHEXT
 IJU=SIZE(PTKEM,2)
-IJE=IJU-JPHEXT
+CALL GET_INDICE_ll (IIB,IJB,IIE,IJE,IIU,IJU)
 IKB=KKA+JPVEXT_TURB*KKL
 IKE=KKU-JPVEXT_TURB*KKL
 !
 ! compute the effective diffusion coefficient at the mass point
 ZKEFF(:,:,:) = PLM(:,:,:) * SQRT(PTKEM(:,:,:)) 
 !
+!IF (LBUDGET_TH)  CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TH),  'DISSH', PRTHLS(:, :, :) )
+!
 !----------------------------------------------------------------------------
 !
 !*       2.   TKE EQUATION  
@@ -259,6 +270,12 @@ END IF
 !
 !*       2.2  Explicit TKE sources except horizontal turbulent transport 
 !
+! Advection source (=0 in AROME)
+IF(PRESENT(PRTKESM)) THEN
+  ZRTKESM=PRTKESM
+ELSE
+  ZRTKESM=0.
+END IF
 !
 ! extrapolate the dynamic production with a 1/Z law from its value at the 
 ! W(IKB+1) value stored in PDP(IKB) to the mass localization tke(IKB)
@@ -267,7 +284,8 @@ PDP(:,:,IKB) = PDP(:,:,IKB) * (1. + PDZZ(:,:,IKB+KKL)/PDZZ(:,:,IKB))
 ! Compute the source terms for TKE: ( ADVECtion + NUMerical DIFFusion + ..)
 ! + (Dynamical Production) + (Thermal Production) - (dissipation) 
 ZFLX(:,:,:) = XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:)
-ZSOURCE(:,:,:) = PRTKES(:,:,:) / PRHODJ(:,:,:) - PTKEM(:,:,:) / PTSTEP &
+ZSOURCE(:,:,:) = ( PRTKES(:,:,:) +  ZRTKESM(:,:,:) ) / PRHODJ(:,:,:) &
+   - PTKEM(:,:,:) / PTSTEP &
    + PDP(:,:,:) + PTP(:,:,:) + ZTR(:,:,:) - PEXPL * ZFLX(:,:,:) * PTKEM(:,:,:)
 !
 !*       2.2  implicit vertical TKE transport
@@ -283,28 +301,30 @@ ZA(:,:,:)     = - PTSTEP * XCET * &
 !
 CALL TRIDIAG_TKE(KKA,KKU,KKL,PTKEM,ZA,PTSTEP,PEXPL,PIMPL,PRHODJ,&
             & ZSOURCE,PTSTEP*ZFLX,ZRES)
+CALL GET_HALO(ZRES)
 !
 !* diagnose the dissipation
 !
 IF (LDIAG_IN_RUN) THEN
   XCURRENT_TKE_DISS = ZFLX(:,:,:) * PTKEM(:,:,:) &
                                   *(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:))
-!!!!!AROME!!  CALL ADD3DFIELD_ll(TZFIELDDISS_ll,XCURRENT_TKE_DISS)
-!!!!!AROME!!  CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll)
-!!!!!AROME!!  CALL CLEANLIST_ll(TZFIELDDISS_ll)
+  CALL ADD3DFIELD_ll( TZFIELDDISS_ll, XCURRENT_TKE_DISS, 'TKE_EPS_SOURCES::XCURRENT_TKE_DISS' )
+  CALL UPDATE_HALO_ll(TZFIELDDISS_ll,IINFO_ll)
+  CALL CLEANLIST_ll(TZFIELDDISS_ll)
 ENDIF
 !
 ! TKE must be greater than its minimum value
-!
-GTKENEG =  ZRES <= XTKEMIN 
-WHERE ( GTKENEG ) 
-  ZRES = XTKEMIN
-END WHERE
-
+! CL : Now done at the end of the time step in ADVECTION_METSV for MesoNH
+IF(CPROGRAM/='MESONH') THEN
+ GTKENEG =  ZRES <= XTKEMIN 
+ WHERE ( GTKENEG ) 
+   ZRES = XTKEMIN
+ END WHERE
+END IF
 PTDISS(:,:,:) = - ZFLX(:,:,:)*(PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:))
 !
 IF ( LLES_CALL .OR.                         &
-     (OTURB_DIAG .AND. OCLOSE_OUT)  ) THEN
+     (OTURB_DIAG .AND. TPFILE%LOPENED)  ) THEN
 !
 ! Compute the cartesian vertical flux of TKE in ZFLX
 !
@@ -330,38 +350,37 @@ END IF
 !
 !*       2.4  stores the explicit sources for budget purposes
 !
-IF (LBUDGET_TKE) THEN
-!
-! add the dynamical production
-!
-  PRTKES(:,:,:) = PRTKES(:,:,:) + PDP(:,:,:) * PRHODJ(:,:,:)
-  CALL BUDGET_DDH (PRTKES(:,:,:),5,'DP_BU_RTKE',YDDDH, YDLDDH, YDMDDH)
-!
-! add the thermal production
-!
-  PRTKES(:,:,:) = PRTKES(:,:,:) + PTP(:,:,:) * PRHODJ(:,:,:)
-  CALL BUDGET_DDH (PRTKES(:,:,:),5,'TP_BU_RTKE',YDDDH, YDLDDH, YDMDDH)
-!
-! add the dissipation
-!
-PRTKES(:,:,:) = PRTKES(:,:,:) - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * &
-                (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:)
-CALL BUDGET_DDH (PRTKES(:,:,:),5,'DISS_BU_RTKE',YDDDH, YDLDDH, YDMDDH)
-END IF 
+!IF (LBUDGET_TKE) THEN
+  ! Dynamical production
+!  CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DP', PDP(:, :, :) * PRHODJ(:, :, :) )
+  ! Thermal production
+!  CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'TP', PTP(:, :, :) * PRHODJ(:, :, :) )
+  ! Dissipation
+!  CALL BUDGET_STORE_ADD( TBUDGETS(NBUDGET_TKE), 'DISS',- XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * &
+!                (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:))
+!END IF 
 !
 !*       2.5  computes the final RTKE and stores the whole turbulent transport
-!
+!              with the removal of the advection part for MesoNH
+
 PTDIFF(:,:,:) =  ZRES(:,:,:) / PTSTEP - PRTKES(:,:,:)/PRHODJ(:,:,:) &
  & - PDP(:,:,:)- PTP(:,:,:) - PTDISS(:,:,:)
 
-PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP
+IF (LBUDGET_TKE) THEN
+  !Store the previous source terms in prtkes before initializing the next one
+  PRTKES(:,:,:) = PRTKES(:,:,:) + PRHODJ(:,:,:) *                                                           &
+                  ( PDP(:,:,:) + PTP(:,:,:)                                                                 &
+                    - XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * ( PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:) ) )
+
+!  CALL BUDGET_STORE_INIT( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) )
+END IF
 
+PRTKES(:,:,:) = ZRES(:,:,:) * PRHODJ(:,:,:) / PTSTEP -  ZRTKESM(:,:,:)
 !
 ! stores the whole turbulent transport
 !
-IF (LBUDGET_TKE) CALL BUDGET_DDH (PRTKES(:,:,:),5,'TR_BU_RTKE',YDDDH, YDLDDH, YDMDDH)
-!
-!
+!IF (LBUDGET_TKE) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TKE), 'TR', PRTKES(:, :, :) )
+
 !----------------------------------------------------------------------------
 !
 !*       3.   COMPUTE THE DISSIPATIVE HEATING
@@ -369,60 +388,84 @@ IF (LBUDGET_TKE) CALL BUDGET_DDH (PRTKES(:,:,:),5,'TR_BU_RTKE',YDDDH, YDLDDH, YD
 !
 PRTHLS(:,:,:) = PRTHLS(:,:,:) + XCED * SQRT(PTKEM(:,:,:)) / PLEPS(:,:,:) * &
                 (PEXPL*PTKEM(:,:,:) + PIMPL*ZRES(:,:,:)) * PRHODJ(:,:,:) * PCOEF_DISS(:,:,:)
-!
+
+!IF (LBUDGET_TH) CALL BUDGET_STORE_END( TBUDGETS(NBUDGET_TH), 'DISSH', PRTHLS(:, :, :) )
+
 !----------------------------------------------------------------------------
 !
 !*       4.   STORES SOME DIAGNOSTICS
 !             -----------------------
 !
-PEDR(:,:,:)=XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
-
-
-
-IF ( OTURB_DIAG .AND. OCLOSE_OUT ) THEN
+IF(PRESENT(PDISS)) PDISS(:,:,:) =  -XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
+IF(PRESENT(PTR)) PTR=ZTR
+IF(PRESENT(PEDR)) PEDR = XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:)
+!
+IF ( OTURB_DIAG .AND. TPFILE%LOPENED ) THEN
 !
 ! stores the dynamic production 
 !
-  YRECFM  ='DP'
-  YCOMMENT='X_Y_Z_DP (M**2/S**3)'
-  IGRID   = 1
-  ILENCH=LEN(YCOMMENT) 
-  CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PDP,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'DP'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'DP'
+  TZFIELD%CUNITS     = 'm2 s-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_DP'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDP)
 !
 ! stores the thermal production 
 !
-  YRECFM  ='TP'
-  YCOMMENT='X_Y_Z_TP (M**2/S**3)'
-  IGRID   = 1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',PTP,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'TP'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'TP'
+  TZFIELD%CUNITS     = 'm2 s-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_TP'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PTP)
 !
 ! stores the whole turbulent transport
 !
-  YRECFM  ='TR'
-  YCOMMENT='X_Y_Z_TR (M**2/S**3)'
-  IGRID   = 1
-  ILENCH=LEN(YCOMMENT)
-  CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZTR,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'TR'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'TR'
+  TZFIELD%CUNITS     = 'm2 s-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_TR'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_FIELD_WRITE(TPFILE,TZFIELD,ZTR)
 !
 ! stores the dissipation of TKE 
 !
-  YRECFM  ='DISS'
-  YCOMMENT='X_Y_Z_DISS (M**2/S**3)'
-  IGRID   = 1
-  ILENCH=LEN(YCOMMENT)
-  ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) 
-  CALL FMWRIT(HFMFILE,YRECFM,HLUOUT,'XY',ZFLX,IGRID,ILENCH,YCOMMENT,IRESP)
+  TZFIELD%CMNHNAME   = 'DISS'
+  TZFIELD%CSTDNAME   = ''
+  TZFIELD%CLONGNAME  = 'DISS'
+  TZFIELD%CUNITS     = 'm2 s-3'
+  TZFIELD%CDIR       = 'XY'
+  TZFIELD%CCOMMENT   = 'X_Y_Z_DISS'
+  TZFIELD%NGRID      = 1
+  TZFIELD%NTYPE      = TYPEREAL
+  TZFIELD%NDIMS      = 3
+  TZFIELD%LTIMEDEP   = .TRUE.
+  CALL IO_FIELD_WRITE(TPFILE,TZFIELD,PDISS)
 END IF
 !
 ! Storage in the LES configuration of the Dynamic Production of TKE and
 ! the dissipation of TKE 
 ! 
 IF (LLES_CALL ) THEN
-  ZFLX(:,:,:) =-XCED * (PTKEM(:,:,:)**1.5) / PLEPS(:,:,:) 
-  CALL LES_MEAN_SUBGRID( ZFLX, X_LES_SUBGRID_DISS_Tke )
+  CALL LES_MEAN_SUBGRID( PDISS, X_LES_SUBGRID_DISS_Tke )
 END IF
-! 
+!
 !----------------------------------------------------------------------------
 ! 
 !
diff --git a/src/arome/turb/turb.F90 b/src/common/turb/turb.F90
similarity index 97%
rename from src/arome/turb/turb.F90
rename to src/common/turb/turb.F90
index 68fec59f897017987d8cc13e0546e88f392ca912..aadb72fca2afe8c5b9f188777276bfcddef28682 100644
--- a/src/arome/turb/turb.F90
+++ b/src/common/turb/turb.F90
@@ -17,8 +17,9 @@
               & PHGRAD, PSIGS,                                        &
               & PDRUS_TURB,PDRVS_TURB,                                &
               & PDRTHLS_TURB,PDRRTS_TURB,PDRSVS_TURB,                 &
-              & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,       &
-              & PTDISS,PEDR,YDDDH,YDLDDH,YDMDDH)
+              & PFLXZTHVMF,PWTH,PWRC,PWSV,PDP,PTP,PTPMF,PTDIFF,PTDISS,&
+              & YDDDH,YDLDDH,YDMDDH,                                  &
+              & PTR,PDISS,PEDR                                        )
 
       USE PARKIND1, ONLY : JPRB
       USE YOMHOOK , ONLY : LHOOK, DR_HOOK
@@ -223,6 +224,7 @@ USE MODD_CST
 USE MODD_CTURB
 USE MODD_CONF
 USE MODD_BUDGET
+USE MODD_IO, ONLY: TFILEDATA
 USE MODD_LES
 USE MODD_NSV
 !
@@ -375,17 +377,17 @@ REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTPMF      ! Thermal TKE production
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PDP        ! Dynamic TKE production
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTDIFF     ! Diffusion TKE term
 REAL, DIMENSION(:,:,:), INTENT(OUT)  :: PTDISS     ! Dissipation TKE term
-
-
-REAL, DIMENSION(:,:,:),   INTENT(OUT) ::  PEDR       ! EDR
-
-TYPE(TYP_DDH), INTENT(INOUT) :: YDDDH
-TYPE(TLDDH),   INTENT(IN)    :: YDLDDH
-TYPE(TMDDH),   INTENT(IN)    :: YDMDDH
+!
+TYPE(TYP_DDH), INTENT(INOUT), TARGET :: YDDDH
+TYPE(TLDDH),   INTENT(IN), TARGET    :: YDLDDH
+TYPE(TMDDH),   INTENT(IN), TARGET    :: YDMDDH
 !
 ! length scale from vdfexcu
 REAL, DIMENSION(:,:,:), INTENT(IN)    :: PLENGTHM, PLENGTHH
-
+!
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  :: PTR   ! Transport production of TKE
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  :: PDISS ! Dissipation of TKE
+REAL, DIMENSION(:,:,:), INTENT(OUT), OPTIONAL  ::  PEDR       ! EDR
 !
 !
 !-------------------------------------------------------------------------------
@@ -445,6 +447,10 @@ REAL                :: ZL0          ! Max. Mixing Length in Blakadar formula
 REAL                :: ZALPHA       ! proportionnality constant between Dz/2 and 
 !                                   ! BL89 mixing length near the surface
 !
+!
+TYPE(TFILEDATA) :: TPFILE ! File type to write fields for MesoNH
+TYPE(TBUDGETDATA), DIMENSION(NBUDGET_RH) :: YLBUDGET !NBUDGET_RH is the one with the highest number
+!
 REAL :: ZTIME1, ZTIME2
 REAL, DIMENSION(SIZE(PUT,1),SIZE(PUT,2),SIZE(PUT,3))::  ZSHEAR, ZDUDZ, ZDVDZ
 !
@@ -463,6 +469,12 @@ IF (LHARAT .AND. LLES_CALL) THEN
   CALL ABOR1('LHARATU not implemented for option LLES_CALL')
 ENDIF
 
+DO JRR=1, NBUDGET_RH
+  YLBUDGET(JRR)%NBUDGET=JRR
+  YLBUDGET(JRR)%YDDDH=>YDDDH
+  YLBUDGET(JRR)%YDLDDH=>YDLDDH
+  YLBUDGET(JRR)%YDMDDH=>YDMDDH
+ENDDO
 
 IKT=SIZE(PTHLM,3)          
 IKTB=1+JPVEXT_TURB              
@@ -481,7 +493,7 @@ ZRM(:,:,:,:) = PRM(:,:,:,:)
 !
 !----------------------------------------------------------------------------
 !
-!*      2. COMPUTE CONSERVATIVE VARIABLES AND RELATED QUANTITIES
+!*      2. COMPUTE CONSERVATIVE VARIABLES AE0___PROC1 et Q0___PROC1ND RELATED QUANTITIES
 !          -----------------------------------------------------
 !
 !*      2.1 Cph at t
@@ -914,14 +926,14 @@ IF (LBUDGET_RI) CALL BUDGET_DDH (PRRS(:,:,:,4),9,'HTURB_BU_RRI',YDDDH, YDLDDH, Y
 
 IF (.NOT. LHARAT) THEN
 
-
 CALL TKE_EPS_SOURCES(KKA,KKU,KKL,KMI,PTKEM,ZLM,ZLEPS,PDP,ZTRH,       &
                    & PRHODJ,PDZZ,PDXX,PDYY,PDZX,PDZY,PZZ,            &
                    & PTSTEP_MET,PIMPL,ZEXPL,                         &
                    & HTURBLEN,HTURBDIM,                              &
-                   & HFMFILE,HLUOUT,OCLOSE_OUT,OTURB_DIAG,           &
-                & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,     &
-                & PTDISS,PEDR,YDDDH, YDLDDH, YDMDDH)
+                   & TPFILE,OTURB_DIAG,           &
+                & PTP,PRTKES,PRTHLS,ZCOEF_DISS,PTDIFF,PTDISS,&
+                & PEDR, YDDDH, YDLDDH, YDMDDH,                       &
+TBUDGETS=YLBUDGET, KBUDGETS=SIZE(YLBUDGET))
 IF (LBUDGET_TH)  THEN
   IF ( KRRI >= 1 .AND. KRRL >= 1 ) THEN
     CALL BUDGET_DDH (PRTHLS+ ZLVOCPEXNM * PRRS(:,:,:,2) + ZLSOCPEXNM * PRRS(:,:,:,4),4,'DISSH_BU_RTH',YDDDH, YDLDDH, YDMDDH)