diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 904898810bf8d5521d21c3769d90c19cf545d252..77edd7856ee417f1f83c3a37debe7bd20dcd097b 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 1994-2024 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.
@@ -977,7 +977,8 @@ END DO
     USE MODD_CONFZ,         ONLY: NB_PROCIO_R
     USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
     USE MODD_GRID,          ONLY: XBETA, XRPK, XLAT0, XLON0, XLATORI, XLONORI
-    USE MODD_GRID_n,        ONLY: LSLEVE, XXHAT, XYHAT, XZHAT
+    USE MODD_GRID_n,        ONLY: LSLEVE, XXHAT, XXHATM, XYHAT, XYHATM, XZHAT, XZHATM, &
+                                  XXHAT_ll, XYHAT_ll, XXHATM_ll, XYHATM_ll
     USE MODD_IO,            ONLY: LIOCDF4
     USE MODD_PARAMETERS,    ONLY: JPHEXT, JPVEXT
     USE MODD_PARAMETERS_ll, ONLY: JPHEXT_ll=>JPHEXT, JPVEXT_ll=>JPVEXT
@@ -985,6 +986,7 @@ END DO
 
     USE MODE_IO_FILE,          ONLY: IO_FILE_OPEN, IO_FILE_CLOSE
     USE MODE_IO_MANAGE_STRUCT, ONLY: IO_FILE_ADD2LIST
+    USE MODE_SET_GRID,         ONLY: INTERP_VERGRID_TO_MASSPOINTS
 
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: infiles
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(OUT) :: outfiles
@@ -997,6 +999,7 @@ END DO
 
     character(len=:), allocatable :: yunits
     INTEGER                       :: idx, IRESP2
+    integer                       :: iiu, iju, iku
     integer                       :: inb_procio_r_save
     INTEGER(KIND=CDFINT)          :: ioldmode
     INTEGER(KIND=CDFINT)          :: istatus
@@ -1095,18 +1098,33 @@ END DO
    if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'STORAGE_TYPE',CSTORAGE_TYPE,IRESP2)
    if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'STORAGE_TYPE not found')
    !
-   ALLOCATE(XXHAT(NIMAX_ll+2*JPHEXT))
+   iiu = nimax_ll + 2 * JPHEXT
+   ALLOCATE( XXHAT(iiu), XXHATM(iiu) )
    CALL IO_Field_read(INFILES(1)%TFILE,'XHAT',XXHAT,IRESP2)
    !If not found in main file, try the fallback one
    if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'XHAT',XXHAT,IRESP2)
    if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'XHAT not found')
 
-   ALLOCATE(XYHAT(NJMAX_ll+2*JPHEXT))
+   iju = njmax_ll + 2 * JPHEXT
+   ALLOCATE( XYHAT(iju), XYHATM(iju) )
    CALL IO_Field_read(INFILES(1)%TFILE,'YHAT',XYHAT,IRESP2)
    !If not found in main file, try the fallback one
    if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'YHAT',XYHAT,IRESP2)
    if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'YHAT not found')
 
+   ! Interpolations of positions to mass points
+   XXHATM(1:IIU-1) = 0.5 * XXHAT(1:IIU-1) + 0.5 * XXHAT(2:IIU)
+   XXHATM(  IIU)   = 1.5 * XXHAT(  IIU)   - 0.5 * XXHAT(IIU-1)
+
+   XYHATM(1:IJU-1) = 0.5 * XYHAT(1:IJU-1) + 0.5 * XYHAT(2:IJU)
+   XYHATM(  IJU)   = 1.5 * XYHAT(  IJU)   - 0.5 * XYHAT(IJU-1)
+
+   ! Set global domain boundaries (hypothesis: only 1 process)
+   XXHAT_ll => XXHAT
+   XYHAT_ll => XYHAT
+   XXHATM_ll => XXHATM
+   XYHATM_ll => XYHATM
+
    CALL IO_Field_read(INFILES(1)%TFILE,'CARTESIAN',LCARTESIAN,IRESP2)
    !If not found in main file, try the fallback one
    if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'CARTESIAN',LCARTESIAN,IRESP2)
@@ -1146,12 +1164,16 @@ END DO
    !
    IF (TRIM(CPROGRAM_ORIG)/='PGD' .AND. TRIM(CPROGRAM_ORIG)/='NESPGD' .AND. TRIM(CPROGRAM_ORIG)/='ZOOMPG' &
        .AND. .NOT.(TRIM(CPROGRAM_ORIG)=='REAL' .AND. CSTORAGE_TYPE=='SU') ) THEN !condition to detect PREP_SURFEX
-     ALLOCATE(XZHAT(NKMAX+2*JPVEXT))
+     iku = nkmax + 2 * JPVEXT
+     ALLOCATE( XZHAT(iku), XZHATM(iku) )
      CALL IO_Field_read(INFILES(1)%TFILE,'ZHAT',XZHAT,IRESP2)
      !If not found in main file, try the fallback one
      if ( options( OPTFALLBACK )%set .and. iresp2 /= 0 ) CALL IO_Field_read(INFILES(2)%TFILE,'ZHAT',XZHAT,IRESP2)
      if ( iresp2 /= 0 ) call Print_msg( NVERB_ERROR, 'IO', 'OPEN_FILES', 'ZHAT not found')
 
+     ! Interpolations of vertical positions to mass points
+     CALL INTERP_VERGRID_TO_MASSPOINTS( XZHAT, XZHATM )
+
      ALLOCATE(LSLEVE)
      CALL IO_Field_read(INFILES(1)%TFILE,'SLEVE',LSLEVE,IRESP2)
      !If not found in main file, try the fallback one