diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
index 15bb499d2ca93f21606dbcee61087753ef7c4230..f0eb696c9f4b2049de9afd5db3a7581f3966fbef 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_read.f90
@@ -114,8 +114,8 @@ end subroutine IO_Format_read_select
 
 
 SUBROUTINE IO_Field_metadata_bcast(TPFILE,TPFIELD)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
 !
 INTEGER :: IERR
 !
@@ -159,10 +159,10 @@ SUBROUTINE IO_Field_read_byfield_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 USE MODD_IO,        ONLY: ISP,GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD   ! data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+REAL,                  INTENT(INOUT) :: PFIELD   ! data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -238,13 +238,13 @@ USE MODD_STRUCTURE_ll, ONLY: ZONE_ll
 USE MODE_SCATTER_ll
 USE MODE_ALLOCBUFFER_ll
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
-INTEGER,OPTIONAL, INTENT(IN)    :: KIMAX_ll
-INTEGER,OPTIONAL, INTENT(IN)    :: KJMAX_ll
-TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:), INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
+INTEGER, OPTIONAL,     INTENT(IN)    :: KIMAX_ll
+INTEGER, OPTIONAL,     INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING  ! splitting of the domain
 !
 INTEGER                      :: IERR
 REAL,DIMENSION(:),POINTER    :: ZFIELDP
@@ -349,13 +349,13 @@ USE MODD_ARGSLIST_ll, ONLY : LIST_ll
 USE MODE_ll         , ONLY : ADD2DFIELD_ll,UPDATE_HALO_ll,CLEANLIST_ll
 #endif
 !
-TYPE(TFILEDATA),           INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),          INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,         INTENT(OUT)   :: KRESP    ! return-code
-INTEGER, OPTIONAL,         INTENT(IN)    :: KIMAX_ll
-INTEGER, OPTIONAL,         INTENT(IN)    :: KJMAX_ll
-TYPE(ZONE_ll),DIMENSION(ISNPROC),OPTIONAL,INTENT(IN) :: TPSPLITTING  ! splitting of the domain
+TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),           INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
+INTEGER, OPTIONAL,               INTENT(IN)    :: KIMAX_ll
+INTEGER, OPTIONAL,               INTENT(IN)    :: KJMAX_ll
+TYPE(ZONE_ll), DIMENSION(ISNPROC), OPTIONAL, INTENT(IN) :: TPSPLITTING  ! splitting of the domain
 !
 INTEGER                      :: IERR
 real                             :: zfieldp0d
@@ -367,7 +367,7 @@ INTEGER                      :: IRESP
 INTEGER                      :: IHEXTOT
 REAL(kind=MNHTIME), DIMENSION(2) :: ZT0, ZT1, ZT2
 REAL(kind=MNHTIME), DIMENSION(2) :: ZT11, ZT22
-type(tfielddata)                 :: tzfield
+class(tfieldmetadata),allocatable :: tzfield
 #ifdef MNH_GA
 REAL,DIMENSION(:,:),POINTER  :: ZFIELD_GA
 TYPE(LIST_ll)      ,POINTER  :: TZFIELD_ll
@@ -389,8 +389,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -400,7 +400,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp0d, iresp )
         pfield(:, :) = Spread( Spread( zfieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -410,8 +409,8 @@ IF (IRESP==0) THEN
         pfield(:, :) = Spread( Spread( pfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -422,7 +421,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp1d, iresp )
         pfield(:, :) = Spread( pfield(:, jphext + 1), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -558,10 +556,10 @@ USE MODE_IO_MANAGE_STRUCT, ONLY: IO_File_find_byname
 USE MODE_MNH_TIMING,       ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),TARGET,      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),            INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,           INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA), TARGET,       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),         INTENT(INOUT) :: TPFIELD
+REAL,DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
 !
 TYPE TX_2DP
    REAL,DIMENSION(:,:), POINTER :: X
@@ -588,7 +586,7 @@ CHARACTER(LEN=2)                      :: YDIR
 CHARACTER(LEN=4)                      :: YK
 CHARACTER(LEN=NMNHNAMELGTMAX+4)       :: YRECZSLICE
 CHARACTER(LEN=4)                      :: YSUFFIX
-type(tfielddata)                      :: tzfield
+class(tfieldmetadata), allocatable    :: tzfield
 TYPE(TFILEDATA),POINTER               :: TZFILE
 TYPE(TX_2DP),ALLOCATABLE,DIMENSION(:) :: T_TX2DP
 #ifdef MNH_GA
@@ -615,8 +613,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC  .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -629,7 +627,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), &
                                   dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -640,8 +637,8 @@ IF (IRESP==0) THEN
                                   dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -653,7 +650,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp2d, iresp )
         pfield(:, :, :) = Spread( pfield(:, jphext + 1, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -717,6 +713,7 @@ IF (IRESP==0) THEN
     ALLOCATE(ZSLICE_ll(0,0)) ! to avoid bug on test of size
     GALLOC_ll = .TRUE.
     IRESP_ISP=0
+    Allocate( tzfield, mold = tpfield )
     DO JKK=1,SIZE(PFIELD,3) ! IKU_ll
       IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ)
       TZFILE => TPFILE%TFILES_IOZ(IK_FILE+1)%TFILE
@@ -783,6 +780,7 @@ IF (IRESP==0) THEN
       JK_MAX=MIN(SIZE(PFIELD,3),JK+INB_PROC_REAL-1)
       !
       INB_REQ=0
+      Allocate( tzfield, mold = tpfield )
       DO JKK=JK,JK_MAX
         IF (TPFILE%NSUBFILES_IOZ .GT. 1 ) THEN
           IK_FILE = IO_Level2filenumber_get(JKK,TPFILE%NSUBFILES_IOZ)
@@ -947,10 +945,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),               INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),              INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,             INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                  INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),            INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                          :: IERR
 real, dimension(:,:),    pointer  :: zfieldp2d
@@ -960,7 +958,7 @@ LOGICAL                          :: GALLOC
 logical                          :: glfi, gnc4
 INTEGER                          :: IRESP
 INTEGER                          :: IHEXTOT
-type(tfielddata)                 :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X4',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -976,8 +974,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -991,7 +989,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :), dim = 1, ncopies = ihextot ), &
                                      dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1002,8 +999,8 @@ IF (IRESP==0) THEN
                                      dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1016,7 +1013,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp3d, iresp )
         pfield(:, :, :, :) = Spread( pfield(:, jphext + 1, :, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1106,10 +1102,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),                 INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                            :: IERR
 real, dimension(:,:,:),    pointer  :: zfieldp3d
@@ -1119,7 +1115,7 @@ LOGICAL                            :: GALLOC
 logical                            :: glfi, gnc4
 INTEGER                            :: IRESP
 INTEGER                            :: IHEXTOT
-type(tfielddata)                   :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_X5',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1135,8 +1131,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( pfield, 1 ) == ihextot .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -1151,7 +1147,6 @@ IF (IRESP==0) THEN
         pfield(:, :, :, :, :) = Spread( Spread( pfield(jphext + 1, jphext + 1, :, :, :), dim = 1, ncopies = ihextot ), &
                                         dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1162,8 +1157,8 @@ IF (IRESP==0) THEN
                                         dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( pfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1177,7 +1172,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, zfieldp4d, iresp )
         pfield(:, :, :, :, :) = Spread( pfield(:, jphext + 1, :, :, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1266,10 +1260,10 @@ USE MODE_ALLOCBUFFER_ll
 USE MODE_MNH_TIMING,     ONLY: SECOND_MNH2
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                   INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                  INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(INOUT) :: PFIELD   ! array containing the data field
-INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                         INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),                   INTENT(INOUT) :: TPFIELD
+REAL,    DIMENSION(:,:,:,:,:,:), TARGET, INTENT(INOUT) :: PFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                       INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                              :: IERR
 REAL,DIMENSION(:,:,:,:,:,:),POINTER  :: ZFIELDP
@@ -1356,10 +1350,10 @@ SUBROUTINE IO_Field_read_byfield_N0(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP,GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-INTEGER,          INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+INTEGER,               INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1427,10 +1421,10 @@ USE MODD_IO, ONLY: ISP, GSMONOPROC
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:), INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1518,10 +1512,10 @@ USE MODD_TIMEZ,         ONLY: TIMEZ
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),              INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),             INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:),TARGET,INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER, OPTIONAL,            INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                 INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),           INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:), TARGET, INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,               INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                         :: IERR
 integer                          :: ifieldp0d
@@ -1531,7 +1525,7 @@ LOGICAL                         :: GALLOC
 logical                         :: glfi, gnc4
 INTEGER                         :: IRESP
 INTEGER                         :: IHEXTOT
