diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index e6021b5f2face875a270344b978f8bbe81adb93f..46e3306c1ebba0fa0f1014b72cd7d2962b1ed736 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -458,7 +458,7 @@ END DO
 
     INTEGER :: compress_level, status
     INTEGER :: idx, ji, nbfiles
-    INTEGER:: kcdf_id
+    INTEGER :: kcdf_id
     TYPE(dimCDF), POINTER :: tzdim
     INTEGER               :: invdims
     INTEGER               :: type_float
@@ -623,6 +623,7 @@ END DO
     CHARACTER(LEN=4)                         :: suffix
     INTEGER,DIMENSION(3)                     :: idims, start
     INTEGER,DIMENSION(:),ALLOCATABLE         :: itab
+    LOGICAL,DIMENSION(:),ALLOCATABLE         :: gtab
     REAL(KIND=8),DIMENSION(:),ALLOCATABLE    :: xtab
     CHARACTER, DIMENSION(:), ALLOCATABLE     :: ytab
     REAL(KIND=8), DIMENSION(:,:,:), ALLOCATABLE :: xtab3d, xtab3d2
@@ -643,6 +644,7 @@ END DO
 
     ALLOCATE(iwork(kbuflen))
     ALLOCATE(itab(kbuflen))
+    ALLOCATE(gtab(kbuflen))
     ALLOCATE(xtab(kbuflen))
 
     idx = 1
@@ -701,7 +703,7 @@ END DO
 !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
          SELECT CASE(ndims)
          CASE (0)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
+           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,itab(1:extent))
          CASE (1)
            status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
          CASE (2)
@@ -766,9 +768,18 @@ END DO
              jj=jj+1
            END DO
          ENDIF
+
+         DO JJ=1,EXTENT
+           IF (ITAB(JJ)==0) THEN
+             GTAB(JJ) = .FALSE.
+           ELSE
+             GTAB(JJ) = .TRUE.
+           END IF
+         END DO
+
          SELECT CASE(ndims)
          CASE (0)
-             status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
+           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,gtab(1:extent))
          CASE (1)
            status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,itab(1:extent),count=(/extent/))
          CASE DEFAULT
@@ -826,12 +837,11 @@ END DO
 !TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
          SELECT CASE(ndims)
          CASE (0)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
+           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,xtab(1:extent))
          CASE (1)
            status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
          CASE (2)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len/)), &
-                                 start = (/1,1,level/) )
+           CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,reshape(xtab,(/ptdimx%len,ptdimy%len/)))
          CASE (3)
            status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/)))
          CASE DEFAULT
@@ -880,8 +890,7 @@ END DO
            ich = iwork(2+iwork(2)+jj)
            ytab(jj) = CHAR(ich)
          END DO
-         status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,ytab,count=(/extent/))
-         IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
+         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,ytab)
          DEALLOCATE(ytab)
         ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
          status = NF90_GET_VAR(infiles%files(1)%lun_id,tpreclist(ji)%id_in,ytab,count=(/extent/))
@@ -893,56 +902,18 @@ END DO
 
        CASE (TYPEDATE)
          IF (ndims/=0) CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','only ndims=0 is supported for TYPEDATE')
-         CALL FIND_FIELD_ID_FROM_MNHNAME(trim(tpreclist(ji)%name),IID,IRESP2)
-         IF (IRESP2/=0) &
-           CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','TYPEDATE variable '//TRIM(tpreclist(ji)%name)//' not found in TFIELDLIST')
-         CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   TFIELDLIST(IID),TZDATE)
-         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,TFIELDLIST(IID),TZDATE)
+!PW: TODO: tpreclist(ji)%TFIELD%CMNHNAME => tpreclist(ji)%TFIELD
+         CALL IO_READ_FIELD (infiles%tfiles(1)%TFILE,   tpreclist(ji)%TFIELD%CMNHNAME,TZDATE)
+         CALL IO_WRITE_FIELD(outfiles%tfiles(idx)%TFILE,tpreclist(ji)%TFIELD,TZDATE)
 
        CASE default
-        IF (infiles%files(1)%format == LFI_FORMAT) THEN
-         IF (.NOT.tpreclist(ji)%calc) THEN
-           CALL LFINFO(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(ji)%name)//trim(suffix),iwork,ileng)
-           xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
-         ELSE
-           src=tpreclist(ji)%src(1)
-           CALL LFINFO(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),ileng,ipos)
-           CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng)
-           xtab(1:extent) = TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
-           jj = 2
-           DO WHILE (tpreclist(ji)%src(jj)>0 .AND. jj.LE.MAXRAW)
-             src=tpreclist(ji)%src(jj)
-             CALL LFILEC(iresp,ilu,trim(tpreclist(src)%name)//trim(suffix),iwork,ileng)
-             xtab(1:extent) = xtab(1:extent) + TRANSFER(iwork(3+iwork(2):),(/ 0.0_8 /))
-             jj=jj+1
-           END DO
-         ENDIF
-!TODO: works in all cases??? (X, Y, Z dimensions assumed to be ptdimx,y or z)
-         SELECT CASE(ndims)
-         CASE (0)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
-         CASE (1)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,xtab(1:extent),count=(/extent/))
-         CASE (2)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len/)), &
-                                 start = (/1,1,level/) )
-         CASE (3)
-           status = NF90_PUT_VAR(kcdf_id,tpreclist(ji)%id_out,reshape(xtab,(/ptdimx%len,ptdimy%len,ptdimz%len/)))
-         CASE DEFAULT
-           print *,'Error: arrays with ',tpreclist(ji)%dim%ndims,' dimensions are not supported'
-         END SELECT
-         IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
-        ELSE IF (infiles%files(1)%format == NETCDF_FORMAT) THEN
-         print *,'Error: unknown datatype'
-         STOP
-        END IF
+         CALL PRINT_MSG(NVERB_FATAL,'IO','fill_ncdf','invalid datatype')
 
        END SELECT
 
        if (options(OPTSPLIT)%set) idx = idx + 1
     END DO
-    DEALLOCATE(itab,xtab)
+    DEALLOCATE(itab,gtab,xtab)
     DEALLOCATE(iwork)
   END SUBROUTINE fill_ncdf
 
@@ -1150,8 +1121,9 @@ END DO
 
        !Read problem dimensions and some grid variables (needed by IO_FILE_OPEN_ll for netCDF files)
        CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPHEXT',JPHEXT)
-       CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP)
-       IF(IRESP/=0) JPVEXT=1
+       !CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'JPVEXT',JPVEXT,IRESP)
+       !IF(IRESP/=0) JPVEXT=1
+       JPVEXT = 1
        !
        ALLOCATE(NIMAX_ll,NJMAX_ll,NKMAX)
        CALL IO_READ_FIELD(INFILES%TFILES(idx)%TFILE,'IMAX',NIMAX_ll)