diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
index 7ce7335251f4dbb99a1175f21d230bda60382d88..c3d47cb6cc3bbc6b6fda62c78d0cc310d2946867 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
@@ -51,7 +51,7 @@ INTERFACE IO_Field_read
                     IO_Field_read_byname_N2, IO_Field_read_byname_N3,  &
                     IO_Field_read_byname_L0, IO_Field_read_byname_L1,  &
                     IO_Field_read_byname_C0,                           &
-                    IO_Field_read_byname_T0,                           &
+                    IO_Field_read_byname_T0, IO_Field_read_byname_T1,  &
                     IO_Field_read_byfield_X0,IO_Field_read_byfield_X1, &
                     IO_Field_read_byfield_X2,IO_Field_read_byfield_X3, &
                     IO_Field_read_byfield_X4,IO_Field_read_byfield_X5, &
@@ -60,7 +60,7 @@ INTERFACE IO_Field_read
                     IO_Field_read_byfield_N2,IO_Field_read_byfield_N3, &
                     IO_Field_read_byfield_L0,IO_Field_read_byfield_L1, &
                     IO_Field_read_byfield_C0,                          &
-                    IO_Field_read_byfield_T0
+                    IO_Field_read_byfield_T0, IO_Field_read_byfield_T1
 END INTERFACE
 
 INTERFACE IO_Field_read_lb
@@ -2096,7 +2096,99 @@ IF (PRESENT(KRESP)) KRESP = IRESP
 END SUBROUTINE IO_Field_read_byfield_T0
 
 