-type(tfielddata)                :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N2',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1547,8 +1541,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -1558,7 +1552,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp0d, iresp )
         kfield(:, :) = Spread( Spread( ifieldp0d, dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1568,8 +1561,8 @@ IF (IRESP==0) THEN
         kfield(:, :) = Spread( Spread( kfield(jphext + 1, jphext + 1), dim = 1, ncopies = ihextot ), dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -1580,7 +1573,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp1d, iresp )
         kfield(:, :) = Spread( kfield(:, jphext + 1), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1672,10 +1664,10 @@ USE MODD_TIMEZ,         ONLY: TIMEZ
 USE MODE_ALLOCBUFFER_ll
 USE MODE_SCATTER_ll
 !
-TYPE(TFILEDATA),                INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),               INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:,:),TARGET,INTENT(INOUT) :: KFIELD   ! array containing the data field
-INTEGER, OPTIONAL,              INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),                   INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),             INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:,:), TARGET, INTENT(INOUT) :: KFIELD   ! array containing the data field
+INTEGER, OPTIONAL,                 INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                           :: IERR
 integer, dimension(:),     pointer :: ifieldp1d
@@ -1685,7 +1677,7 @@ LOGICAL                           :: GALLOC
 logical                           :: glfi, gnc4
 INTEGER                           :: IRESP
 INTEGER                           :: IHEXTOT
-type(tfielddata)                  :: tzfield
+class(tfieldmetadata), allocatable :: tzfield
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_N3',TRIM(TPFILE%CNAME)//': reading '//TRIM(TPFIELD%CMNHNAME))
 !
@@ -1701,8 +1693,8 @@ call IO_Format_read_select( tpfile, glfi, gnc4 )
 IF (IRESP==0) THEN
   IF (GSMONOPROC) THEN ! sequential execution
     if ( lpack .and. l1d .and. Size( kfield, 1 ) == ihextot .and. Size( kfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 2
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -1715,7 +1707,6 @@ IF (IRESP==0) THEN
         kfield(:, :, :) = Spread( Spread( kfield(jphext + 1, jphext + 1, :), dim = 1, ncopies = ihextot ), &
                                   dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(1:2) = NMNHDIM_ONE
         end if
@@ -1726,8 +1717,8 @@ IF (IRESP==0) THEN
                                   dim = 2, ncopies = ihextot )
       endif
     else if ( lpack .and. l2d .and. Size( kfield, 2 ) == ihextot ) then
+      Allocate( tzfield, source = tpfield )
       if ( tpfile%ldimreduced ) then
-        tzfield = tpfield
         tzfield%ndims = tzfield%ndims - 1
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1739,7 +1730,6 @@ IF (IRESP==0) THEN
         if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ifieldp2d, iresp )
         kfield(:, :, :) = Spread( kfield(:, jphext + 1, :), dim = 2, ncopies = ihextot )
       else
-        tzfield = tpfield
         if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
           tzfield%ndimlist(2)  = NMNHDIM_ONE
         end if
@@ -1825,10 +1815,10 @@ SUBROUTINE IO_Field_read_byfield_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-LOGICAL,          INTENT(INOUT) :: OFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+LOGICAL,               INTENT(INOUT) :: OFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1893,10 +1883,10 @@ SUBROUTINE IO_Field_read_byfield_L1(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD   ! array containing the data field
-INTEGER,OPTIONAL,    INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -1961,10 +1951,10 @@ SUBROUTINE IO_Field_read_byfield_C0(TPFILE,TPFIELD,HFIELD,KRESP)
 !
 USE MODD_IO, ONLY: ISP, GSMONOPROC
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),      INTENT(INOUT) :: HFIELD   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -2032,10 +2022,10 @@ SUBROUTINE IO_Field_read_byfield_T0(TPFILE,TPFIELD,TPDATA,KRESP)
 use modd_io,        only: ISP, GSMONOPROC
 use modd_type_date, only: DATE_TIME
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA   ! array containing the data field
-INTEGER,OPTIONAL, INTENT(OUT)   :: KRESP    ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA), INTENT(INOUT) :: TPFIELD
+TYPE(DATE_TIME),       INTENT(INOUT) :: TPDATA   ! array containing the data field
+INTEGER, OPTIONAL,     INTENT(OUT)   :: KRESP    ! return-code
 !
 INTEGER                      :: IERR
 INTEGER                      :: IRESP
@@ -2118,12 +2108,12 @@ USE MODE_DISTRIB_lb
 USE MODE_MNH_TIMING,    ONLY: SECOND_MNH2
 USE MODE_TOOLS_ll,      ONLY: GET_GLOBALDIMS_ll
 !
-TYPE(TFILEDATA),               INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),              INTENT(INOUT) :: TPFIELD
-INTEGER,                       INTENT(IN)    :: KL3D    ! size of the LB array in FM
-INTEGER,                       INTENT(IN)    :: KRIM    ! size of the LB area
-REAL, DIMENSION(:,:,:),TARGET, INTENT(INOUT) :: PLB     ! array containing the LB field
-INTEGER,OPTIONAL,              INTENT(OUT)   :: KRESP   ! return-code
+TYPE(TFILEDATA),                  INTENT(IN)    :: TPFILE
+CLASS(TFIELDMETADATA),            INTENT(INOUT) :: TPFIELD
+INTEGER,                          INTENT(IN)    :: KL3D    ! size of the LB array in FM
+INTEGER,                          INTENT(IN)    :: KRIM    ! size of the LB area
+REAL,   DIMENSION(:,:,:) ,TARGET, INTENT(INOUT) :: PLB     ! array containing the LB field
+INTEGER,OPTIONAL,                 INTENT(OUT)   :: KRESP   ! return-code
 !
 !*      0.2   Declarations of local variables
 !
@@ -2147,7 +2137,7 @@ real, dimension(:,:),  pointer           :: ZTX2DP
 REAL,DIMENSION(:,:,:), POINTER           :: TX3DP
 REAL(kind=MNHTIME), DIMENSION(2)         :: ZT0, ZT1, ZT2, ZT3
 REAL(kind=MNHTIME), DIMENSION(2)         :: ZT11, ZT22
-type(tfielddata)                         :: tzfield
+class(tfieldmetadata), allocatable       :: tzfield
 TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:)    :: T_TX3DP
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_read_byfield_lb','reading '//TRIM(TPFIELD%CMNHNAME))
@@ -2175,8 +2165,8 @@ IF (IRESP==0) THEN
     IF (YLBTYPE == 'LBX' .OR. YLBTYPE == 'LBXU') THEN
       ALLOCATE(Z3D(KL3D,SIZE(PLB,2),SIZE(PLB,3)))
       IF (LPACK .AND. L2D) THEN
+        Allocate( tzfield, source = tpfield )
         if ( tpfile%ldimreduced ) then
-          tzfield = tpfield
           tzfield%ndims = tzfield%ndims - 1
           if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
             tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -2188,7 +2178,6 @@ IF (IRESP==0) THEN
           if ( glfi ) call IO_Field_read_lfi( tpfile, tzfield, ZTX2DP, iresp )
           Z3D(:,:,:) = SPREAD(Z3D(:,JPHEXT+1,:),DIM=2,NCOPIES=IHEXTOT)
         else
-          tzfield = tpfield
           if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
           TX3DP=>Z3D(:,JPHEXT+1:JPHEXT+1,:)
           if ( gnc4 ) call IO_Field_read_nc4( tpfile, tzfield, tx3dp, iresp )
diff --git a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90 b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
index b48a37b2649d4d8ae06964e24a736db43439cbaf..da38896296cf4494e4dd2d248b55eb15651e5a98 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_field_write.f90
@@ -25,7 +25,8 @@
 
 MODULE MODE_IO_FIELD_WRITE
 
-  use modd_field,        only: tfielddata, tfieldlist, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
+  use modd_field,        only: tfieldlist, tfieldmetadata, tfieldmetadata_base, &
+                               TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TYPEREAL
   USE MODD_IO,         ONLY: TFILEDATA, TOUTBAK
   USE MODD_MPIF
   use modd_parameters, only: NMNHNAMELGTMAX
@@ -81,10 +82,10 @@ MODULE MODE_IO_FIELD_WRITE
 CONTAINS 
 
   SUBROUTINE IO_Field_metadata_check(TPFIELD,KTYPE,KDIMS,HCALLER)
