diff --git a/src/MNH/read_surf_mnh.f90 b/src/MNH/read_surf_mnh.f90
index 0fbd744a41e3b7cb8fc195996b6c00dc5a6e2228..47becd55e7da29efe1616eb9547b5f2682a66b6e 100644
--- a/src/MNH/read_surf_mnh.f90
+++ b/src/MNH/read_surf_mnh.f90
@@ -2,6 +2,80 @@
 !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.
+MODULE MODE_READ_SURF_MNH_TOOLS
+
+CONTAINS
+
+SUBROUTINE PREPARE_METADATA_READ_SURF(HREC,HDIR,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
+!
+USE MODE_FIELD, ONLY: FIND_FIELD_ID_FROM_MNHNAME, TFIELDDATA, TFIELDLIST
+USE MODE_MSG
+!
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+CHARACTER(LEN=2),       INTENT(IN)  :: HDIR     ! Expected type of the data field (XX,XY,--...)
+INTEGER,                INTENT(IN)  :: KGRID    ! Localization on the model grid
+INTEGER,                INTENT(IN)  :: KTYPE    ! Datatype
+INTEGER,                INTENT(IN)  :: KDIMS    ! Number of dimensions
+CHARACTER(LEN=*),       INTENT(IN)  :: HSUBR    ! name of the subroutine calling
+TYPE(TFIELDDATA),       INTENT(OUT) :: TPFIELD  ! metadata of field
+!
+CHARACTER(LEN=32) :: YTXT
+INTEGER           :: IID, IRESP
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.)
+IF (IRESP==0) THEN
+  TPFIELD = TFIELDLIST(IID)
+  !Modify and check CLONGNAME
+  IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC)) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CLONGNAME different ('//TRIM(TPFIELD%CLONGNAME) &
+                   //'/'//TRIM(HREC)//') than expected for article '//TRIM(HREC))
+    TPFIELD%CLONGNAME = TRIM(HREC)
+  END IF
+  !Modify and check CDIR
+  IF (TPFIELD%CDIR/=HDIR) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CDIR different ('//TRIM(TPFIELD%CDIR) &
+                   //'/'//TRIM(HDIR)//') than expected for article '//TRIM(HREC))
+    TPFIELD%CDIR = HDIR
+  END IF
+  !Modify and check NGRID
+  IF (TPFIELD%NGRID/=KGRID) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NGRID,KGRID
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NGRID different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NGRID = KGRID
+  END IF
+  !Modify and check NTYPE
+  IF (TPFIELD%NTYPE/=KTYPE) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NTYPE,KTYPE
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NTYPE different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NTYPE = KTYPE
+  END IF
+  !Modify and check NDIMS
+  IF (TPFIELD%NDIMS/=KDIMS) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NDIMS,KDIMS
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NDIMS different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NDIMS = KDIMS
+  END IF
+ELSE
+  CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata')
+  TPFIELD%CMNHNAME   = TRIM(HREC)
+  TPFIELD%CSTDNAME   = ''
+  TPFIELD%CLONGNAME  = TRIM(HREC)
+  TPFIELD%CUNITS     = ''
+  TPFIELD%CDIR       = HDIR
+  TPFIELD%CCOMMENT   = '' !Expected comment is not known
+  TPFIELD%NGRID      = KGRID
+  TPFIELD%NTYPE      = KTYPE
+  TPFIELD%NDIMS      = KDIMS
+END IF
+!
+END SUBROUTINE PREPARE_METADATA_READ_SURF
+
+END MODULE MODE_READ_SURF_MNH_TOOLS
+
+
 !     #############################################################
       SUBROUTINE READ_SURFX0_MNH(HREC,PFIELD,KRESP,HCOMMENT)
 !     #############################################################
@@ -44,17 +118,17 @@
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODD_CONF, ONLY : CPROGRAM
-USE MODD_GRID, ONLY: XRPK,XBETA,XLAT0,XLON0
-USE MODD_PARAMETERS, ONLY: JPHEXT, XUNDEF
+USE MODD_CONF,        ONLY: CPROGRAM
+USE MODD_GRID,        ONLY: XRPK,XBETA,XLAT0,XLON0
+USE MODD_IO_SURF_MNH, ONLY: TOUT, TPINFILE
+USE MODD_PARAMETERS,  ONLY: JPHEXT, XUNDEF
 !
-USE MODE_FIELD, ONLY : TFIELDDATA,TFIELDLIST,FIND_FIELD_ID_FROM_MNHNAME,TYPEREAL
+USE MODE_FIELD,       ONLY: TFIELDDATA,TFIELDLIST,FIND_FIELD_ID_FROM_MNHNAME,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_GRIDPROJ
 USE MODE_MSG
-!
-USE MODD_IO_SURF_MNH,        ONLY : TOUT, TPINFILE
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODI_GET_SURF_UNDEF
 !
@@ -78,7 +152,6 @@ INTEGER           :: IIMAX,IJMAX
 REAL,DIMENSION(:), ALLOCATABLE :: ZXHAT,ZYHAT
 REAL              :: ZLATOR,ZLONOR,ZXHATM,ZYHATM,ZLATORI,ZLONORI
 REAL              :: ZRPK, ZBETA, ZLAT0, ZLON0
-CHARACTER(LEN=100):: YCOMMENT ! comment
 TYPE(TFIELDDATA)  :: TZFIELD
 !-------------------------------------------------------------------------------
 !
@@ -140,15 +213,7 @@ IF ( HREC=='LAT0' .OR. HREC=='LON0' .OR. HREC=='RPK' .OR. HREC=='BETA'  &
                  .OR. HREC=='LATORI'.OR. HREC=='LONORI'                  ) THEN
   CALL IO_READ_FIELD(TPINFILE,HREC,PFIELD,KRESP)
 ELSE
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 0
+  CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPEREAL,0,'READ_SURFX0_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
 END IF
 
@@ -203,12 +268,13 @@ END SUBROUTINE READ_SURFX0_MNH
 !*      0.    DECLARATIONS
 !             ------------
 !
-USE MODE_FIELD,       ONLY : TFIELDDATA,TYPEREAL
+USE MODE_FIELD,       ONLY: FIND_FIELD_ID_FROM_MNHNAME,TFIELDDATA,TFIELDLIST,TYPEREAL
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_ll
 USE MODE_IO_ll
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_CST,         ONLY : XPI
 !
@@ -253,6 +319,7 @@ INTEGER           :: IMASDEV
 CHARACTER(LEN=LEN_HREC) :: YREC
 CHARACTER(LEN=2)  :: YSTORAGE_TYPE
 !
+INTEGER           :: IID, IRESP
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for packing
 REAL              :: ZUNDEF         ! undefined value in SURFEX
@@ -306,14 +373,8 @@ ELSE IF (HREC=='XX') THEN
   ALLOCATE(ZWORK1D(IIU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
-  TZFIELD%CMNHNAME   = 'XHAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'XHAT'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 2
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
+  CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
   IF (HDIR/='A') THEN
     TZFIELD%CDIR       = 'XX'
   ELSE
@@ -331,14 +392,8 @@ ELSE IF (HREC=='DX') THEN
   ALLOCATE(ZWORK1D(IIU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
-  TZFIELD%CMNHNAME   = 'XHAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'XHAT'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 2
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
+  CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
   IF (HDIR/='A') THEN
     TZFIELD%CDIR       = 'XX'
   ELSE
@@ -356,14 +411,8 @@ ELSE IF (HREC=='YY') THEN
   ALLOCATE(ZWORK1D(IJU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
-  TZFIELD%CMNHNAME   = 'YHAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'YHAT'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 3
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
+  CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
   IF (HDIR/='A') THEN
     TZFIELD%CDIR       = 'YY'
   ELSE
@@ -381,14 +430,8 @@ ELSE IF (HREC=='DY') THEN
   ALLOCATE(ZWORK1D(IJU))
   ALLOCATE(ZWORK  (IIU,IJU))
   ZWORK(:,:) = 0.
-  TZFIELD%CMNHNAME   = 'YHAT'
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = 'YHAT'
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 3
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
+  CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
+  TZFIELD = TFIELDLIST(IID)
   IF (HDIR/='A') THEN
     TZFIELD%CDIR       = 'YY'
   ELSE
@@ -435,25 +478,14 @@ ELSE
 !
   ALLOCATE(ZWORK(IIU,IJU))
 !
-
-  TZFIELD%CMNHNAME   = TRIM(YREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(YREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
   IF (HDIR=='H') THEN
-    TZFIELD%CDIR     = 'XY'
-    TZFIELD%NDIMS    = 2
+    CALL PREPARE_METADATA_READ_SURF(YREC,'XY',4,TYPEREAL,2,'READ_SURFX1_MNH',TZFIELD)
     CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
   ELSEIF (HDIR=='A') THEN
-    TZFIELD%CDIR     = '--'
-    TZFIELD%NDIMS    = 2
+    CALL PREPARE_METADATA_READ_SURF(YREC,'--',4,TYPEREAL,2,'READ_SURFX1_MNH',TZFIELD)
     CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
   ELSE
-    TZFIELD%CDIR     = '--'
-    TZFIELD%NDIMS    = 1
+    CALL PREPARE_METADATA_READ_SURF(YREC,'--',4,TYPEREAL,1,'READ_SURFX1_MNH',TZFIELD)
     CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
   END IF
 !
@@ -533,6 +565,7 @@ USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_IO_SURF_MNH, ONLY : TOUT, TPINFILE, NMASK, NIU, NJU, NIB, NJB, NIE, NJE, &
                              NIU_ALL, NJU_ALL, NIB_ALL, NJB_ALL, NIE_ALL, NJE_ALL, NMASK_ALL
@@ -581,26 +614,16 @@ ILUOUT = TOUT%NLU
 !
 !
 !
-TZFIELD%CMNHNAME   = TRIM(HREC)
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HREC)
-TZFIELD%CUNITS     = ''
-TZFIELD%CCOMMENT   = '' !Expected comment is not known
-TZFIELD%NGRID      = 4
-TZFIELD%NTYPE      = TYPEREAL
 IF (HDIR=='H') THEN
   ALLOCATE(ZWORK(NIU,NJU,SIZE(PFIELD,2)))
-  TZFIELD%CDIR     = 'XY'
-  TZFIELD%NDIMS    = 3
+  CALL PREPARE_METADATA_READ_SURF(HREC,'XY',4,TYPEREAL,3,'READ_SURFX2_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
 ELSEIF (HDIR=='A') THEN
   ALLOCATE(ZWORK(NIU_ALL,NJU_ALL,SIZE(PFIELD,2)))
-  TZFIELD%CDIR     = '--'
-  TZFIELD%NDIMS    = 3
+  CALL PREPARE_METADATA_READ_SURF(HREC,'--',4,TYPEREAL,3,'READ_SURFX2_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK,KRESP)
 ELSE
-  TZFIELD%CDIR     = '--'
-  TZFIELD%NDIMS    = 2
+  CALL PREPARE_METADATA_READ_SURF(HREC,'--',4,TYPEREAL,2,'READ_SURFX2_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,PFIELD,KRESP)
 END IF
 !
@@ -677,6 +700,7 @@ USE MODE_FM
 USE MODE_FMREAD
 USE MODE_IO_ll
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_DATA_COVER_PAR, ONLY : JPCOVER
 USE MODD_CST,            ONLY : XPI
@@ -800,15 +824,7 @@ IF (.NOT. GCOVER_PACKED) THEN
     IF (IRESP/=0) KRESP=IRESP
   END DO
 ELSE
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = YDIR
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
+  CALL PREPARE_METADATA_READ_SURF(HREC,YDIR,4,TYPEREAL,3,'READ_SURFX2COV_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,ZWORK3D(:,:,:),KRESP)
 END IF
 !
@@ -1063,6 +1079,7 @@ USE MODE_FIELD,       ONLY: TFIELDDATA,TYPEINT
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_IO_SURF_MNH, ONLY : TOUT, TPINFILE, NMASK, &
                              NIU, NJU, NIB, NJB, NIE, NJE
@@ -1098,15 +1115,7 @@ IF (HREC=='DIM_FULL' .AND. ( CPROGRAM=='IDEAL ' .OR.  &
    CALL IO_READ_FIELD(TPINFILE,'JMAX',IJMAX)
    KFIELD = IIMAX * IJMAX
 ELSE
-   TZFIELD%CMNHNAME   = TRIM(HREC)
-   TZFIELD%CSTDNAME   = ''
-   TZFIELD%CLONGNAME  = TRIM(HREC)
-   TZFIELD%CUNITS     = ''
-   TZFIELD%CDIR       = '--'
-   TZFIELD%CCOMMENT   = '' !Expected comment is not known
-   TZFIELD%NGRID      = 0
-   TZFIELD%NTYPE      = TYPEINT
-   TZFIELD%NDIMS      = 0
+   CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPEINT,0,'READ_SURFN0_MNH',TZFIELD)
    CALL IO_READ_FIELD(TPINFILE,TZFIELD,KFIELD,KRESP)
 
     IF (KRESP /=0) THEN
@@ -1166,6 +1175,7 @@ USE MODE_FIELD,       ONLY: TFIELDDATA,TYPEINT
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_IO_SURF_MNH, ONLY : TOUT, TPINFILE, NMASK, &
                              NIU, NJU, NIB, NJB, NIE, NJE
@@ -1202,29 +1212,13 @@ ILUOUT = TOUT%NLU
 !
 IF (HDIR=='-') THEN
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 1
+  CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPEINT,1,'READ_SURFN1_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,KFIELD,KRESP)
 !
 ELSE IF (HDIR=='H') THEN
   ALLOCATE(IWORK(NIU,NJU))
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
+  CALL PREPARE_METADATA_READ_SURF(HREC,'XY',4,TYPEINT,2,'READ_SURFN1_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,IWORK,KRESP)
 !
  IF (KRESP /=0) THEN
@@ -1289,6 +1283,7 @@ USE MODE_FIELD,       ONLY : TFIELDDATA,TYPECHAR
 USE MODE_FMREAD
 USE MODE_MSG
 USE MODE_POS
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_IO_SURF_MNH, ONLY : TOUT, TPINFILE
 USE MODD_CONF,        ONLY : LCARTESIAN, CPROGRAM
@@ -1378,15 +1373,7 @@ CALL ABORT
      END IF
 
 ELSE
-   TZFIELD%CMNHNAME   = TRIM(HREC)
-   TZFIELD%CSTDNAME   = ''
-   TZFIELD%CLONGNAME  = TRIM(HREC)
-   TZFIELD%CUNITS     = ''
-   TZFIELD%CDIR       = '--'
-   TZFIELD%CCOMMENT   = '' !Expected comment is not known
-   TZFIELD%NGRID      = 0
-   TZFIELD%NTYPE      = TYPECHAR
-   TZFIELD%NDIMS      = 0
+   CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPECHAR,0,'READ_SURFC0_MNH',TZFIELD)
    CALL IO_READ_FIELD(TPINFILE,TZFIELD,HFIELD,KRESP)
    !
    IF (KRESP /=0) THEN
@@ -1453,6 +1440,7 @@ USE MODE_FIELD,       ONLY : TFIELDDATA,TYPEINT,TYPELOG
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODI_PACK_2D_1D
 !
@@ -1486,15 +1474,7 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','READ_SURFL1_MNH',TRIM(TPINFILE%CNAME)//': readi
 ILUOUT = TOUT%NLU
 !
 IF (HDIR=='-') THEN
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 1
+  CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPELOG,1,'READ_SURFL1_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,OFIELD,KRESP)
 
   IF (KRESP /=0) THEN
@@ -1509,15 +1489,7 @@ ELSE IF (HDIR=='H') THEN
   GWORK = .FALSE.
 !
   ALLOCATE(IWORK(NIU,NJU))
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = '' !Expected comment is not known
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
+  CALL PREPARE_METADATA_READ_SURF(HREC,'XY',4,TYPEINT,2,'READ_SURFL1_MNH',TZFIELD)
   CALL IO_READ_FIELD(TPINFILE,TZFIELD,IWORK,KRESP)
   WHERE (IWORK==1) GWORK = .TRUE.
   DEALLOCATE(IWORK)
@@ -1581,6 +1553,7 @@ USE MODE_FIELD,       ONLY : TFIELDDATA,TYPELOG
 USE MODE_FM
 USE MODE_FMREAD
 USE MODE_MSG
+USE MODE_READ_SURF_MNH_TOOLS
 !
 USE MODD_IO_SURF_MNH, ONLY : TOUT, TPINFILE
 !
@@ -1622,15 +1595,7 @@ IF (HREC=='ECOCLIMAP') THEN
   END IF
 END IF
 !
-TZFIELD%CMNHNAME   = TRIM(HREC)
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HREC)
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = '' !Expected comment is not known
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPELOG
-TZFIELD%NDIMS      = 0
+CALL PREPARE_METADATA_READ_SURF(HREC,'--',0,TYPELOG,0,'READ_SURFL0_MNH',TZFIELD)
 CALL IO_READ_FIELD(TPINFILE,TZFIELD,OFIELD,KRESP)
 HCOMMENT = TZFIELD%CCOMMENT
 !
diff --git a/src/MNH/write_surf_mnh.f90 b/src/MNH/write_surf_mnh.f90
index f06b38cc034427a7919d3be9142300a781781460..32d061917439cf76f7ec0d1156ae076ea57d807c 100644
--- a/src/MNH/write_surf_mnh.f90
+++ b/src/MNH/write_surf_mnh.f90
@@ -7,6 +7,92 @@
 !-----------------------------------------------------------------
 ! $Source$ $Revision$
 !-----------------------------------------------------------------
+MODULE MODE_WRITE_SURF_MNH_TOOLS
+
+CONTAINS
+
+SUBROUTINE PREPARE_METADATA_WRITE_SURF(HREC,HDIR,HCOMMENT,KGRID,KTYPE,KDIMS,HSUBR,TPFIELD)
+!
+USE MODE_FIELD, ONLY: FIND_FIELD_ID_FROM_MNHNAME, TFIELDDATA, TFIELDLIST
+USE MODE_MSG
+!
+CHARACTER(LEN=LEN_HREC),INTENT(IN)  :: HREC     ! name of the article to write
+CHARACTER(LEN=2),       INTENT(IN)  :: HDIR     ! Expected type of the data field (XX,XY,--...)
+CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
+INTEGER,                INTENT(IN)  :: KGRID    ! Localization on the model grid
+INTEGER,                INTENT(IN)  :: KTYPE    ! Datatype
+INTEGER,                INTENT(IN)  :: KDIMS    ! Number of dimensions
+CHARACTER(LEN=*),       INTENT(IN)  :: HSUBR    ! name of the subroutine calling
+TYPE(TFIELDDATA),       INTENT(OUT) :: TPFIELD  ! metadata of field
+!
+CHARACTER(LEN=32) :: YTXT
+INTEGER           :: IID, IRESP
+!
+CALL FIND_FIELD_ID_FROM_MNHNAME(TRIM(HREC),IID,IRESP,ONOWARNING=.TRUE.)
+IF (IRESP==0) THEN
+  TPFIELD = TFIELDLIST(IID)
+  !Modify and check CLONGNAME
+  IF (TRIM(TPFIELD%CLONGNAME)/=TRIM(HREC)) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CLONGNAME different ('//TRIM(TPFIELD%CLONGNAME) &
+                   //'/'//TRIM(HREC)//') than expected for article '//TRIM(HREC))
+    TPFIELD%CLONGNAME = TRIM(HREC)
+  END IF
+  !Modify and check CDIR
+  IF (TPFIELD%CDIR/=HDIR) THEN
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CDIR different ('//TRIM(TPFIELD%CDIR) &
+                   //'/'//TRIM(HDIR)//') than expected for article '//TRIM(HREC))
+    TPFIELD%CDIR = HDIR
+  END IF
+  !Modify and check CCOMMENT
+  IF (LEN_TRIM(HCOMMENT)/=0) THEN
+    IF (TRIM(TPFIELD%CCOMMENT)/=TRIM(HCOMMENT)) THEN
+      CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'CCOMMENT different ('//TRIM(TPFIELD%CCOMMENT) &
+                      //'/'//TRIM(HCOMMENT)//') than expected for article '//TRIM(HREC))
+      TPFIELD%CCOMMENT = TRIM(HCOMMENT)
+    END IF
+  ELSE
+    CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),'CCOMMENT was empty -> replaced by TPFIELD%CCOMMENT for article ' &
+                   //TRIM(HREC))
+  END IF
+  !Modify and check NGRID
+  IF (TPFIELD%NGRID/=KGRID) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NGRID,KGRID
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NGRID different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NGRID = KGRID
+  END IF
+  !Modify and check NTYPE
+  IF (TPFIELD%NTYPE/=KTYPE) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NTYPE,KTYPE
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NTYPE different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NTYPE = KTYPE
+  END IF
+  !Modify and check NDIMS
+  IF (TPFIELD%NDIMS/=KDIMS) THEN
+    WRITE(YTXT,'( I0,"/",I0 )') TPFIELD%NDIMS,KDIMS
+    CALL PRINT_MSG(NVERB_WARNING,'IO',TRIM(HSUBR),'NDIMS different ('//TRIM(YTXT) &
+                    //') than expected for article '//TRIM(HREC))
+    TPFIELD%NDIMS = KDIMS
+  END IF
+ELSE
+  CALL PRINT_MSG(NVERB_DEBUG,'IO',TRIM(HSUBR),TRIM(HREC)//' not found in FIELDLIST. Generating default metadata')
+  TPFIELD%CMNHNAME   = TRIM(HREC)
+  TPFIELD%CSTDNAME   = ''
+  TPFIELD%CLONGNAME  = TRIM(HREC)
+  TPFIELD%CUNITS     = ''
+  TPFIELD%CDIR       = HDIR
+  TPFIELD%CCOMMENT   = TRIM(HCOMMENT)
+  TPFIELD%NGRID      = KGRID
+  TPFIELD%NTYPE      = KTYPE
+  TPFIELD%NDIMS      = KDIMS
+END IF
+!
+END SUBROUTINE PREPARE_METADATA_WRITE_SURF
+
+END MODULE MODE_WRITE_SURF_MNH_TOOLS
+
+
 !     #############################################################
       SUBROUTINE WRITE_SURFX0_MNH(HREC,PFIELD,KRESP,HCOMMENT)
 !     #############################################################
@@ -58,6 +144,7 @@
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -74,6 +161,7 @@ CHARACTER(LEN=100),     INTENT(IN)  :: HCOMMENT ! Comment string
 !*      0.2   Declarations of local variables
 !
 CHARACTER(LEN=5) :: YMSG
+INTEGER          :: IID, IRESP
 TYPE(TFIELDDATA) :: TZFIELD
 !
 !-------------------------------------------------------------------------------
@@ -87,18 +175,10 @@ IF( ( HREC=='LAT0' .OR. HREC=='LON0' .OR. HREC=='RPK' .OR. HREC=='BETA'  &
     RETURN
 !
 ELSE
-!
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 0
-    TZFIELD%CLONGNAME  = TRIM(HREC)
+  !
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEREAL,0,'WRITE_SURFX0_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,PFIELD,KRESP)
-!
+  !
   IF (KRESP /=0) THEN
     WRITE ( YMSG, '( I5 )' ) KRESP
     CALL PRINT_MSG(NVERB_ERROR,'IO','WRITE_SURFX0_MNH','error when writing article '//TRIM(HREC)//' KRESP='//YMSG)
@@ -149,9 +229,10 @@ END SUBROUTINE WRITE_SURFX0_MNH
 !             ------------
 !
 USE MODE_IO_WRITE_FIELD
-USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
+USE MODE_FIELD,         ONLY: FIND_FIELD_ID_FROM_MNHNAME,TFIELDDATA,TFIELDLIST,TYPEREAL
 USE MODE_MSG
 USE MODE_TOOLS_ll
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -190,6 +271,7 @@ INTEGER           :: JILOOP,JJLOOP  ! loop indexes
 REAL, DIMENSION(:,:), ALLOCATABLE :: ZWORK  ! work array written in the file
 REAL, DIMENSION(:),   ALLOCATABLE :: ZW1D   ! 1D work array
 !
+INTEGER           :: IID, IRESP
 INTEGER           :: IIU, IJU, IIB, IJB, IIE, IJE ! dimensions of horizontal fields
 INTEGER, DIMENSION(:), ALLOCATABLE :: IMASK       ! mask for unpacking
 REAL              :: ZUNDEF                       ! undefined value in SURFEX
@@ -296,28 +378,14 @@ IF (      (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
   END IF
 !
   IF (HDIR=='A') THEN
-    TZFIELD%CMNHNAME   = 'XHAT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'XHAT'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
+    CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CDIR  = '--'
     CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)
   END IF
   IF (HDIR=='H') THEN
-    TZFIELD%CMNHNAME   = 'XHAT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'XHAT'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XX'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 2
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZW1D(1+NHALO:IIU-NHALO),KRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('XHAT',IID,IRESP)
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TFIELDLIST(IID),ZW1D(1+NHALO:IIU-NHALO),KRESP)
   END IF
   DEALLOCATE(ZW1D)
 ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
@@ -336,62 +404,24 @@ ELSE IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
     ZW1D(IJB+1) =   1.5 * ZWORK(1+JPHEXT,IJB)
   END IF
   IF (HDIR=='A') THEN
-    TZFIELD%CMNHNAME   = 'YHAT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'YHAT'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
+    CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
+    TZFIELD = TFIELDLIST(IID)
+    TZFIELD%CDIR  = '--'
     CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZW1D(:),KRESP)
   END IF
   IF (HDIR=='H') THEN
-    TZFIELD%CMNHNAME   = 'YHAT'
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = 'YHAT'
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'YY'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 3
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 1
-    CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZW1D(1+NHALO:IJU-NHALO),KRESP)
+    CALL FIND_FIELD_ID_FROM_MNHNAME('YHAT',IID,IRESP)
+    CALL IO_WRITE_FIELD(TFILE_SURFEX,TFIELDLIST(IID),ZW1D(1+NHALO:IJU-NHALO),KRESP)
   END IF
   DEALLOCATE(ZW1D)
 ELSE IF (HDIR=='H') THEN
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-    TZFIELD%CLONGNAME  = TRIM(HREC)
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO),KRESP)
 ELSE IF (HDIR=='A') THEN
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
-    TZFIELD%CLONGNAME  = TRIM(HREC)
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZWORK(:,:),KRESP)
 ELSE
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 1
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,1,'WRITE_SURFX1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,PFIELD(:),KRESP)
 END IF
 !
@@ -452,6 +482,7 @@ USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG,TYPEREAL
 USE MODE_MSG
 USE MODE_TOOLS_ll
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DATA_COVER_PAR,ONLY : JPCOVER
@@ -586,15 +617,7 @@ IF (.NOT. GCOVER_PACKED) THEN
     END IF
   END DO
 ELSE 
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = YDIR
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 3
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,YDIR,HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2COV_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZWORK3D(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),KRESP)
 END IF
 !
@@ -657,6 +680,7 @@ USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEREAL
 USE MODE_MSG
 USE MODE_TOOLS_ll
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DATA_COVER_PAR,ONLY : JPCOVER
@@ -732,27 +756,11 @@ IF (HDIR=='H' .OR. HDIR=='A') THEN
   WHERE (ZWORK==ZUNDEF) ZWORK=XUNDEF
 !
   IF (HDIR=='H') THEN
-    TZFIELD%CMNHNAME   = TRIM(HREC)
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(HREC)
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = 'XY'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
+    CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2_MNH',TZFIELD)
     CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZWORK(1+NHALO:IIU-NHALO,1+NHALO:IJU-NHALO,:),KRESP)
   END IF
   IF (HDIR=='A') THEN
-    TZFIELD%CMNHNAME   = TRIM(HREC)
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(HREC)
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 4
-    TZFIELD%NTYPE      = TYPEREAL
-    TZFIELD%NDIMS      = 3
+    CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,3,'WRITE_SURFX2_MNH',TZFIELD)
     CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZWORK(:,:,:),KRESP)
   END IF
 !
@@ -763,15 +771,7 @@ ELSE IF (HDIR=='-') THEN
   ZFIELD=PFIELD
   WHERE (ZFIELD==ZUNDEF) ZFIELD=XUNDEF
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEREAL
-  TZFIELD%NDIMS      = 2
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,4,TYPEREAL,2,'WRITE_SURFX2_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,ZFIELD(:,:),KRESP)
 !
   DEALLOCATE(ZFIELD)
@@ -829,6 +829,7 @@ END SUBROUTINE WRITE_SURFX2_MNH
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -866,15 +867,7 @@ ELSE
   IF (HREC=='IMAX') IFIELD = NIU_ALL-2*JPHEXT
   IF (HREC=='JMAX') IFIELD = NJU_ALL-2*JPHEXT
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 0
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEINT,0,'WRITE_SURFN0_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,IFIELD,KRESP)
 END IF
 !
@@ -930,6 +923,7 @@ END SUBROUTINE WRITE_SURFN0_MNH
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
 USE MODD_IO_SURF_MNH,   ONLY: NMASK, CMASK, &
@@ -964,15 +958,7 @@ CALL PRINT_MSG(NVERB_DEBUG,'IO','WRITE_SURFN1_MNH',TRIM(TFILE_SURFEX%CNAME)//':
 !
 IF (HDIR=='-') THEN
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 1
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEINT,1,'WRITE_SURFN1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,KFIELD,KRESP)
 !
 ELSE IF (HDIR=='H') THEN
@@ -982,15 +968,7 @@ ELSE IF (HDIR=='H') THEN
 !
   CALL UNPACK_1D_2D(NMASK,KFIELD,IWORK(NIB:NIE,NJB:NJE))
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEINT,2,'WRITE_SURFN1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,IWORK(:,:),KRESP)
 !
   DEALLOCATE(IWORK)
@@ -1047,6 +1025,7 @@ END SUBROUTINE WRITE_SURFN1_MNH
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPECHAR,TYPELOG
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -1096,15 +1075,7 @@ IF ( (CSTORAGE_TYPE=='PG' .OR. CSTORAGE_TYPE=='SU')  &
   !
 END IF
 !
-TZFIELD%CMNHNAME   = TRIM(HREC)
-TZFIELD%CSTDNAME   = ''
-TZFIELD%CLONGNAME  = TRIM(HREC)
-TZFIELD%CUNITS     = ''
-TZFIELD%CDIR       = '--'
-TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-TZFIELD%NGRID      = 0
-TZFIELD%NTYPE      = TYPECHAR
-TZFIELD%NDIMS      = 0
+CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPECHAR,0,'WRITE_SURFC0_MNH',TZFIELD)
 CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,HFIELD,KRESP)
 !
 IF (KRESP /=0) THEN
@@ -1158,6 +1129,7 @@ END SUBROUTINE WRITE_SURFC0_MNH
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPEINT,TYPELOG
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -1197,15 +1169,7 @@ IF (HDIR=='-') THEN
                    TRIM(CMASK)//' not written in file by externalized surface')
     RETURN
   ELSE
-    TZFIELD%CMNHNAME   = TRIM(HREC)
-    TZFIELD%CSTDNAME   = ''
-    TZFIELD%CLONGNAME  = TRIM(HREC)
-    TZFIELD%CUNITS     = ''
-    TZFIELD%CDIR       = '--'
-    TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-    TZFIELD%NGRID      = 0
-    TZFIELD%NTYPE      = TYPELOG
-    TZFIELD%NDIMS      = 1
+    CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPELOG,1,'WRITE_SURFL1_MNH',TZFIELD)
     CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,OFIELD(:),KRESP)
   END IF
 !
@@ -1220,15 +1184,7 @@ ELSE IF (HDIR=='H') THEN
   IWORK = 0
   WHERE(GWORK) IWORK = 1
 !
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = 'XY'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 4
-  TZFIELD%NTYPE      = TYPEINT
-  TZFIELD%NDIMS      = 2
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'XY',HCOMMENT,4,TYPEINT,2,'WRITE_SURFL1_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,IWORK(:,:),KRESP)
   !
   DEALLOCATE(IWORK)
@@ -1287,6 +1243,7 @@ END SUBROUTINE WRITE_SURFL1_MNH
 USE MODE_IO_WRITE_FIELD
 USE MODE_FIELD,         ONLY: TFIELDDATA,TYPELOG
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -1313,15 +1270,7 @@ IF( (CMASK /= 'FULL  ').AND. (HREC=='COVER') ) THEN
                  TRIM(CMASK)//' not written in file by externalized surface')
   RETURN
 ELSE
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPELOG
-  TZFIELD%NDIMS      = 0
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPELOG,0,'WRITE_SURFL0_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,OFIELD,KRESP)
 END IF
 !
@@ -1377,6 +1326,7 @@ USE MODE_FIELD,       ONLY: TFIELDDATA, TYPEDATE
 USE MODE_FM
 USE MODE_FMWRIT
 USE MODE_MSG
+USE MODE_WRITE_SURF_MNH_TOOLS
 !
 USE MODD_CONF_n,      ONLY : CSTORAGE_TYPE
 USE MODD_IO_ll,         ONLY: TFILE_SURFEX
@@ -1414,16 +1364,7 @@ ELSE
   TZDATA%TDATE = DATE(KYEAR,KMONTH,KDAY)
   TZDATA%TIME  = PTIME
   !  
-  TZFIELD%CMNHNAME   = TRIM(HREC)
-  TZFIELD%CSTDNAME   = ''
-  TZFIELD%CLONGNAME  = TRIM(HREC)
-  TZFIELD%CUNITS     = ''
-  TZFIELD%CDIR       = '--'
-  TZFIELD%CCOMMENT   = TRIM(HCOMMENT)
-  TZFIELD%NGRID      = 0
-  TZFIELD%NTYPE      = TYPEDATE
-  TZFIELD%NDIMS      = 0
-  !
+  CALL PREPARE_METADATA_WRITE_SURF(HREC,'--',HCOMMENT,0,TYPEDATE,0,'WRITE_SURFT0_MNH',TZFIELD)
   CALL IO_WRITE_FIELD(TFILE_SURFEX,TZFIELD,TZDATA,KRESP)
 END IF
 !