-SUBROUTINE IO_Field_read_byname_lb(TPFILE,HNAME,KL3D,KRIM,PLB,KRESP)
+SUBROUTINE IO_Field_read_byname_T1( TPFILE, HNAME, TPDATA, KRESP )
+
+  use modd_type_date, only: DATE_TIME
+
+  TYPE(TFILEDATA),                          INTENT(IN)    :: TPFILE
+  CHARACTER(LEN=*),                         INTENT(IN)    :: HNAME    ! name of the field to write
+  TYPE (DATE_TIME), DIMENSION(:),           INTENT(INOUT) :: TPDATA   ! array containing the data field
+  INTEGER,                        OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+  !
+  INTEGER :: ID ! Index of the field
+  INTEGER :: IRESP ! return_code
+  !
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byname_T1',TRIM(TPFILE%CNAME)//': reading '//TRIM(HNAME))
+  !
+  CALL FIND_FIELD_ID_FROM_MNHNAME(HNAME,ID,IRESP)
+  !
+  IF(IRESP==0) CALL IO_Field_read(TPFILE,TFIELDLIST(ID),TPDATA,IRESP)
+  !
+  IF (PRESENT(KRESP)) KRESP = IRESP
+  !
+  END SUBROUTINE IO_Field_read_byname_T1
+
+  SUBROUTINE IO_Field_read_byfield_T1( TPFILE, TPFIELD, TPDATA, KRESP )
+  !
+  use modd_io,        only: ISP, GSMONOPROC
+  use modd_type_date, only: DATE_TIME
+  !
+  TYPE(TFILEDATA),                               INTENT(IN)    :: TPFILE
+  CLASS(TFIELDMETADATA),                         INTENT(INOUT) :: TPFIELD
+  TYPE(DATE_TIME),       DIMENSION(:),           INTENT(INOUT) :: TPDATA   ! array containing the data field
+  INTEGER,                             OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+  !
+  INTEGER                           :: IERR
+  INTEGER                           :: IRESP
+  INTEGER,DIMENSION(3,SIZE(TPDATA)) :: ITDATE
+  logical                           :: glfi, gnc4
+  type(date_time), dimension(:), allocatable :: tzdata ! Intermediate data (always used for reads to not overwrite data in case of error)
+  !
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_T1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+  !
+  IRESP = 0
+  !
+  CALL IO_File_read_check(TPFILE,'IO_Field_read_byfield_T1',IRESP)
+
+  call IO_Format_read_select( tpfile, glfi, gnc4 )
+
+  IF (IRESP==0) THEN
+    IF (GSMONOPROC) THEN ! sequential execution
+      allocate( tzdata(size(tpdata)) )
+      if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tzdata, iresp )
+      if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tzdata, iresp )
+      if ( iresp == 0 .or. iresp == -111 ) tpdata(:) = tzdata(:)
+    ELSE
+      IF (ISP == TPFILE%NMASTER_RANK)  THEN
+        call Allocbuffer_ll( tzdata, tpdata, tpfield%cdir )
+        if ( gnc4 ) call IO_Field_read_nc4( tpfile, tpfield, tzdata, iresp )
+        if ( glfi ) call IO_Field_read_lfi( tpfile, tpfield, tzdata, iresp )
+      ELSE
+        !Not really necessary but useful to suppress alerts with Valgrind
+        allocate( tzdata(0) )
+      END IF
+      !
+      CALL MPI_BCAST(IRESP,1,MNHINT_MPI,TPFILE%NMASTER_RANK-1,TPFILE%NMPICOMM,IERR)
+      !
+      !Broadcast header only if IRESP==-111
+      !because metadata of field has been modified in IO_Field_read_xxx
+      IF (IRESP==-111) CALL IO_Field_metadata_bcast(TPFILE,TPFIELD)
+      !
+      !Share data only if no error
+      if ( iresp == 0 .or. iresp == -111 ) then
+        if ( isp == tpfile%nmaster_rank ) then
+          tpdata(:) = tzdata(:)
+          ITDATE(1,:) = TPDATA(:)%nyear
+          ITDATE(2,:) = TPDATA(:)%nmonth
+          ITDATE(3,:) = TPDATA(:)%nday
+        end if
+        CALL MPI_BCAST( ITDATE(:,:),     3*size(tpdata), MNHINT_MPI,  TPFILE%NMASTER_RANK-1, TPFILE%NMPICOMM, IERR )
+        CALL MPI_BCAST( TPDATA(:)%xtime, 1*size(tpdata), MNHREAL_MPI, TPFILE%NMASTER_RANK-1, TPFILE%NMPICOMM, IERR )
+        TPDATA(:)%nyear  = ITDATE(1,:)
+        TPDATA(:)%nmonth = ITDATE(2,:)
+        TPDATA(:)%nday   = ITDATE(3,:)
+      end if
+    END IF
+  END IF
+  !
+  IF (IRESP==-111) IRESP = 0 !-111 is not really an error (metadata has changed)
+  !
+  IF (PRESENT(KRESP)) KRESP = IRESP
+  !
+  END SUBROUTINE IO_Field_read_byfield_T1
+
+
+  SUBROUTINE IO_Field_read_byname_lb(TPFILE,HNAME,KL3D,KRIM,PLB,KRESP)
 !
 TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
 CHARACTER(LEN=*),       INTENT(IN)    :: HNAME   ! name of the field to write
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
index 449f05c8df0b74cfd1343a5e778c8da224c89fc4..f7dd95bf4ad934dab6ed27ebb0c1ca144cc5b106 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
@@ -38,7 +38,7 @@ INTERFACE IO_Field_read_lfi
                     IO_Field_read_lfi_N2, IO_Field_read_lfi_N3, &
                     IO_Field_read_lfi_L0, IO_Field_read_lfi_L1, &
                     IO_Field_read_lfi_C0,                       &
-                    IO_Field_read_lfi_T0
+                    IO_Field_read_lfi_T0, IO_Field_read_lfi_T1
 END INTERFACE IO_Field_read_lfi
 !
 CONTAINS
@@ -644,6 +644,28 @@ KRESP = IRESP
 END SUBROUTINE IO_Field_read_lfi_T0
 !
 !