-    TYPE(TFIELDDATA), INTENT(IN) :: TPFIELD ! Field to check
-    INTEGER,          INTENT(IN) :: KTYPE   ! Expected datatype
-    INTEGER,          INTENT(IN) :: KDIMS   ! Expected number of dimensions
-    CHARACTER(LEN=*), INTENT(IN) :: HCALLER ! name of the calling subroutine
+    CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD ! Field to check
+    INTEGER,                    INTENT(IN) :: KTYPE   ! Expected datatype
+    INTEGER,                    INTENT(IN) :: KDIMS   ! Expected number of dimensions
+    CHARACTER(LEN=*),           INTENT(IN) :: HCALLER ! name of the calling subroutine
     !
     CHARACTER(LEN=2) :: YDIMOK,YDIMKO
     CHARACTER(LEN=8) :: YTYPEOK,YTYPEKO
@@ -177,13 +178,13 @@ CONTAINS
   subroutine IO_Field_write_error_check( tpfile, tpfield, hsubr, kresp_in, kresp_lfi, kresp_nc4, kresp_out )
     use modd_io, only: gsmonoproc
 
-    type(tfiledata),  intent(in)  :: tpfile
-    type(tfielddata), intent(in)  :: tpfield
-    character(len=*), intent(in)  :: hsubr
-    integer,          intent(in)  :: kresp_in
-    integer,          intent(in)  :: kresp_lfi
-    integer,          intent(in)  :: kresp_nc4
-    integer,          intent(out) :: kresp_out
+    type(tfiledata),            intent(in)  :: tpfile
+    class(tfieldmetadata_base), intent(in)  :: tpfield
+    character(len=*),           intent(in)  :: hsubr
+    integer,                    intent(in)  :: kresp_in
+    integer,                    intent(in)  :: kresp_lfi
+    integer,                    intent(in)  :: kresp_nc4
+    integer,                    intent(out) :: kresp_out
 
     character(len=:), allocatable :: ymsg
     character(len=6)              :: yresp
@@ -311,14 +312,14 @@ subroutine IO_Field_create( tpfile, tpfield )
   use modd_field
   use modd_io,            only: gsmonoproc, isp
 
-  type(tfiledata),  intent(in) :: tpfile
-  type(tfielddata), intent(in) :: tpfield
+  type(tfiledata),       intent(in) :: tpfile
+  class(tfieldmetadata), intent(in) :: tpfield
 
-  integer                  :: ik_file
-  integer                  :: iresp
-  logical                  :: glfi, gnc4
-  type(tfielddata)         :: tzfield
-  type(tfiledata), pointer :: tzfile
+  integer                            :: ik_file
+  integer                            :: iresp
+  logical                            :: glfi, gnc4
+  class(tfieldmetadata), allocatable :: tzfield
+  type(tfiledata),       pointer     :: tzfile
 
   call Print_msg( NVERB_DEBUG, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': creating ' // Trim( tpfield%cmnhname ) )
 
@@ -340,7 +341,7 @@ subroutine IO_Field_create( tpfile, tpfield )
   end if
 
   if ( iresp == 0 ) then
-    tzfield = tpfield
+    Allocate( tzfield, source = tpfield )
 
     if ( All( tzfield%ntype /= [ TYPEINT, TYPELOG, TYPEREAL, TYPECHAR, TYPEDATE ] ) ) then
       call Print_msg( NVERB_ERROR, 'IO', 'IO_Field_create', Trim( tpfile%cname ) // ': ' &
@@ -443,8 +444,8 @@ subroutine IO_Ndimlist_reduce( tpfile, tpfield )
   use modd_io,            only: gsmonoproc, l1d, l2d, lpack
   use modd_parameters_ll, only: jphext
 
-  type(tfiledata),  intent(in)    :: tpfile
-  type(tfielddata), intent(inout) :: tpfield
+  type(tfiledata),            intent(in)    :: tpfile
+  class(tfieldmetadata_base), intent(inout) :: tpfield
 
   integer :: ihextot
   integer :: ji
@@ -529,7 +530,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(IN) :: TPFIELD
     REAL,TARGET,                 INTENT(IN) :: PFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
     !
@@ -632,7 +633,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),                INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:),TARGET,             INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                    OPTIONAL, INTENT(OUT) :: KRESP    ! return-code
     integer, dimension(1),      optional, intent(in)  :: koffset
@@ -762,7 +763,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),                INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:,:),TARGET,           INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                    OPTIONAL, INTENT(OUT) :: KRESP    ! return-code
     integer, dimension(2),      optional, intent(in)  :: koffset
@@ -790,7 +791,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -821,8 +822,8 @@ end subroutine IO_Ndimlist_reduce
       IF (GSMONOPROC) THEN ! sequential execution
          !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -839,7 +840,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp0d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -854,8 +854,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -871,7 +871,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = NMNHDIM_ONE
             end if
@@ -1021,7 +1020,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),TARGET,                 INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                       INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),                  INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:,:,:),TARGET,           INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                      OPTIONAL, INTENT(OUT) :: KRESP    ! return-code
     integer, dimension(3),        optional, intent(in)  :: koffset
@@ -1064,7 +1063,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     TYPE(TFILEDATA),POINTER                  :: TZFILE
     !
     TZFILE => NULL()
@@ -1102,8 +1101,8 @@ end subroutine IO_Ndimlist_reduce
       IF (GSMONOPROC .AND. TPFILE%NSUBFILES_IOZ==0 ) THEN ! sequential execution
           !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -1120,7 +1119,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp1d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -1134,8 +1132,8 @@ end subroutine IO_Ndimlist_reduce
             end if
           endif
         ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1153,7 +1151,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             zfieldp => pfield(:, jphext + 1 : jphext + 1, :)
             if ( Present ( koffset ) ) then
@@ -1486,7 +1483,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                          INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                         INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),                    INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:,:,:,:),TARGET,           INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                        OPTIONAL, INTENT(OUT) :: KRESP    ! return-code
     integer, dimension(4),          optional, intent(in)  :: koffset
@@ -1509,7 +1506,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -1539,8 +1536,8 @@ end subroutine IO_Ndimlist_reduce
       IF (GSMONOPROC) THEN ! sequential execution
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -1559,7 +1556,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp2d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -1574,8 +1570,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1595,7 +1591,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :)
             if ( Present( koffset ) ) then
@@ -1701,7 +1696,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                 INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),                INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),           INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD   ! array containing the data field
     INTEGER,OPTIONAL,                INTENT(OUT):: KRESP    ! return-code 
     !
@@ -1721,7 +1716,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -1746,8 +1741,8 @@ end subroutine IO_Ndimlist_reduce
       IF (GSMONOPROC) THEN ! sequential execution
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==IHEXTOT .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -1760,7 +1755,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp3d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp3d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -1770,8 +1764,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -1784,7 +1778,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp4d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, zfieldp4d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             zfieldp => pfield(:, jphext + 1 : jphext + 1, :, :, :)
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, zfieldp, iresp_lfi )
@@ -1874,7 +1867,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                   INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),                  INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),             INTENT(IN)  :: TPFIELD
     REAL,DIMENSION(:,:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD   ! array containing the data field
     INTEGER,OPTIONAL,                  INTENT(OUT):: KRESP    ! return-code 
     !
@@ -1985,7 +1978,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(IN) :: TPFIELD
     INTEGER,                     INTENT(IN) :: KFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2077,7 +2070,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),              INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),             INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),        INTENT(IN)  :: TPFIELD
     INTEGER,DIMENSION(:),TARGET,  INTENT(IN) :: KFIELD   ! array containing the data field
     INTEGER,OPTIONAL,             INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2189,7 +2182,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),              INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),             INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),        INTENT(IN)  :: TPFIELD
     INTEGER,DIMENSION(:,:),TARGET,INTENT(IN) :: KFIELD   ! array containing the data field
     INTEGER,OPTIONAL,             INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2212,7 +2205,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -2238,8 +2231,8 @@ end subroutine IO_Ndimlist_reduce
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -2249,7 +2242,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp0d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp0d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -2259,8 +2251,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3) !Necessary if time dimension
@@ -2270,7 +2262,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = NMNHDIM_ONE
             end if
@@ -2370,7 +2361,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),          INTENT(IN)  :: TPFIELD
     INTEGER,DIMENSION(:,:,:),TARGET,INTENT(IN) :: KFIELD   ! array containing the data field
     INTEGER,OPTIONAL,               INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2392,7 +2383,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -2418,8 +2409,8 @@ end subroutine IO_Ndimlist_reduce
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN ! sequential execution
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -2430,7 +2421,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp1d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp1d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -2440,8 +2430,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -2452,7 +2442,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp2d, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             ifieldp => kfield(:, jphext + 1 : jphext + 1, :)
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ifieldp, iresp_lfi )
@@ -2548,7 +2537,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                             INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                            INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),                       INTENT(IN)  :: TPFIELD
     INTEGER,DIMENSION(:,:,:,:),TARGET,           INTENT(IN)  :: KFIELD   ! array containing the data field
     INTEGER,                           OPTIONAL, INTENT(OUT) :: KRESP    ! return-code
     integer, dimension(4),             optional, intent(in)  :: koffset
