diff --git a/cfgs/SHARED/field_def_nemo-oce.xml b/cfgs/SHARED/field_def_nemo-oce.xml
index 240c3913dad841c05331260dd38de1297f7c6f62..bd4a63c22d55d1967c0655a491c2ec4157e4451a 100644
--- a/cfgs/SHARED/field_def_nemo-oce.xml
+++ b/cfgs/SHARED/field_def_nemo-oce.xml
@@ -765,7 +765,7 @@ that are available in the tidal-forcing implementation (see
     <field id="avt_k"        long_name="vertical eddy diffusivity from closure schemes" standard_name="ocean_vertical_eddy_diffusivity"       unit="m2/s" />
     <field id="avm_k"        long_name="vertical eddy viscosity from closure schemes"   standard_name="ocean_vertical_eddy_viscosity"         unit="m2/s" />
     <field id="ediss_k"      long_name="Kolmogorov energy dissipation (tke scheme)"     standard_name="Kolmogorov_energy_dissipation"         unit="W/kg" />
-    <field id="eshear_k"     long_name="energy source from vertical shear"              standard_name="energy_source_from_shear"              unit="W/kg" />
+    <field id="eshear_k"     long_name="energy source from vertical shear"              standard_name="energy_source_from_shear"                                                      unit="W/kg"   grid_ref="grid_W_3D_inner" />
     <field id="estrat_k"     long_name="energy sink from stratification"                standard_name="energy_sink_from_stratification"       unit="W/kg" />
     
   </field_group>
diff --git a/src/OCE/DIA/diaar5.F90 b/src/OCE/DIA/diaar5.F90
index 38e70c73fef6886972f9b99e797e3d63eb3e4cb8..00ef362d9c60f1b4f41e81504ca9bf9ed02f23bb 100644
--- a/src/OCE/DIA/diaar5.F90
+++ b/src/OCE/DIA/diaar5.F90
@@ -87,7 +87,7 @@ CONTAINS
 
       IF( l_ar5 ) THEN
          ALLOCATE( zarea_ssh(jpi,jpj), zbotpres(jpi,jpj), z2d(jpi,jpj) )
-         ALLOCATE( zrhd(jpi,jpj,jpk) )
+         ALLOCATE( zrhd(jpi,jpj,jpk), z3d(jpi,jpj,jpk) )
          ALLOCATE( ztsn(jpi,jpj,jpk,jpts) )
          zarea_ssh(:,:) = e1e2t(:,:) * ssh(:,:,Kmm)
       ENDIF
@@ -295,8 +295,9 @@ CONTAINS
       ENDIF
 
       IF( l_ar5 ) THEN
-        DEALLOCATE( zarea_ssh , zbotpres, z2d )
-        DEALLOCATE( ztsn                 )
+        DEALLOCATE( zarea_ssh, zbotpres, z2d )
+        DEALLOCATE( z3d )
+        DEALLOCATE( ztsn )
       ENDIF
       !
       IF( ln_timing )   CALL timing_stop('dia_ar5')
diff --git a/src/OCE/IOM/iom.F90 b/src/OCE/IOM/iom.F90
index de1bd979ec77b70e9224d94920ae458ac9675670..ac8147cca28c52ccf67298b4bb22725f26716c8c 100644
--- a/src/OCE/IOM/iom.F90
+++ b/src/OCE/IOM/iom.F90
@@ -2266,9 +2266,11 @@ CONTAINS
       LOGICAL, INTENT(IN) :: ldxios, ldrxios
       !!----------------------------------------------------------------------
       !
+      ! nn_hls halo points
       CALL iom_set_domain_attr("grid_"//cdgrd, ni_glo=Ni0glo,nj_glo=Nj0glo,ibegin=mig0(Nis0)-1,jbegin=mjg0(Njs0)-1,ni=Ni_0,nj=Nj_0)
       CALL iom_set_domain_attr("grid_"//cdgrd, data_dim=2, data_ibegin = -nn_hls, data_ni=jpi, data_jbegin = -nn_hls, data_nj=jpj)
 
+      ! Inner domain only
       CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", ni_glo = Ni0glo, nj_glo = Nj0glo,   &
          &                     ibegin = mig0(Nis0) - 1, jbegin = mjg0(Njs0) - 1, ni = Ni_0, nj = Nj_0)
       CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", data_dim=2, data_ibegin = 0, data_ni=Ni_0, data_jbegin = 0, data_nj=Nj_0)
@@ -2280,14 +2282,16 @@ CONTAINS
             idb(jn) = -nn_hls                         ! Tile data offset (halo size)
          END DO
 
-         ! Tile_[ij]begin are defined with respect to the processor data domain, so data_[ij]begin is added
+         ! Data includes all halo points
          CALL iom_set_domain_attr("grid_"//cdgrd, ntiles=nijtile,                                     &
-            & tile_ibegin=ntsi_a(1:nijtile) + idb(:) - 1, tile_jbegin=ntsj_a(1:nijtile) + idb(:) - 1, &
+            & tile_ibegin=ntsi_a(1:nijtile) - nn_hls - 1, tile_jbegin=ntsj_a(1:nijtile) - nn_hls - 1, &
             & tile_ni=ini(:), tile_nj=inj(:),                                                         &
             & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:),                                       &
             & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:))