+SUBROUTINE IO_Field_read_lfi_T1(TPFILE,TPFIELD,TPDATA,KRESP)
+!
+USE MODE_MSG
+USE MODD_TYPE_DATE
+!
+IMPLICIT NONE
+!
+!*      0.1   Declarations of arguments
+!
+TYPE(TFILEDATA),                INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base),     INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME), DIMENSION(:), INTENT(INOUT) :: TPDATA  ! array containing the data field
+INTEGER,                        INTENT(OUT)   :: KRESP   ! return-code if problems occured
+!
+!*      0.2   Declarations of local variables
+!
+CALL PRINT_MSG( NVERB_ERROR, 'IO', 'IO_Field_read_lfi_T1', &
+                TRIM(TPFILE%CNAME) // ': read of 1D arrays of dates not implemented for LFI files' )
+!
+END SUBROUTINE IO_Field_read_lfi_T1
+!
+!
 SUBROUTINE IO_Field_read_check_lfi(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD)
 !
 USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index f95effb73e96f12a5d95d213515dead022a548d6..d7e4663ffa06f1c46bb98d27644f7ab2dd78c6f6 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -44,7 +44,7 @@ INTERFACE IO_Field_read_nc4
                     IO_Field_read_nc4_N2,IO_Field_read_nc4_N3, &
                     IO_Field_read_nc4_L0,IO_Field_read_nc4_L1, &
                     IO_Field_read_nc4_C0,                      &
-                    IO_Field_read_nc4_T0
+                    IO_Field_read_nc4_T0,IO_Field_read_nc4_T1
 END INTERFACE IO_Field_read_nc4
 
 contains
@@ -1289,7 +1289,6 @@ INTEGER(KIND=CDFINT)         :: IVARID
 INTEGER(KIND=CDFINT)         :: ITYPE   ! variable type
 INTEGER(KIND=CDFINT)         :: IDIMS   ! number of dimensions
 CHARACTER(LEN=30)            :: YVARNAME
-CHARACTER(LEN=:),ALLOCATABLE :: YSTR
 INTEGER(KIND=CDFINT)         :: IDIMLEN
 INTEGER                      :: IDX,IRESP
 REAL                         :: ZTIME
@@ -1344,6 +1343,93 @@ KRESP = IRESP
 
 END SUBROUTINE IO_Field_read_nc4_T0
 
+SUBROUTINE IO_Field_read_nc4_T1(TPFILE, TPFIELD, TPDATA, KRESP)
+  !
+  USE MODD_TYPE_DATE
+  !
+  USE MODE_DATETIME
+  !
+  TYPE(TFILEDATA),                INTENT(IN)    :: TPFILE
+  CLASS(tfieldmetadata),          INTENT(INOUT) :: TPFIELD
+  TYPE (DATE_TIME), DIMENSION(:), INTENT(INOUT) :: TPDATA
+  INTEGER,                        INTENT(OUT)   :: KRESP  ! return-code
+
+  INTEGER(KIND=CDFINT)            :: istatus
+  INTEGER(KIND=CDFINT)            :: INCID
+  INTEGER(KIND=CDFINT)            :: IVARID
+  INTEGER(KIND=CDFINT)            :: ITYPE   ! variable type
+  INTEGER(KIND=CDFINT)            :: IDIMS   ! number of dimensions
+  INTEGER(KIND=CDFINT), DIMENSION(NF90_MAX_VAR_DIMS) :: IVDIMS
+  CHARACTER(LEN=30)               :: YVARNAME
+  INTEGER(KIND=CDFINT)            :: IDIMLEN
+  INTEGER                         :: IDX,IRESP
+  REAL, DIMENSION(:), ALLOCATABLE :: ZTIMES
+
+  CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_nc4_T1',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
+
+  IRESP = 0
+  ! Get the Netcdf file ID
+  INCID = TPFILE%NNCID
+
+  CALL IO_Mnhname_clean(TPFIELD%CMNHNAME,YVARNAME)
+
+  ! Get variable ID, NDIMS and TYPE
+  istatus = NF90_INQ_VARID(INCID, YVARNAME, IVARID)
+  IF (istatus /= NF90_NOERR) THEN
+    CALL IO_Err_handle_nc4(istatus,'IO_Field_read_nc4_T1','NF90_INQ_VARID',TRIM(YVARNAME),IRESP)
+    GOTO 1000
+  END IF
+  istatus = NF90_INQUIRE_VARIABLE(INCID, IVARID, XTYPE=ITYPE, NDIMS=IDIMS, DIMIDS=IVDIMS)
+  IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_Field_read_nc4_T1','NF90_INQUIRE_VARIABLE',TRIM(YVARNAME))
+
+  IF (IDIMS == 1 .AND. (ITYPE == NF90_FLOAT .OR. ITYPE == NF90_DOUBLE) ) THEN
+    ! Check size of variable before reading
+    istatus = NF90_INQUIRE_DIMENSION(INCID, IVDIMS(1), LEN=IDIMLEN)
+    IF (istatus /= NF90_NOERR) CALL IO_Err_handle_nc4(istatus,'IO_Field_read_nc4_T1','NF90_INQUIRE_DIMENSION',TRIM(YVARNAME))
+
+    IF (IDIMLEN == SIZE(TPDATA)) THEN
+      ! Read times
+      allocate( ztimes(idimlen) )
+      istatus = NF90_GET_VAR( INCID, IVARID, ZTIMES )
+      IF (istatus /= NF90_NOERR) THEN
+        CALL IO_Err_handle_nc4(istatus,'IO_Field_read_nc4_T1','NF90_GET_VAR',TRIM(YVARNAME),IRESP)
+        GOTO 1000
+      END IF
+      ! Read and check attributes of variable
+      CALL IO_Field_attr_read_check_nc4(TPFILE,TPFIELD,IVARID,IRESP,HCALENDAR='standard')
+      ! Extract date from UNITS
+      IDX =  INDEX(TPFIELD%CUNITS,'since ')
+      READ(TPFIELD%CUNITS(IDX+6 :IDX+9), '( I4.4 )') TPDATA(1)%nyear
+      READ(TPFIELD%CUNITS(IDX+11:IDX+12),'( I2.2 )') TPDATA(1)%nmonth
+      READ(TPFIELD%CUNITS(IDX+14:IDX+15),'( I2.2 )') TPDATA(1)%nday
+      ! Simple check (should catch most errors)
+      IF ( TPDATA(1)%nday<1 .OR. TPDATA(1)%nday>31 .OR. TPDATA(1)%nmonth<1 .OR. TPDATA(1)%nmonth>12 ) THEN
+        CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Field_read_nc4_T1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                               ' read date is invalid')
+        IRESP = -3
+      END IF
+      if ( size(tpdata) > 1 ) then
+        TPDATA(2:)%nyear  = TPDATA(1)%nyear
+        TPDATA(2:)%nmonth = TPDATA(1)%nmonth
+        TPDATA(2:)%nday   = TPDATA(1)%nday
+      end if
+      ! Insert times + autocorrect date and time (necessary for example if time is bigger than 86400 s)
+      TPDATA(:) = TPDATA(:) + ZTIMES(:)
+    ELSE
+      CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Field_read_nc4_T1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                             ' not read (wrong size)')
+      IRESP = -3
+    END IF
+  ELSE
+    CALL PRINT_MSG(NVERB_ERROR,'IO','IO_Field_read_nc4_T1',TRIM(TPFILE%CNAME)//': '//TRIM(YVARNAME)// &
+                                                           ' not read (wrong number of dimensions or wrong type)')
+    IRESP = -3
+  END IF
+
+  1000 CONTINUE
+  KRESP = IRESP
+
+END SUBROUTINE IO_Field_read_nc4_T1
 
 end module mode_io_read_nc4
 #else
diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index d3ce73acd1e91e46175fa2eb82168bf1e5f95d68..ca508f8c324cc69c4e63d7e1e202c952897e4a3c 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 2003-2023 CNRS, Meteo-France and Universite Paul Sabatier
+!MNH_LIC Copyright 2003-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.
@@ -169,8 +169,6 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT ! comment
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER              :: IGRID          ! IGRID : grid indicator
-INTEGER              :: ILENCH         ! ILENCH : length of comment string
 INTEGER              :: ILUOUT
 INTEGER              :: IID,IRESP
 INTEGER              :: IIMAX,IJMAX
@@ -329,8 +327,6 @@ CHARACTER(LEN=1),       INTENT(IN) :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 INTEGER           :: JI, JJ         ! loop counters
 
@@ -615,8 +611,6 @@ CHARACTER(LEN=1),        INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER              :: IGRID          ! IGRID : grid indicator
-INTEGER              :: ILENCH         ! ILENCH : length of comment string
 INTEGER              :: ILUOUT
 INTEGER              :: JP             ! loop index
 
@@ -753,8 +747,6 @@ CHARACTER(LEN=1),          INTENT(IN) :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
 CHARACTER(LEN=MNH_LEN_HREC) :: YREC
@@ -949,8 +941,6 @@ CHARACTER(LEN=1),       INTENT(IN) :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
 CHARACTER(LEN=MNH_LEN_HREC) :: YREC