@@ -2571,7 +2560,7 @@ end subroutine IO_Ndimlist_reduce
     INTEGER                                  :: IHEXTOT
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -2601,8 +2590,8 @@ end subroutine IO_Ndimlist_reduce
       IF (GSMONOPROC) THEN ! sequential execution
         !    IF (LPACK .AND. L1D .AND. YDIR=='XY') THEN
         IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==IHEXTOT .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 2
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1)  = tzfield%ndimlist(3)
@@ -2621,7 +2610,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp2d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(1:2) = NMNHDIM_ONE
             end if
@@ -2636,8 +2624,8 @@ end subroutine IO_Ndimlist_reduce
           endif
              !    ELSE IF (LPACK .AND. L2D .AND. YDIR=='XY') THEN
         ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==IHEXTOT) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -2657,7 +2645,6 @@ end subroutine IO_Ndimlist_reduce
               if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ifieldp3d, iresp_nc4 )
             end if
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             ifieldp => kfield(:, jphext + 1 : jphext + 1, :, :)
             if ( Present( koffset ) ) then
@@ -2757,7 +2744,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(IN)  :: TPFIELD
     LOGICAL,                     INTENT(IN) :: OFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2849,7 +2836,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),              INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),             INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),        INTENT(IN)  :: TPFIELD
     LOGICAL,DIMENSION(:),TARGET,  INTENT(IN) :: OFIELD   ! array containing the data field
     INTEGER,OPTIONAL,             INTENT(OUT):: KRESP    ! return-code 
     !
@@ -2956,7 +2943,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(IN)  :: TPFIELD
     CHARACTER(LEN=*),            INTENT(IN) :: HFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
     !
@@ -3036,7 +3023,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),              INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),             INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),        INTENT(IN)  :: TPFIELD
     CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD   ! array containing the data field
     INTEGER,OPTIONAL,             INTENT(OUT):: KRESP    ! return-code 
     !
@@ -3140,7 +3127,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(IN)  :: TPFIELD
     TYPE (DATE_TIME),            INTENT(IN) :: TFIELD   ! array containing the data field
     INTEGER,OPTIONAL,            INTENT(OUT):: KRESP    ! return-code 
     !
@@ -3217,7 +3204,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),               INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),              INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),         INTENT(IN)  :: TPFIELD
     TYPE (DATE_TIME),DIMENSION(:), INTENT(IN) :: TFIELD   ! array containing the data field
     INTEGER,OPTIONAL,              INTENT(OUT):: KRESP    ! return-code
     !
@@ -3297,7 +3284,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),             INTENT(IN)    :: TPFILE
-    TYPE(TFIELDDATA),            INTENT(INOUT) :: TPFIELD
+    CLASS(TFIELDMETADATA),       INTENT(INOUT) :: TPFIELD
     INTEGER,                     INTENT(IN)    :: KL3D   ! size of the LB array in FM
     REAL,DIMENSION(:,:,:),TARGET,INTENT(IN)    :: PLB    ! array containing the LB field
     INTEGER,OPTIONAL,            INTENT(OUT)   :: KRESP  ! return-code 
@@ -3326,7 +3313,7 @@ end subroutine IO_Ndimlist_reduce
     TYPE(TX_3DP),ALLOCATABLE,DIMENSION(:)    :: T_TX3DP
     CHARACTER(LEN=:),ALLOCATABLE             :: YMSG
     CHARACTER(LEN=6)                         :: YRESP
-    type(tfielddata)                         :: tzfield
+    class(tfieldmetadata), allocatable       :: tzfield
     !
     YFILEM   = TPFILE%CNAME
     YRECFM   = TPFIELD%CMNHNAME
@@ -3361,8 +3348,8 @@ end subroutine IO_Ndimlist_reduce
     IF (IRESP==0) THEN
       IF (GSMONOPROC) THEN  ! sequential execution
         IF (LPACK .AND. L2D) THEN
+          Allocate( tzfield, source = tpfield )
           if ( tpfile%ldimreduced ) then
-            tzfield = tpfield
             tzfield%ndims = tzfield%ndims - 1
             if ( tzfield%ndimlist(1) /= NMNHDIM_UNKNOWN ) then
               tzfield%ndimlist(2)  = tzfield%ndimlist(3)
@@ -3373,7 +3360,6 @@ end subroutine IO_Ndimlist_reduce
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, ztx2dp, iresp_lfi )
             if ( gnc4 ) call IO_Field_write_nc4( tpfile, tzfield, ztx2dp, iresp_nc4 )
           else
-            tzfield = tpfield
             if ( tzfield%ndimlist(2) /= NMNHDIM_UNKNOWN ) tzfield%ndimlist(2) = NMNHDIM_ONE
             tx3dp => plb(:, jphext + 1 : jphext + 1, :)
             if ( glfi ) call IO_Field_write_lfi( tpfile, tzfield, tx3dp, iresp_lfi )
@@ -3457,7 +3443,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                 INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),           INTENT(IN)  :: TPFIELD
     CHARACTER(LEN=*),                INTENT(IN)  :: HBUDGET  ! 'BUDGET' (budget)  or 'OTHER' (MesoNH field)
     REAL,   DIMENSION(:,:), TARGET,  INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                         INTENT(IN)  :: KXOBOX   !
@@ -3551,7 +3537,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                 INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),           INTENT(IN)  :: TPFIELD
     CHARACTER(LEN=*),                INTENT(IN)  :: HBUDGET  ! 'BUDGET' (budget)  or 'OTHER' (MesoNH field)
     REAL, DIMENSION(:,:,:), TARGET,  INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                         INTENT(IN)  :: KXOBOX   !
@@ -3645,7 +3631,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                    INTENT(IN)  :: TPFILE
-    TYPE(TFIELDDATA),                   INTENT(IN)  :: TPFIELD
+    CLASS(TFIELDMETADATA),              INTENT(IN)  :: TPFIELD
     CHARACTER(LEN=*),                   INTENT(IN)  :: HBUDGET  ! 'BUDGET' (budget)  or 'OTHER' (MesoNH field)
     REAL, DIMENSION(:,:,:,:), TARGET,   INTENT(IN)  :: PFIELD   ! array containing the data field
     INTEGER,                            INTENT(IN)  :: KXOBOX   !
@@ -3739,7 +3725,7 @@ end subroutine IO_Ndimlist_reduce
     !*      0.1   Declarations of arguments
     !
     TYPE(TFILEDATA),                 INTENT(IN) :: TPFILE
-    TYPE(TFIELDDATA),                INTENT(IN) :: TPFIELD
+    CLASS(TFIELDMETADATA),           INTENT(IN) :: TPFIELD
     CHARACTER(LEN=*),                INTENT(IN) :: HBUDGET  ! 'BUDGET' (budget)  or 'OTHER' (MesoNH field)
     REAL,DIMENSION(:,:,:,:,:),TARGET,INTENT(IN) :: PFIELD   ! array containing the data field
     INTEGER,                         INTENT(IN) :: KXOBOX   ! 
@@ -4249,7 +4235,7 @@ IMPLICIT NONE
 !
 TYPE(TOUTBAK),    INTENT(IN)  :: TPOUTPUT !Output structure
 !
-TYPE(TFIELDDATA) :: TZFIELD
+TYPE(TFIELDMETADATA) :: TZFIELD
 !
 #if 0
 INTEGER          :: IKB
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
index f98999c1ea643987e3825b791b28d30d41a151fa..66aab0cef714eb2a2df0802e5d4585e040d8727e 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_lfi.f90
@@ -1,4 +1,4 @@
-!MNH_LIC Copyright 1994-2020 CNRS, Meteo-France and Universite Paul Sabatier
+!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.
@@ -13,7 +13,7 @@
 !-----------------------------------------------------------------
 module mode_io_read_lfi
 !
-use modd_field,      only: tfielddata
+use modd_field,      only: tfieldmetadata_base
 USE MODD_IO
 USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
 use modd_precision,  only: LFIINT, MNHINT64, MNHREAL32, MNHREAL64