+         ! Data contains no halo points
+         idb(:) = 0
          CALL iom_set_domain_attr("grid_"//cdgrd//"_inner", ntiles=nijtile,                           &
-            & tile_ibegin=ntsi_a(1:nijtile) + idb(:) - 1, tile_jbegin=ntsj_a(1:nijtile) + idb(:) - 1, &
+            & tile_ibegin=ntsi_a(1:nijtile) - nn_hls - 1, tile_jbegin=ntsj_a(1:nijtile) - nn_hls - 1, &
             & tile_ni=ini(:), tile_nj=inj(:),                                                         &
             & tile_data_ibegin=idb(:), tile_data_jbegin=idb(:),                                       &
             & tile_data_ni=ini(:) - 2 * idb(:), tile_data_nj=inj(:) - 2 * idb(:))
diff --git a/src/OCE/ZDF/zdfphy.F90 b/src/OCE/ZDF/zdfphy.F90
index 66beff367532ff7bd636d5b8a640a8a2918e26f6..9988073a3d1c9edf2531201526aa21653495ac6c 100644
--- a/src/OCE/ZDF/zdfphy.F90
+++ b/src/OCE/ZDF/zdfphy.F90
@@ -379,10 +379,10 @@ CONTAINS
       ! diagnostics of energy dissipation
       IF( iom_use('avt_k') .OR. iom_use('avm_k') .OR. iom_use('eshear_k') .OR. iom_use('estrat_k') ) THEN
          IF( l_zdfsh2 ) THEN
-            CALL iom_put( 'avt_k'   ,   avt_k       * wmask )
-            CALL iom_put( 'avm_k'   ,   avm_k       * wmask )
-            CALL iom_put( 'eshear_k',   zsh2        * wmask )
-            CALL iom_put( 'estrat_k', - avt_k * rn2 * wmask )
+            CALL iom_put( 'avt_k'   ,   avt_k          * wmask           )
+            CALL iom_put( 'avm_k'   ,   avm_k          * wmask           )
+            CALL iom_put( 'eshear_k',   zsh2(A2D(0),:) * wmask(A2D(0),:) )
+            CALL iom_put( 'estrat_k', - avt_k * rn2    * wmask           )
          ENDIF
       ENDIF
       !
diff --git a/src/OCE/ZDF/zdftke.F90 b/src/OCE/ZDF/zdftke.F90
index 6e3e6b93fb9d2207d66068e57693f20df20fe787..cfacb6285c444b309d07234a5794d5df3e45fc7e 100644
--- a/src/OCE/ZDF/zdftke.F90
+++ b/src/OCE/ZDF/zdftke.F90
@@ -219,7 +219,7 @@ CONTAINS
       INTEGER , DIMENSION(A2D(nn_hls))     ::   imlc
       REAL(wp), DIMENSION(A2D(nn_hls))     ::   zice_fra, zhlc, zus3, zWlc2
       REAL(wp), DIMENSION(A2D(nn_hls),jpk) ::   zpelc, zdiag, zd_up, zd_lw
-      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE ::   ztmp ! for diags
+      REAL(wp), DIMENSION(:,:,:), ALLOCATABLE, SAVE ::   ztmp ! for diags
       REAL(wp) :: zdiv
       !!--------------------------------------------------------------------
       !
@@ -462,15 +462,17 @@ CONTAINS
       !    ediss = Ce*sqrt(en)/L*en
       !    dissl = sqrt(en)/L
       IF( iom_use('ediss_k') ) THEN
-         ALLOCATE( ztmp(A2D(nn_hls),jpk) )
-         DO_3D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
+         IF( .NOT. l_istiled .OR. ntile == 1 ) THEN
+            ALLOCATE( ztmp(jpi,jpj,jpk) )
+            ztmp(:,:,:) = 0._wp
+         ENDIF
+         DO_3D_OVR( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1, 1, jpkm1 )
             ztmp(ji,jj,jk) = zfact3 * dissl(ji,jj,jk) * en(ji,jj,jk) * wmask(ji,jj,jk)
          END_3D
-         DO_2D( nn_hls-1, nn_hls-1, nn_hls-1, nn_hls-1 )
-            ztmp(ji,jj,jpk) = 0._wp
-         END_2D
-         CALL iom_put( 'ediss_k', ztmp )
-         DEALLOCATE( ztmp )
+         IF( .NOT. l_istiled .OR. ntile == nijtile ) THEN
+            CALL iom_put( 'ediss_k', ztmp )
+            DEALLOCATE( ztmp )
+         ENDIF
       ENDIF
       !
       !                            !<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<