@@ -1224,8 +1214,6 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
@@ -1329,8 +1317,6 @@ CHARACTER(LEN=*),       INTENT(OUT) :: HCOMMENT  ! comment
 !*      0.2   Declarations of local variables
 !
 INTEGER              :: IRESP          ! return code
-INTEGER              :: IGRID          ! IGRID : grid indicator
-INTEGER              :: ILENCH         ! ILENCH : length of comment string
 INTEGER              :: ILUOUT
 !
 INTEGER              :: ILUDES       ! .des file logical unit
@@ -1488,8 +1474,6 @@ CHARACTER(LEN=1),       INTENT(IN)  :: HDIR     ! type of field :
 !
 !*      0.2   Declarations of local variables
 !
-INTEGER              :: IGRID          ! IGRID : grid indicator
-INTEGER              :: ILENCH         ! ILENCH : length of comment string
 INTEGER              :: ILUOUT
 LOGICAL, DIMENSION(:,:), ALLOCATABLE :: GWORK  ! work array read in the file
 INTEGER, DIMENSION(:,:), ALLOCATABLE :: IWORK  ! work array read in the file
@@ -1717,14 +1701,10 @@ CHARACTER(LEN=*),       INTENT(OUT)   :: HCOMMENT ! comment
 
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
-CHARACTER(LEN=MNH_LEN_HREC)        :: YRECFM     ! Name of the article to be written
 CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
 CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
-INTEGER, DIMENSION(3)          :: ITDATE
 TYPE(TFIELDMETADATA)           :: TZFIELD
 TYPE(DATE_TIME)                :: TZDATETIME
 !-------------------------------------------------------------------------------
@@ -1766,7 +1746,7 @@ CALL IO_Field_read(TPINFILE,HREC,TZDATETIME,KRESP)
 IF (KRESP /=0) THEN
   WRITE(ILUOUT,*) 'WARNING'
   WRITE(ILUOUT,*) '-------'