@@ -50,10 +50,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL,                       INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -89,10 +89,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,          INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:),         INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -123,10 +123,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,            INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:),       INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -157,10 +157,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,              INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:),     INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -191,10 +191,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:),   INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -225,10 +225,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                  INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+REAL ,DIMENSION(:,:,:,:,:), INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -259,10 +259,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD  ! array containing the data field
-INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),              INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base),   INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(INOUT) :: PFIELD  ! array containing the data field
+INTEGER,                      INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -293,10 +293,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-INTEGER,         INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER,                    INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -327,10 +327,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:),      INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -361,10 +361,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),      INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,               INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:),    INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -395,10 +395,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
-INTEGER,DIMENSION(:,:,:),INTENT(INOUT) :: KFIELD  ! array containing the data field
-INTEGER,                 INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER, DIMENSION(:,:,:),  INTENT(INOUT) :: KFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -429,10 +429,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-LOGICAL,         INTENT(INOUT) :: OFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+LOGICAL,                    INTENT(INOUT) :: OFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -476,10 +476,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD  ! array containing the data field
-INTEGER,             INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:),      INTENT(INOUT) :: OFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -531,10 +531,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*),INTENT(INOUT) :: HFIELD  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),           INTENT(INOUT) :: HFIELD  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -581,10 +581,10 @@ IMPLICIT NONE
 !
 !*      0.1   Declarations of arguments
 !
-TYPE(TFILEDATA), INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME),INTENT(INOUT) :: TPDATA  ! array containing the data field
-INTEGER,         INTENT(OUT)   :: KRESP   ! return-code if problems occured
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME),           INTENT(INOUT) :: TPDATA  ! array containing the data field
+INTEGER,                    INTENT(OUT)   :: KRESP   ! return-code if problems occured
 !
 !*      0.2   Declarations of local variables
 !
@@ -592,7 +592,7 @@ INTEGER(KIND=LFIINT)                            :: IRESP, ITOTAL
 INTEGER                                         :: ILENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 LOGICAL                                         :: GGOOD
-TYPE(TFIELDDATA)                                :: TZFIELD
+TYPE(tfieldmetadata_base)                       :: TZFIELD
 INTEGER, DIMENSION(3)                           :: ITDATE    ! date array
 REAL,DIMENSION(1)                               :: ZTIME
 !
@@ -649,7 +649,7 @@ SUBROUTINE IO_Field_read_check_lfi(TPFILE,TPFIELD,KLENG,KWORK,KTOTAL,KRESP,OGOOD
 USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN
 !
 TYPE(TFILEDATA),                                INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),                               INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata_base),                     INTENT(INOUT) :: TPFIELD
 INTEGER,                                        INTENT(IN)    :: KLENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(OUT)   :: KWORK
 INTEGER(KIND=LFIINT),                           INTENT(OUT)   :: KTOTAL
diff --git a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
index a257e66b8cdd31e21396959c0d72217ae4a3a615..24825773483afbc1d79b6ce432c08294dcfccc75 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_read_nc4.f90
@@ -17,7 +17,7 @@
 #ifdef MNH_IOCDF4
 module mode_io_read_nc4
 
-use modd_field,        only: tfielddata
+use modd_field,        only: tfieldmetadata, tfieldmetadata_base
 use modd_io,           only: tfiledata
 use modd_precision,    only: CDFINT
 
@@ -53,11 +53,11 @@ SUBROUTINE IO_Field_attr_read_check_nc4(TPFILE,TPFIELD,KVARID,KRESP,HCALENDAR)
 !
 USE MODD_PARAMETERS, ONLY: NGRIDUNKNOWN
 !
-TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
-INTEGER(KIND=CDFINT),     INTENT(IN)    :: KVARID
-INTEGER,                  INTENT(OUT)   :: KRESP  ! return-code
-CHARACTER(LEN=*),OPTIONAL,INTENT(IN)    :: HCALENDAR
+TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata_base), INTENT(INOUT) :: TPFIELD
+INTEGER(KIND=CDFINT),       INTENT(IN)    :: KVARID
+INTEGER,                    INTENT(OUT)   :: KRESP  ! return-code
+CHARACTER(LEN=*), OPTIONAL, INTENT(IN)    :: HCALENDAR
 !
 INTEGER                      :: IERRLEVEL
 INTEGER                      :: IGRID
@@ -260,10 +260,10 @@ END SUBROUTINE IO_Field_attr_read_check_nc4
 
 
 SUBROUTINE IO_Field_read_nc4_X0(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,             INTENT(INOUT) :: PFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL,                  INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -315,10 +315,10 @@ END SUBROUTINE IO_Field_read_nc4_X0
 
 
 SUBROUTINE IO_Field_read_nc4_X1(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:),INTENT(INOUT) :: PFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:),    INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -382,10 +382,10 @@ END SUBROUTINE IO_Field_read_nc4_X1
 
 
 SUBROUTINE IO_Field_read_nc4_X2(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),    INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),   INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:),INTENT(INOUT) :: PFIELD
-INTEGER,            INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:),  INTENT(INOUT) :: PFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -464,10 +464,10 @@ END SUBROUTINE IO_Field_read_nc4_X2
 
 
 SUBROUTINE IO_Field_read_nc4_X3(TPFILE, TPFIELD, PFIELD, KRESP)
-TYPE(TFILEDATA),      INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),     INTENT(INOUT) :: TPFIELD
-REAL,DIMENSION(:,:,:),INTENT(INOUT) :: PFIELD
-INTEGER,              INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata),  INTENT(INOUT) :: TPFIELD
+REAL, DIMENSION(:,:,:), INTENT(INOUT) :: PFIELD
+INTEGER,                INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -536,7 +536,7 @@ END SUBROUTINE IO_Field_read_nc4_X3
 
 SUBROUTINE IO_Field_read_nc4_X4(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),        INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),       INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),  INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                INTENT(OUT)   :: KRESP  ! return-code
 
@@ -610,7 +610,7 @@ END SUBROUTINE IO_Field_read_nc4_X4
 
 SUBROUTINE IO_Field_read_nc4_X5(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),          INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),         INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),    INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                  INTENT(OUT)   :: KRESP  ! return-code
 
@@ -687,7 +687,7 @@ END SUBROUTINE IO_Field_read_nc4_X5
 
 SUBROUTINE IO_Field_read_nc4_X6(TPFILE, TPFIELD, PFIELD, KRESP)
 TYPE(TFILEDATA),            INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),           INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),      INTENT(INOUT) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:),INTENT(INOUT) :: PFIELD
 INTEGER,                    INTENT(OUT)   :: KRESP  ! return-code
 
@@ -765,10 +765,10 @@ END SUBROUTINE IO_Field_read_nc4_X6
 
 
 SUBROUTINE IO_Field_read_nc4_N0(TPFILE, TPFIELD, KFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-INTEGER,          INTENT(INOUT) :: KFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+INTEGER,               INTENT(INOUT) :: KFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -822,7 +822,7 @@ END SUBROUTINE IO_Field_read_nc4_N0
 
 SUBROUTINE IO_Field_read_nc4_N1(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),   INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:),   INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
@@ -890,7 +890,7 @@ END SUBROUTINE IO_Field_read_nc4_N1
 
 SUBROUTINE IO_Field_read_nc4_N2(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),         INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),        INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),   INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:,:), INTENT(INOUT) :: KFIELD
 INTEGER,                 INTENT(OUT)   :: KRESP  ! return-code
 
@@ -972,7 +972,7 @@ END SUBROUTINE IO_Field_read_nc4_N2
 
 SUBROUTINE IO_Field_read_nc4_N3(TPFILE, TPFIELD, KFIELD, KRESP)
 TYPE(TFILEDATA),           INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),          INTENT(INOUT) :: TPFIELD
+CLASS(tfieldmetadata),     INTENT(INOUT) :: TPFIELD
 INTEGER, DIMENSION(:,:,:), INTENT(INOUT) :: KFIELD
 INTEGER,                   INTENT(OUT)   :: KRESP  ! return-code
 
@@ -1042,10 +1042,10 @@ KRESP = IRESP
 END SUBROUTINE IO_Field_read_nc4_N3
 
 SUBROUTINE IO_Field_read_nc4_L0(TPFILE, TPFIELD, OFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-LOGICAL,          INTENT(INOUT) :: OFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+LOGICAL,               INTENT(INOUT) :: OFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT) :: istatus
 INTEGER(KIND=CDFINT) :: INCID
@@ -1112,10 +1112,10 @@ END SUBROUTINE IO_Field_read_nc4_L0
 
 
 SUBROUTINE IO_Field_read_nc4_L1(TPFILE, TPFIELD, OFIELD, KRESP)
-TYPE(TFILEDATA),     INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA),    INTENT(INOUT) :: TPFIELD
-LOGICAL,DIMENSION(:),INTENT(INOUT) :: OFIELD
-INTEGER,             INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+LOGICAL, DIMENSION(:), INTENT(INOUT) :: OFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -1199,10 +1199,10 @@ END SUBROUTINE IO_Field_read_nc4_L1
 
 
 SUBROUTINE IO_Field_read_nc4_C0(TPFILE, TPFIELD, HFIELD, KRESP)
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-CHARACTER(LEN=*), INTENT(INOUT) :: HFIELD
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+CHARACTER(LEN=*),      INTENT(INOUT) :: HFIELD
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)                              :: istatus
 INTEGER(KIND=CDFINT)                              :: INCID
@@ -1268,10 +1268,10 @@ USE MODD_TYPE_DATE
 !
 USE MODE_DATETIME
 !
-TYPE(TFILEDATA),  INTENT(IN)    :: TPFILE
-TYPE(TFIELDDATA), INTENT(INOUT) :: TPFIELD
-TYPE (DATE_TIME), INTENT(INOUT) :: TPDATA
-INTEGER,          INTENT(OUT)   :: KRESP  ! return-code
+TYPE(TFILEDATA),       INTENT(IN)    :: TPFILE
+CLASS(tfieldmetadata), INTENT(INOUT) :: TPFIELD
+TYPE (DATE_TIME),      INTENT(INOUT) :: TPDATA
+INTEGER,               INTENT(OUT)   :: KRESP  ! return-code
 
 INTEGER(KIND=CDFINT)         :: istatus
 INTEGER(KIND=CDFINT)         :: INCID
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
index 1930838631bea8fe7286ba1bdbd9972602a933e3..7346177c4e2f279187f3fff07a14278abe835127 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools.f90
@@ -103,7 +103,7 @@ contains
 subroutine IO_Mnhversion_get(tpfile)
 !Compare MNHVERSION of file with current version and store it in file metadata
   use modd_conf,          only: nmnhversion
-  use modd_field,         only: tfielddata, TYPEINT
+  use modd_field,         only: tfieldmetadata, TYPEINT
 
   use mode_io_field_read, only: IO_Field_read
 
@@ -113,7 +113,7 @@ subroutine IO_Mnhversion_get(tpfile)
   integer :: imasdev,ibugfix
   integer :: iresp
   integer,dimension(3)    :: imnhversion
-  type(tfielddata)        :: tzfield
+  type(tfieldmetadata)    :: tzfield
 
   call print_msg(NVERB_DEBUG,'IO','IO_Mnhversion_get','called for '//trim(tpfile%cname))
 
@@ -123,7 +123,7 @@ subroutine IO_Mnhversion_get(tpfile)
   if ( .not. associated( tpfile%tmainfile ) ) then
     imnhversion(:) = 0
     !use tzfield because tfieldlist could be not initialised
-    tzfield = tfielddata(            &
+    tzfield = tfieldmetadata(        &
       cmnhname   = 'MNHVERSION',     &
       cstdname   = '',               &
       clongname  = 'MesoNH version', &
diff --git a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
index 50412e8c08015401031defdfdbec37509180e520..a7d7604f2bfa26a10b32cdadd66dcedcd0627b17 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_tools_nc4.f90
@@ -24,7 +24,7 @@
 #ifdef MNH_IOCDF4
 module mode_io_tools_nc4
 
-use modd_field,     only: tfielddata
+use modd_field,     only: tfieldmetadata
 use modd_io,        only: tfiledata
 use modd_netcdf,    only: tdimnc, tdimsnc
 use modd_precision, only: CDFINT
@@ -85,7 +85,7 @@ USE MODD_FIELD, ONLY: NMNHDIM_ARAKAWA, TYPECHAR
 !
 !Used by LFI2CDF
 TYPE(TFILEDATA),                      INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),                     INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),                INTENT(IN)  :: TPFIELD
 INTEGER,                              INTENT(IN)  :: KLEN
 TYPE(tdimnc),DIMENSION(:),            INTENT(OUT) :: TPDIMS
 INTEGER,                              INTENT(OUT) :: KRESP
@@ -253,6 +253,8 @@ USE MODD_CONF_n,        ONLY: CSTORAGE_TYPE
 USE MODD_DIM_n,         ONLY: NIMAX_ll, NJMAX_ll, NKMAX
 use modd_dyn,           only: xseglen
 use modd_dyn_n,         only: xtstep
+
+!PW: check if all parameters are used...
 use modd_field,         only: NMNHDIM_NI, NMNHDIM_NJ, NMNHDIM_NI_U, NMNHDIM_NJ_U, NMNHDIM_NI_V, NMNHDIM_NJ_V,   &
                               NMNHDIM_LEVEL, NMNHDIM_LEVEL_W, NMNHDIM_TIME,                                     &
                               NMNHDIM_ONE,  NMNHDIM_NSWB, NMNHDIM_NLWB, NMNHDIM_COMPLEX,                        &
@@ -515,7 +517,7 @@ use modd_field,  only: NMNHDIM_UNKNOWN, NMNHDIM_ONE, NMNHDIM_COMPLEX,
                        NMNHDIM_NOTLISTED, NMNHDIM_UNUSED, NMNHDIM_ARAKAWA
 
 TYPE(TFILEDATA),                              INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),                             INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),                        INTENT(IN)  :: TPFIELD
 INTEGER(KIND=CDFINT),DIMENSION(:),            INTENT(IN)  :: KSHAPE
 INTEGER(KIND=CDFINT),DIMENSION(:),ALLOCATABLE,INTENT(OUT) :: KVDIMS
 !
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
index 430f06ccfed1c5d64d8daeec50f95164be6d1ed7..588ac539b516d2093b296b3d97b9d3312302d30f 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_lfi.f90
@@ -14,7 +14,7 @@
 !-----------------------------------------------------------------
 module mode_io_write_lfi
 !
-use modd_field,      only: tfielddata
+use modd_field,      only: tfieldmetadata_base
 USE MODD_IO
 USE MODD_PARAMETERS, ONLY: NLFIMAXCOMMENTLENGTH
 use modd_precision,  only: LFIINT, MNHINT64, MNHREAL64
@@ -53,7 +53,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,                  INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -92,7 +92,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:),     INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -137,7 +137,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files)
@@ -203,7 +203,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:),   INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -248,7 +248,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),          INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),         INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),  INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                  INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -293,7 +293,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),          INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),         INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                  INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -338,7 +338,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),            INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),           INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:),INTENT(IN) :: PFIELD ! array containing the data field
 INTEGER,                    INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -383,7 +383,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,                 INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -422,7 +422,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:),    INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -467,7 +467,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -512,7 +512,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -558,7 +558,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -604,7 +604,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 LOGICAL,                 INTENT(IN) :: OFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -651,7 +651,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 LOGICAL,DIMENSION(:),    INTENT(IN) :: OFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -706,7 +706,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),        INTENT(IN) :: HFIELD ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -764,7 +764,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),         INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME),        INTENT(IN) :: TPDATA ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -772,14 +772,14 @@ INTEGER,                 INTENT(OUT):: KRESP  ! return-code if problems araised
 !
 INTEGER                                         :: ILENG
 INTEGER(kind=LFIINT)                            :: IRESP, ITOTAL
-TYPE(TFIELDDATA)                                :: TZFIELD
+CLASS(tfieldmetadata_base), ALLOCATABLE         :: TZFIELD
 INTEGER, DIMENSION(3)                           :: ITDATE    ! date array
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 CHARACTER(LEN=LEN_HREC)                         :: YRECFM
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_lfi_T0','writing '//TRIM(TPFIELD%CMNHNAME))
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Write date
 !
@@ -840,7 +840,7 @@ IMPLICIT NONE
 !*      0.1   Declarations of arguments
 !
 TYPE(TFILEDATA),                INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
+CLASS(tfieldmetadata_base), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA ! array containing the data field
 INTEGER,                        INTENT(OUT):: KRESP  ! return-code if problems araised
 !
@@ -849,7 +849,7 @@ INTEGER,                        INTENT(OUT):: KRESP  ! return-code if problems a
 INTEGER                                         :: ILENG, IPOS
 INTEGER                                         :: JI
 INTEGER(kind=LFIINT)                            :: IRESP, ITOTAL
-TYPE(TFIELDDATA)                                :: TZFIELD
+CLASS(tfieldmetadata_base), ALLOCATABLE         :: TZFIELD
 INTEGER, DIMENSION(:), ALLOCATABLE              :: ITDATE    ! date array
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE :: IWORK
 CHARACTER(LEN=LEN_HREC)                         :: YRECFM
@@ -866,7 +866,7 @@ END IF
 !
 ALLOCATE( ITDATE( ILENG ) )
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Write date
 !