-  WRITE(ILUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
+  WRITE(ILUOUT,*) 'error when reading article ',HREC,'KRESP=',KRESP
   WRITE(ILUOUT,*) 'default value may be used, who knows???'
   WRITE(ILUOUT,*) ' '
 ENDIF
@@ -1820,11 +1800,13 @@ END SUBROUTINE READ_SURFT0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-use modd_field,         only: tfieldmetadata, TYPECHAR, TYPEINT, TYPEREAL
+use modd_field,         only: tfieldmetadata, TYPEINT, TYPEREAL, TYPEDATE
 USE MODD_IO_SURF_MNH,   ONLY: TOUT, TPINFILE
+USE MODD_TYPE_DATE
 
 USE MODE_IO_FIELD_READ, only: IO_Field_read
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 
 IMPLICIT NONE
 !
@@ -1842,15 +1824,12 @@ CHARACTER(LEN=*),        INTENT(OUT)   :: HCOMMENT ! comment
 
 !*      0.2   Declarations of local variables
 !
-INTEGER           :: IGRID          ! IGRID : grid indicator
-INTEGER           :: ILENCH         ! ILENCH : length of comment string
 INTEGER           :: ILUOUT
 !
-CHARACTER(LEN=MNH_LEN_HREC)        :: YRECFM     ! Name of the article to be written
-CHARACTER(LEN=40)              :: YFILETYPE40! MESONH file type
-CHARACTER(LEN=2)               :: YFILETYPE2 ! MESONH file type
-INTEGER, DIMENSION(3,KL1)      :: ITDATE
-TYPE(TFIELDMETADATA)           :: TZFIELD
+CHARACTER(LEN=5)                 :: YMSG
+INTEGER, DIMENSION(3,KL1)        :: ITDATE
+TYPE (DATE_TIME), DIMENSION(KL1) :: TZDATA
+TYPE(TFIELDMETADATA)             :: TZFIELD
 !-------------------------------------------------------------------------------
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT1_MNH',TRIM(TPINFILE%CNAME)//': reading '//TRIM(HREC))
@@ -1858,79 +1837,64 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFT1_MNH',TRIM(TPINFILE%CNAME)//': readi
 ILUOUT = TOUT%NLU
 HCOMMENT = ''
 !
-IF (TPINFILE%NMNHVERSION(1)<4 .OR. (TPINFILE%NMNHVERSION(1)==4 .AND. TPINFILE%NMNHVERSION(2)<6)) THEN
-  CALL IO_Field_read(TPINFILE,'STORAGE_TYPE',YFILETYPE2)
+IF (       TPINFILE%NMNHVERSION(1)<5                                                                     &
+     .OR. (TPINFILE%NMNHVERSION(1)==5 .AND. TPINFILE%NMNHVERSION(2)<7)                                   &
+     .OR. (TPINFILE%NMNHVERSION(1)==5 .AND. TPINFILE%NMNHVERSION(2)==7 .AND. TPINFILE%NMNHVERSION(3)<2 ) ) THEN
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = TRIM(HREC)//'%TDATE', &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = TRIM(HREC)//'%TDATE', &
+    CUNITS     = '',                   &
+    CDIR       = '--',                 &
+    CCOMMENT   = '',                   &
+    NGRID      = 0,                    &
+    NTYPE      = TYPEINT,              &
+    NDIMS      = 2,                    &
+    LTIMEDEP   = .FALSE.               )
+  !
+  CALL IO_Field_read(TPINFILE,TZFIELD,ITDATE(:,:),KRESP)
+  !
+  KYEAR(:)  = ITDATE(1,:)
+  KMONTH(:) = ITDATE(2,:)
+  KDAY(:)   = ITDATE(3,:)
+  !
+  IF (KRESP /=0) THEN
+    WRITE(ILUOUT,*) 'WARNING'
+    WRITE(ILUOUT,*) '-------'
+    WRITE(ILUOUT,*) 'error when reading article ',HREC,'KRESP=',KRESP
+    WRITE(ILUOUT,*) 'default value may be used, who knows???'
+    WRITE(ILUOUT,*) ' '
+  ENDIF
+  !
+  TZFIELD = TFIELDMETADATA(            &
+    CMNHNAME   = TRIM(HREC)//'%xtime', &
+    CSTDNAME   = '',                   &
+    CLONGNAME  = TRIM(HREC)//'%xtime', &
+    CUNITS     = '',                   &
+    CDIR       = '--',                 &
+    CCOMMENT   = '',                   &
+    NGRID      = 0,                    &
+    NTYPE      = TYPEREAL,             &
+    NDIMS      = 1,                    &
+    LTIMEDEP   = .FALSE.               )
+  !
+  CALL IO_Field_read(TPINFILE,TZFIELD,PTIME(:),KRESP)
+  !
+  IF (KRESP /=0) THEN
+    WRITE(ILUOUT,*) 'WARNING'
+    WRITE(ILUOUT,*) '-------'
+    WRITE(ILUOUT,*) 'error when reading article ',HREC,'KRESP=',KRESP
+    WRITE(ILUOUT,*) 'default value may be used, who knows???'
+    WRITE(ILUOUT,*) ' '
+  ENDIF
 ELSE