@@ -924,7 +924,7 @@ END SUBROUTINE IO_Field_write_lfi_T1
 !
 SUBROUTINE WRITE_PREPARE(TPFIELD,KLENG,KWORK,KTOTAL,KRESP)
 !
-TYPE(TFIELDDATA),                               INTENT(IN)    :: TPFIELD
+CLASS(tfieldmetadata_base),                     INTENT(IN)    :: TPFIELD
 INTEGER,                                        INTENT(IN)    :: KLENG
 INTEGER(KIND=MNHINT64),DIMENSION(:),ALLOCATABLE,INTENT(INOUT) :: KWORK
 INTEGER(kind=LFIINT),                           INTENT(OUT)   :: KTOTAL
diff --git a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90 b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
index 53053069c936e71c6df416594babe000686782a7..4019f6346ad0afd8523e9727f2811987ab3eed7b 100644
--- a/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io_write_nc4.f90
@@ -32,7 +32,7 @@
 #ifdef MNH_IOCDF4
 module mode_io_write_nc4
 
-use modd_field,        only: tfielddata
+use modd_field,        only: tfieldmetadata
 use modd_io,           only: gsmonoproc, tfiledata
 use modd_parameters,   only: NMNHNAMELGTMAX
 use modd_precision,    only: CDFINT, MNHINT_NF90, MNHREAL32, MNHREAL_MPI, MNHREAL_NF90
@@ -87,7 +87,7 @@ use modd_parameters, only: jphext
 use mode_tools_ll,   only: Get_globaldims_ll
 
 type(tfiledata),       intent(in) :: tpfile
-type(tfielddata),      intent(in) :: tpfield
+class(tfieldmetadata), intent(in) :: tpfield
 integer,               intent(in) :: knblocks
 
 character(len=len(tpfield%cmnhname))  :: yvarname
@@ -177,7 +177,7 @@ USE MODD_CONF_n, ONLY: CSTORAGE_TYPE
 use modd_field,  only: NMNHDIM_ARAKAWA, TYPEINT, TYPEREAL
 !
 TYPE(TFILEDATA),                              INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),                             INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),                        INTENT(IN) :: TPFIELD
 INTEGER(KIND=CDFINT),                         INTENT(IN) :: KVARID
 LOGICAL,                                      INTENT(IN) :: OEXISTED !True if variable was already defined
 INTEGER(KIND=CDFINT), DIMENSION(:), OPTIONAL, INTENT(IN) :: KSHAPE
@@ -373,7 +373,7 @@ use modd_field,     only: NMNHDIM_TIME, TYPECHAR, TYPEDATE, TYPEINT, TYPELOG, TY
 use modd_precision, only: MNHINT_NF90, MNHREAL_NF90
 
 type(tfiledata),       intent(in)            :: tpfile
-type(tfielddata),      intent(in)            :: tpfield
+class(tfieldmetadata), intent(in)            :: tpfield
 integer, dimension(:), intent(in),  optional :: kshape
 character(len=*),      intent(in),  optional :: hcalendar
 logical,               intent(in),  optional :: oiscoord   ! Is a coordinate variable (->do not write coordinates attribute)
@@ -525,7 +525,7 @@ end subroutine IO_Field_create_nc4
 SUBROUTINE IO_Field_write_nc4_X0(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,                  INTENT(IN) :: PFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -548,7 +548,7 @@ END SUBROUTINE IO_Field_write_nc4_X0
 SUBROUTINE IO_Field_write_nc4_X1(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:),     INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -574,19 +574,19 @@ END SUBROUTINE IO_Field_write_nc4_X1
 SUBROUTINE IO_Field_write_nc4_X2(TPFILE,TPFIELD,PFIELD,KRESP,KVERTLEVEL,KZFILE,OISCOORD)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 INTEGER,OPTIONAL,      INTENT(IN) :: KVERTLEVEL ! Number of the vertical level (needed for Z-level split files)
 INTEGER,OPTIONAL,      INTENT(IN) :: KZFILE     ! Number of the Z-level split file
 LOGICAL,OPTIONAL,      INTENT(IN) :: OISCOORD   ! Is a coordinate variable (->do not write coordinates attribute)
 !
-INTEGER(KIND=CDFINT)      :: istatus
-CHARACTER(LEN=4)          :: YSUFFIX
-INTEGER(KIND=CDFINT)      :: IVARID
-logical                   :: gisempty
-TYPE(TFIELDDATA), pointer :: TZFIELD
-TYPE(TFILEDATA),  POINTER :: TZFILE
+CHARACTER(LEN=4)               :: YSUFFIX
+INTEGER(KIND=CDFINT)           :: istatus
+INTEGER(KIND=CDFINT)           :: IVARID
+logical                        :: gisempty
+CLASS(TFIELDMETADATA), pointer :: TZFIELD
+TYPE(TFILEDATA),       POINTER :: TZFILE
 !
 KRESP = 0
 !
@@ -610,7 +610,7 @@ END SUBROUTINE IO_Field_write_nc4_X2
 SUBROUTINE IO_Field_write_nc4_X3(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -636,7 +636,7 @@ END SUBROUTINE IO_Field_write_nc4_X3
 SUBROUTINE IO_Field_write_nc4_X4(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:),   INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -662,7 +662,7 @@ END SUBROUTINE IO_Field_write_nc4_X4
 SUBROUTINE IO_Field_write_nc4_X5(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),           INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -688,7 +688,7 @@ END SUBROUTINE IO_Field_write_nc4_X5
 SUBROUTINE IO_Field_write_nc4_X6(TPFILE,TPFIELD,PFIELD,KRESP)
 !
 TYPE(TFILEDATA),             INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),            INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),       INTENT(IN) :: TPFIELD
 REAL,DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD   ! array containing the data field
 INTEGER,                     INTENT(OUT):: KRESP
 !
@@ -723,7 +723,7 @@ USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
 #endif
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER,               INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -773,7 +773,7 @@ USE MODD_PARAMETERS_ll,  ONLY: JPVEXT
 #endif
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -799,7 +799,7 @@ END SUBROUTINE IO_Field_write_nc4_N1
 SUBROUTINE IO_Field_write_nc4_N2(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -825,7 +825,7 @@ END SUBROUTINE IO_Field_write_nc4_N2
 SUBROUTINE IO_Field_write_nc4_N3(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,  INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),        INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),   INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,                 INTENT(OUT):: KRESP
 !
@@ -851,7 +851,7 @@ END SUBROUTINE IO_Field_write_nc4_N3
 SUBROUTINE IO_Field_write_nc4_N4(TPFILE,TPFIELD,KFIELD,KRESP)
 !
 TYPE(TFILEDATA),TARGET,    INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),          INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),     INTENT(IN) :: TPFIELD
 INTEGER,DIMENSION(:,:,:,:),INTENT(IN) :: KFIELD   ! array containing the data field
 INTEGER,                   INTENT(OUT):: KRESP
 !
@@ -877,7 +877,7 @@ END SUBROUTINE IO_Field_write_nc4_N4
 SUBROUTINE IO_Field_write_nc4_L0(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 LOGICAL,               INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -908,7 +908,7 @@ END SUBROUTINE IO_Field_write_nc4_L0
 SUBROUTINE IO_Field_write_nc4_L1(TPFILE,TPFIELD,OFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 LOGICAL, DIMENSION(:), INTENT(IN) :: OFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -942,7 +942,7 @@ END SUBROUTINE IO_Field_write_nc4_L1
 SUBROUTINE IO_Field_write_nc4_C0(TPFILE,TPFIELD,HFIELD,KRESP)
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),      INTENT(IN) :: HFIELD
 INTEGER,               INTENT(OUT):: KRESP
 !
@@ -980,7 +980,7 @@ SUBROUTINE IO_Field_write_nc4_C1(TPFILE,TPFIELD,HFIELD,KRESP)
 !    J.Escobar : 25/04/2018 : missing 'IF ALLOCATED(IVDIMSTMP)' DEALLOCATE
 !----------------------------------------------------------------
 TYPE(TFILEDATA),              INTENT(IN)  :: TPFILE
-TYPE(TFIELDDATA),             INTENT(IN)  :: TPFIELD
+CLASS(TFIELDMETADATA),        INTENT(IN) :: TPFIELD
 CHARACTER(LEN=*),DIMENSION(:),INTENT(IN)  :: HFIELD
 INTEGER,                      INTENT(OUT) :: KRESP
 !
@@ -1017,22 +1017,22 @@ USE MODD_TYPE_DATE
 USE MODE_DATETIME
 !
 TYPE(TFILEDATA),       INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),      INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA), INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME),      INTENT(IN) :: TPDATA
 INTEGER,               INTENT(OUT):: KRESP
 !