-  TZFIELD = TFIELDMETADATA(     &
-    CMNHNAME   = 'STORAGETYPE', &
-    CSTDNAME   = '',            &
-    CLONGNAME  = 'STORAGETYPE', &
-    CUNITS     = '',            &
-    CDIR       = '--',          &
-    CCOMMENT   = '',            &
-    NGRID      = 0,             &
-    NTYPE      = TYPECHAR,      &
-    NDIMS      = 0,             &
-    LTIMEDEP   = .FALSE.        )
-  CALL IO_Field_read(TPINFILE,TZFIELD,YFILETYPE40)
-  YFILETYPE2 = YFILETYPE40(1:2)
-END IF
-!IF (YFILETYPE2(1:2)=='PG') THEN
-!  WRITE(ILUOUT,*) 'WARNING'
-!  WRITE(ILUOUT,*) '-------'
-!  WRITE(ILUOUT,*) 'Date is not read in a PGD file'
-!  WRITE(ILUOUT,*) 'Atmospheric model value is kept'
-!  WRITE(ILUOUT,*) ' '
-!  KRESP = -2
-!  RETURN
-!END IF
-!
-TZFIELD = TFIELDMETADATA(            &
-  CMNHNAME   = TRIM(HREC)//'%TDATE', &
-  CSTDNAME   = '',                   &
-  CLONGNAME  = TRIM(HREC)//'%TDATE', &
-  CUNITS     = '',                   &
-  CDIR       = '--',                 &
-  CCOMMENT   = '',                   &
-  NGRID      = 0,                    &
-  NTYPE      = TYPEINT,              &
-  NDIMS      = 2,                    &
-  LTIMEDEP   = .FALSE.               )
-!
-CALL IO_Field_read(TPINFILE,TZFIELD,ITDATE(:,:),KRESP)
-!
-KYEAR(:)  = ITDATE(1,:)
-KMONTH(:) = ITDATE(2,:)
-KDAY(:)   = ITDATE(3,:)
-!
-IF (KRESP /=0) THEN
-  WRITE(ILUOUT,*) 'WARNING'
-  WRITE(ILUOUT,*) '-------'
-  WRITE(ILUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
-  WRITE(ILUOUT,*) 'default value may be used, who knows???'
-  WRITE(ILUOUT,*) ' '
-ENDIF
-!
-TZFIELD = TFIELDMETADATA(            &
-  CMNHNAME   = TRIM(HREC)//'%xtime', &
-  CSTDNAME   = '',                   &
-  CLONGNAME  = TRIM(HREC)//'%xtime', &
-  CUNITS     = '',                   &
-  CDIR       = '--',                 &
-  CCOMMENT   = '',                   &
-  NGRID      = 0,                    &
-  NTYPE      = TYPEREAL,             &
-  NDIMS      = 1,                    &
-  LTIMEDEP   = .FALSE.               )
-!
-CALL IO_Field_read(TPINFILE,TZFIELD,PTIME(:),KRESP)
-!
-IF (KRESP /=0) THEN
-  WRITE(ILUOUT,*) 'WARNING'
-  WRITE(ILUOUT,*) '-------'
-  WRITE(ILUOUT,*) 'error when reading article ',YRECFM,'KRESP=',KRESP
-  WRITE(ILUOUT,*) 'default value may be used, who knows???'
-  WRITE(ILUOUT,*) ' '
+  CALL PREPARE_METADATA_READ_SURF( HREC, '--', 0, TYPEDATE, 1,'READ_SURFT1_MNH', TZFIELD )
+  CALL IO_Field_read( TPINFILE, TZFIELD, TZDATA, KRESP )
+
+  IF ( KRESP /=0 ) THEN
+    WRITE ( YMSG, '( I5 )' ) KRESP
+    CALL PRINT_MSG( NVERB_ERROR, 'IO', 'READ_SURFT1_MNH', 'error when reading article ' // TRIM(HREC) // ' KRESP=' // YMSG )
+  END IF
 ENDIF
 !-------------------------------------------------------------------------------
 END SUBROUTINE READ_SURFT1_MNH