-INTEGER(KIND=CDFINT) :: istatus
-INTEGER(KIND=CDFINT) :: IVARID
-TYPE(TFIELDDATA)     :: TZFIELD
-CHARACTER(LEN=40)    :: YUNITS
-REAL                 :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)      :: TZREF
+CHARACTER(LEN=40)                  :: YUNITS
+INTEGER(KIND=CDFINT)               :: istatus
+INTEGER(KIND=CDFINT)               :: IVARID
+REAL                               :: ZDELTATIME !Distance in seconds since reference date and time
+CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD
+TYPE(DATE_TIME)                    :: TZREF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T0',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
 KRESP = 0
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
@@ -1071,24 +1071,24 @@ USE MODD_TYPE_DATE
 USE MODE_DATETIME
 !
 TYPE(TFILEDATA),                INTENT(IN) :: TPFILE
-TYPE(TFIELDDATA),               INTENT(IN) :: TPFIELD
+CLASS(TFIELDMETADATA),          INTENT(IN) :: TPFIELD
 TYPE (DATE_TIME), DIMENSION(:), INTENT(IN) :: TPDATA
 INTEGER,                        INTENT(OUT):: KRESP
 !
-CHARACTER(LEN=40)               :: YUNITS
-INTEGER                         :: JI
-INTEGER(KIND=CDFINT)            :: istatus
-INTEGER(KIND=CDFINT)            :: IVARID
-logical                         :: gisempty
-REAL, DIMENSION(:), ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time
-TYPE(DATE_TIME)                 :: TZREF
-TYPE(TFIELDDATA)                :: TZFIELD
+CHARACTER(LEN=40)                  :: YUNITS
+INTEGER                            :: JI
+INTEGER(KIND=CDFINT)               :: istatus
+INTEGER(KIND=CDFINT)               :: IVARID
+logical                            :: gisempty
+REAL, DIMENSION(:),    ALLOCATABLE :: ZDELTATIME !Distance in seconds since reference date and time
+CLASS(TFIELDMETADATA), ALLOCATABLE :: TZFIELD
+TYPE(DATE_TIME)                    :: TZREF
 !
 CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_Field_write_nc4_T1',TRIM(TPFILE%CNAME)//': writing '//TRIM(TPFIELD%CMNHNAME))
 !
 KRESP = 0
 !
-TZFIELD = TPFIELD
+Allocate( TZFIELD, source = TPFIELD )
 !
 ! Model beginning date (TDTMOD%TDATE) is used as the reference date
 ! Reference time is set to 0.
@@ -1128,7 +1128,7 @@ END SUBROUTINE IO_Field_write_nc4_T1
 subroutine IO_Field_partial_write_nc4_X1( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                intent(in)  :: tpfile
-type(tfielddata),               intent(in)  :: tpfield
+class(tfieldmetadata),          intent(in)  :: tpfield
 real,             dimension(:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(1), intent(in)  :: koffset
 integer,                        intent(out) :: kresp
@@ -1165,20 +1165,20 @@ end subroutine IO_Field_partial_write_nc4_X1
 subroutine IO_Field_partial_write_nc4_X2( tpfile, tpfield, pfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                  intent(in)  :: tpfile
-type(tfielddata),                 intent(in)  :: tpfield
+class(tfieldmetadata),            intent(in)  :: tpfield
 real,             dimension(:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(2),   intent(in)  :: koffset
 integer,                          intent(out) :: kresp
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(2) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(2) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1211,7 +1211,7 @@ end subroutine IO_Field_partial_write_nc4_X2
 subroutine IO_Field_partial_write_nc4_X3( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                    intent(in)  :: tpfile
-type(tfielddata),                   intent(in)  :: tpfield
+class(tfieldmetadata),              intent(in)  :: tpfield
 real,             dimension(:,:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(3),     intent(in)  :: koffset
 integer,                            intent(out) :: kresp
@@ -1248,7 +1248,7 @@ end subroutine IO_Field_partial_write_nc4_X3
 subroutine IO_Field_partial_write_nc4_X4( tpfile, tpfield, pfield, koffset, kresp )
 
 type(tfiledata),                      intent(in)  :: tpfile
-type(tfielddata),                     intent(in)  :: tpfield
+class(tfieldmetadata),                intent(in)  :: tpfield
 real,             dimension(:,:,:,:), intent(in)  :: pfield   ! array containing the data field
 integer,          dimension(4),       intent(in)  :: koffset
 integer,                              intent(out) :: kresp
@@ -1285,20 +1285,20 @@ end subroutine IO_Field_partial_write_nc4_X4
 subroutine IO_Field_partial_write_nc4_N2( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                  intent(in)  :: tpfile
-type(tfielddata),                 intent(in)  :: tpfield
+class(tfieldmetadata),            intent(in)  :: tpfield
 integer,          dimension(:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(2),   intent(in)  :: koffset
 integer,                          intent(out) :: kresp
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(2) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(2) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1331,20 +1331,20 @@ end subroutine IO_Field_partial_write_nc4_N2
 subroutine IO_Field_partial_write_nc4_N3( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                    intent(in)  :: tpfile
-type(tfielddata),                   intent(in)  :: tpfield
+class(tfieldmetadata),              intent(in)  :: tpfield
 integer,          dimension(:,:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(3),     intent(in)  :: koffset
 integer,                            intent(out) :: kresp
 integer,                  optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                  optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(3) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(3) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -1377,20 +1377,20 @@ end subroutine IO_Field_partial_write_nc4_N3
 subroutine IO_Field_partial_write_nc4_N4( tpfile, tpfield, kfield, koffset, kresp, kvertlevel, kzfile )
 
 type(tfiledata),                      intent(in)  :: tpfile
-type(tfielddata),                     intent(in)  :: tpfield
+class(tfieldmetadata),                intent(in)  :: tpfield
 integer,          dimension(:,:,:,:), intent(in)  :: kfield   ! array containing the data field
 integer,          dimension(4),       intent(in)  :: koffset
 integer,                              intent(out) :: kresp
 integer,                    optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                    optional, intent(in)  :: kzfile     ! Number of the Z-level split file
 
-character(len=4)                   :: ysuffix
-character(len=NMNHNAMELGTMAX)      :: yvarname
-integer(kind=CDFINT)               :: istatus
-integer(kind=CDFINT)               :: ivarid
-integer(kind=CDFINT), dimension(4) :: istarts
-type(tfielddata),     pointer      :: tzfield
-type(tfiledata),      pointer      :: tzfile
+character(len=4)                    :: ysuffix
+character(len=NMNHNAMELGTMAX)       :: yvarname
+integer(kind=CDFINT)                :: istatus
+integer(kind=CDFINT)                :: ivarid
+integer(kind=CDFINT),  dimension(4) :: istarts
+class(tfieldmetadata), pointer      :: tzfield
+type(tfiledata),       pointer      :: tzfile
 
 kresp = 0
 
@@ -2454,8 +2454,8 @@ END SUBROUTINE IO_History_append_nc4
 
 subroutine IO_Select_split_file( tpfile, tpfield, tpfileout, tpfieldout, kvertlevel, kzfile )
 type(tfiledata),  target,         intent(in)  :: tpfile
-type(tfielddata), target,         intent(in)  :: tpfield
-type(tfielddata), pointer,        intent(out) :: tpfieldout
+class(tfieldmetadata), target,    intent(in)  :: tpfield
+class(tfieldmetadata), pointer,   intent(out) :: tpfieldout
 type(tfiledata),  pointer,        intent(out) :: tpfileout
 integer,                optional, intent(in)  :: kvertlevel ! Number of the vertical level (needed for Z-level split files)
 integer,                optional, intent(in)  :: kzfile     ! Number of the Z-level split file
@@ -2469,9 +2469,8 @@ if ( Present( kvertlevel ) ) then
 
   Write( ysuffix, '( i4.4 )' ) kvertlevel
   tpfileout => tpfile%tfiles_ioz(kzfile)%tfile
-  !Copy the values of tpfield to the pointer tpfieldout (new tfielddata)
-  Allocate( tpfieldout )
-  tpfieldout = tpfield
+  !Copy the values of tpfield to the pointer tpfieldout
+  Allocate( tpfieldout, source = tpfield )
   tpfieldout%cmnhname  = Trim( tpfieldout%cmnhname ) // ysuffix
   if ( Len_trim( tpfieldout%cstdname  ) > 0 )  tpfieldout%cstdname  = Trim( tpfieldout%cstdname  ) // '_at_level_' // ysuffix
   if ( Len_trim( tpfieldout%clongname ) > 0 )  tpfieldout%clongname = Trim( tpfieldout%clongname ) // ' at level ' // ysuffix