diff --git a/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam
index 3d775bc8744f42792b4c6f29a48d9a9aefa12e16..07695c089fa208d2d0dd00c703388374ebd1c379 100644
--- a/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam
+++ b/MY_RUN/KTEST/001_2Drelief/001_prep_ideal_case/PRE_IDEA1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_DIMn_PRE NIMAX=256, NJMAX=1 /
 &NAM_VER_GRID NKMAX=48 ZDZGRD=40., ZDZTOP=500.,
               ZZMAX_STRGRD=5000. , ZSTRGRD=10. , ZSTRTOP= 10. /
diff --git a/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam
index 9dd65406c44920806e140fb9addec0143bf1a41b..c516f48eccdc49f4bf78f12fa29d130ade86b784 100644
--- a/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam
+++ b/MY_RUN/KTEST/001_2Drelief/002_mesonh/EXSEG1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_LUNITn  CINIFILE = "HYD2D" /
 &NAM_CONFn  LUSERV = T /
 &NAM_DYNn XTSTEP = 30.0, LITRADJ = T,
diff --git a/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam
index 61d43c37866dc997db9cc46784891516372f0c43..d4561ae611ea10e4859dc5eb0234718d2558ce83 100644
--- a/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam
+++ b/MY_RUN/KTEST/002_3Drelief/001_prep_ideal_case/PRE_IDEA1.nam
@@ -1,5 +1,6 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
- ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_W = 8
+  ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_W = 8
 /
 &NAM_DIMn_PRE NIMAX=30 NJMAX=30 /
 &NAM_CONF_PRE LCARTESIAN=.TRUE.
diff --git a/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam
index 4be0a88136c96abae97bd212b7d13cf02747ae5b..3b96bfd6b5319a1d0b3636373387c44b83042ac7 100644
--- a/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam
+++ b/MY_RUN/KTEST/002_3Drelief/002_mesonh/EXSEG1.nam
@@ -1,5 +1,6 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ  
- ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_R = 8 , NB_PROCIO_W = 1
+  ! NZ_VERB = 5 , NZ_PROC = 0 , NB_PROCIO_R = 8 , NB_PROCIO_W = 8
  /
 &NAM_LUNITn  CINIFILE = "RELIEF3D.410" /
 &NAM_CONFn  LUSERV = F /
diff --git a/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam
index 0f5af9a7075aa15908b99a9ad886719358924ef6..90ccec6a86a124e5f8fbb2a8119dc6734beed8c8 100644
--- a/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam
+++ b/MY_RUN/KTEST/003_KW78/001_prep_ideal_case/PRE_IDEA1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
  ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=8
 /
diff --git a/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam b/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam
index 9e5cf92a02f009288f437360033ca6cac44c057f..f687ec0816ffa8f3b50c3ee247d46be8bf0e1263 100644
--- a/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam
+++ b/MY_RUN/KTEST/003_KW78/002_mesonh/EXSEG1.nam
@@ -1,5 +1,6 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
- ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1
+ ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=8
 /
 &NAM_LUNITn CINIFILE = "KWRAIN.410" /
 &NAM_CONFn  LUSERV=T LUSERC=T LUSERR=T /
diff --git a/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam b/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam
index 0a366f9eb74ae1b33c36b06195789e2ef1d067d4..aa74817f17ac68ed7f4265283f5c47e1cfa9027b 100644
--- a/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam
+++ b/MY_RUN/KTEST/004_Reunion/001_prep_pgd/PRE_PGD1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ 
  ! NZ_VERB=5 , NB_PROCIO_W=8 
 /
diff --git a/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam b/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam
index f210f05460aefae481d38acc18c5c16d565ee8b8..953029322f5f3a94b9d8e4f5263395e764d15b61 100644
--- a/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam
+++ b/MY_RUN/KTEST/004_Reunion/002_prep_ideal_case/PRE_IDEA1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ 
   ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=8 
 /
diff --git a/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam b/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam
index f588e40759202d49a658a076f0fa7961f505a9ef..c33aa0db83476b9d26c0c944279e1b4f33746b09 100644
--- a/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam
+++ b/MY_RUN/KTEST/004_Reunion/003_mesonh/EXSEG1.nam
@@ -1,5 +1,6 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
- ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=1
+  ! NZ_VERB=5 , NB_PROCIO_R=8 , NB_PROCIO_W=8
 /
 &NAM_LUNITn  CINIFILE = "REUNION_IDEA_410",
              CINIFILEPGD="REUNION_PGD_1km5_410" /
diff --git a/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam b/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam
index 52adc7cca0d722ca302b93d581d295eda7e113f6..e13f0056d5702f6aca072c4484d1add56abe6c2b 100644
--- a/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam
+++ b/MY_RUN/KTEST/007_16janvier/001_pgd1/PRE_PGD1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_PGDFILE CPGDFILE='16JAN98_36km' /
 &NAM_CONF_PROJ XLAT0=50., XLON0=-2.8, XRPK=0.58, XBETA=0. /
 &NAM_CONF_PROJ_GRID XLATCEN=48.,  XLONCEN=-1.,
diff --git a/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam b/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam
index 25cbeb9f524b6217b36c121918e5e1d4a9f29e33..cb72d1781a467e8aef50cdc6165c45ecbb25adc1 100644
--- a/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam
+++ b/MY_RUN/KTEST/007_16janvier/002_pgd2/PRE_PGD1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_PGDFILE CPGDFILE='16JAN98_9km' /
 &NAM_PGD_GRID YINIFILE='16JAN98_36km' YFILETYPE='MESONH' /
 &NAM_INIFILE_CONF_PROJ IXOR=10, IYOR=10, IXSIZE=10, IYSIZE=10, IDXRATIO=4, IDYRATIO=4 /
diff --git a/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam b/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam
index a9a9dfd19d054411744d271cad782a84d244fbe0..0d51439c178145cd92b5a8b213bbc4e8f5c6d963 100644
--- a/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam
+++ b/MY_RUN/KTEST/007_16janvier/003_nest/PRE_NEST_PGD1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_PGD1 YPGD1 = '16JAN98_36km' /
 &NAM_PGD2 YPGD2 = '16JAN98_9km', IDAD = 1 /
 &NAM_NEST_PGD YNEST = 'e1' /
diff --git a/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam b/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam
index c08d6f7c6dc41faaf575a2c0aa8a0e23d9254785..bd6b5b90729373934541b04f93ddeb10edcabbe3 100644
--- a/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam
+++ b/MY_RUN/KTEST/007_16janvier/004_arp2lfi/PRE_REAL1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
   ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=1
 /
diff --git a/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam b/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam
index 58038602154328ba0c4a5648459fcc2da3a5c767..fe016986138efa70c933c9112b5ddc720012c881 100644
--- a/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam
+++ b/MY_RUN/KTEST/007_16janvier/005_spa_mod1_mod2/SPAWN1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_LUNIT2_SPA  CINIFILE = "16JAN_06_MNH",
                  CINIFILEPGD="16JAN98_36km.neste1",
                  YDOMAIN  = "16JAN98_9km.neste1",
diff --git a/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam b/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam
index bc49c644681a129ab05eeb64fc9760486f13a6f2..d48201b85bef477dac71341f351a9347cd69269f 100644
--- a/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam
+++ b/MY_RUN/KTEST/007_16janvier/006_preal/PRE_REAL1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_FILE_NAMES HATMFILE ='16JAN_06_MNH.spa04' , HATMFILETYPE='MESONH',
                 HPGDFILE ='16JAN98_9km.neste1' , CINIFILE='16JAN_06_MNH2' /
 &NAM_REAL_CONF NVERB=5 /
diff --git a/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src b/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src
index 4494e9b09fce759dee8788718aff46dc2f2bcdce..04a583eb4892a3971e2f724122c13bd7f07ef71b 100644
--- a/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src
+++ b/MY_RUN/KTEST/007_16janvier/008_run2/EXSEG1.nam.src
@@ -1,5 +1,5 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
- NZ_VERB=5
  ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=1 , NB_PROCIO_W=8 
 /
 &NAM_LUNITn  CINIFILE = "16JAN_06_MNH",CINIFILEPGD="16JAN98_36km.neste1"  /
diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1 b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1
index 2bc3cb12cada2d3216bd6f3dc10b957cd6e06550..c9b6e568df0dd12d6a9bacf940b1dbda1eb82444 100644
--- a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1
+++ b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam1
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
  ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1
 /
diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2 b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2
index c1a078ce8886a08ec5c82027517e1815f5b06b04..982826290316852996964a0815edcafbebf0ec78 100644
--- a/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2
+++ b/MY_RUN/KTEST/007_16janvier/009_diag/DIAG1.nam2
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_CONFZ
  ! NZ_VERB=5 , NZ_PROC=0 , NB_PROCIO_R=8 , NB_PROCIO_W=1
 /
diff --git a/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz b/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz
index 124f24423a70777a283d7cfcc77212e6b1501ad6..53e94f7769e24d282382fd3ea8e4feb350fb77d8 100755
--- a/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz
+++ b/MY_RUN/KTEST/007_16janvier/009_diag/run_diag_xyz
@@ -15,6 +15,7 @@ ln -sf ../003_nest/16JAN98_36km.neste1.* .
 
 cp  DIAG1.nam1 DIAG1.nam
 time ${MPIRUN} DIAG${XYZ}
+#exit
 #
 # 2nd modele
 #
diff --git a/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam b/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam
index d0a1a5cc3c388177c423c288ddbcf11c3c572b36..2aa695f4d6fde5ac0356ddd547d3d71bff06b3ad 100644
--- a/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam
+++ b/MY_RUN/KTEST/007_16janvier/012_spectre/SPEC1.nam
@@ -1,3 +1,4 @@
+&NAM_CONFIO  LCDF4=T, LLFIOUT=T, LLFIREAD=F /
 &NAM_SPECTRE             
   LSPECTRE_U=.TRUE.,
   LSPECTRE_V=.TRUE.,
diff --git a/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz b/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz
index 6c7e0d07865a078cf0feb85a96915b4de9ca5bcd..f8f4bccf09eba6de325e35de8d5193eb235726cc 100755
--- a/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz
+++ b/MY_RUN/KTEST/007_16janvier/012_spectre/run_spectre_xyz
@@ -4,8 +4,7 @@
 #MNH_LIC for details. version 1.
 set -x
 set -e
-ln -s ../008_run2/16JAN.1.12B18.001.lfi .
-ln -s ../008_run2/16JAN.1.12B18.001.des .
+ln -fs ../008_run2/16JAN.1.12B18.001.??? .
 time ${MPIRUN} SPECTRE${XYZ}  
 
 
diff --git a/src/LIB/SURCOUCHE/src/extern_userio.f90 b/src/LIB/SURCOUCHE/src/extern_userio.f90
index e209ed95e9c98da57ff9ce04e0fa537375781661..96d7acf4159eec7d8ef3f53f5c639351681b2ed0 100644
--- a/src/LIB/SURCOUCHE/src/extern_userio.f90
+++ b/src/LIB/SURCOUCHE/src/extern_userio.f90
@@ -657,6 +657,24 @@ INTEGER,           INTENT(OUT)::KRESP    ! return-code
 CALL E_FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,KLENCH,HCOMMENT,KRESP)
 
 END SUBROUTINE FMWRITC0_ll
+
+SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,&
+     KLENCH,HCOMMENT,KRESP)
+USE MODE_FMWRIT, ONLY : E_FMWRITC1_ll=>FMWRITC1_ll
+IMPLICIT NONE
+CHARACTER(LEN=*),  INTENT(IN) ::HFILEM ! FM-file name
+CHARACTER(LEN=*),  INTENT(IN) ::HRECFM ! name of the article to read
+CHARACTER(LEN=*),  INTENT(IN) ::HFIPRI ! output file for error messages
+CHARACTER(LEN=*),  INTENT(IN) ::HDIR   ! field form
+CHARACTER(LEN=*),DIMENSION(:),  INTENT(IN) ::HFIELD ! array containing the data field
+INTEGER,           INTENT(IN)::KGRID  ! C-grid indicator (u,v,w,T)
+INTEGER,           INTENT(IN)::KLENCH ! length of comment string
+CHARACTER(LEN=*),  INTENT(IN)::HCOMMENT ! comment string
+INTEGER,           INTENT(OUT)::KRESP    ! return-code
+
+CALL E_FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,KLENCH,HCOMMENT,KRESP)
+
+END SUBROUTINE FMWRITC1_ll
   
 SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,&
      KLENCH,HCOMMENT,KRESP)
diff --git a/src/LIB/SURCOUCHE/src/fmread_ll.f90 b/src/LIB/SURCOUCHE/src/fmread_ll.f90
index c709c5a293bdd00a3cdff854010756e133d9ea59..694e1012d6886c11a02034102a8c6cc07f1e6db6 100644
--- a/src/LIB/SURCOUCHE/src/fmread_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmread_ll.f90
@@ -25,6 +25,9 @@ MODULE MODE_FMREAD
 !              lue non trouvé !!!
 !
 USE MODD_MPIF
+#if defined(MNH_IOCDF4)
+USE MODE_NETCDF
+#endif
 IMPLICIT NONE 
 
 PRIVATE
@@ -122,11 +125,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+    IF (ASSOCIATED(TZFD%CDF)) THEN
+       CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+    ELSE
+       CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+    END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE ! multiprocessor execution
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+      END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -197,13 +208,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+    IF (ASSOCIATED(TZFD%CDF)) THEN
+       CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+    ELSE
+       CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+    END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE ! multiprocessor execution
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
-           & ,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+              & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(ZFIELDP(0))
       GALLOC = .TRUE.
@@ -303,15 +322,27 @@ IF (ASSOCIATED(TZFD)) THEN
 !    IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN 
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN 
       ZFIELDP=>PFIELD(2:2,2:2)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:)=SPREAD(SPREAD(PFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3)
 !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
     ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
       ZFIELDP=>PFIELD(:,2:2)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:)=SPREAD(PFIELD(:,2),DIM=2,NCOPIES=3)
     ELSE
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      END IF
     END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE ! multiprocessor execution
@@ -319,8 +350,12 @@ IF (ASSOCIATED(TZFD)) THEN
     IF (ISP == TZFD%OWNER)  THEN
       ! I/O processor case
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC) 
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(ZFIELDP(0,0))
       GALLOC = .TRUE.
@@ -328,7 +363,7 @@ IF (ASSOCIATED(TZFD)) THEN
     CALL SECOND_MNH2(T1)
     TIMEZ%T_READ2D_READ=TIMEZ%T_READ2D_READ + T1 - T0
     !
-    !JUAN BGQ CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+    CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
     IF (IRESP /= 0) GOTO 1000
     !
     CALL BCAST_HEADER(TZFD,TZFMH)
@@ -477,24 +512,40 @@ IF (ASSOCIATED(TZFD)) THEN
 !    IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN 
     IF (LPACK .AND. L1D  .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN 
       ZFIELDP=>PFIELD(2:2,2:2,:)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3)
 !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
     ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
       ALLOCATE (ZFIELDP(SIZE(PFIELD,1),1,SIZE(PFIELD,3)))
       GALLOC = .TRUE.
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:)=SPREAD(ZFIELDP(:,1,:),DIM=2,NCOPIES=3)
     ELSE
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      END IF
     END IF
     IF (IRESP /= 0) GOTO 1000
   ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR.  ( HDIR == '--' )  ) THEN ! multiprocessor execution & 1 IO proc 
   ! read 3D field for graphique
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE 
       ALLOCATE(ZFIELDP(0,0,0))
       GALLOC = .TRUE. 
@@ -553,9 +604,12 @@ IF (ASSOCIATED(TZFD)) THEN
                CALL SECOND_MNH2(T0)
                WRITE(YK,'(I4.4)')  JKK
                YRECZSLIDE = TRIM(HRECFM)//YK
-               CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
-                    & ,IRESP)
-               
+               IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN
+                  CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP)
+               ELSE
+                  CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
+                       & ,IRESP)
+               END IF
                CALL SECOND_MNH2(T1)
                TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
                !
@@ -607,8 +661,12 @@ IF (ASSOCIATED(TZFD)) THEN
                CALL SECOND_MNH2(T0)
               WRITE(YK,'(I4.4)')  JKK
               YRECZSLIDE = TRIM(HRECFM)//YK
-              CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
+              IF (ASSOCIATED(TZFD_IOZ%CDF)) THEN
+                 CALL NCREAD(TZFD_IOZ%CDF%NCID,YRECZSLIDE,ZSLIDE_ll,TZFMH,IRESP)
+              ELSE
+                 CALL FM_READ_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
                    & ,IRESP)
+              END IF
               !JUANIOZ
                CALL SECOND_MNH2(T1)
                TIMEZ%T_READ3D_READ=TIMEZ%T_READ3D_READ + T1 - T0
@@ -763,22 +821,38 @@ IF (ASSOCIATED(TZFD)) THEN
 !    IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN 
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN 
       ZFIELDP=>PFIELD(2:2,2:2,:,:)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3)
 !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
     ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
       ZFIELDP=>PFIELD(:,2:2,:,:)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:,:)=SPREAD(PFIELD(:,2,:,:),DIM=2,NCOPIES=3)
     ELSE
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      END IF
     END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(ZFIELDP(0,0,0,0))
       GALLOC = .TRUE.
@@ -866,22 +940,38 @@ IF (ASSOCIATED(TZFD)) THEN
 !    IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN 
     IF (LPACK .AND. L1D .AND. SIZE(PFIELD,1)==3 .AND. SIZE(PFIELD,2)==3) THEN 
       ZFIELDP=>PFIELD(2:2,2:2,:,:,:)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:,:,:)=SPREAD(SPREAD(PFIELD(2,2,:,:,:),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3)
 !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
     ELSE IF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
       ZFIELDP=>PFIELD(:,2:2,:,:,:)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+      END IF
       PFIELD(:,:,:,:,:)=SPREAD(PFIELD(:,2,:,:,:),DIM=2,NCOPIES=3)
     ELSE
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      END IF
     END IF  
     IF (IRESP /= 0) GOTO 1000
   ELSE ! multiprocessor execution
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(ZFIELDP(0,0,0,0,0))
       GALLOC = .TRUE.
@@ -966,13 +1056,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,PFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+      END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE ! multiprocessor execution
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(ZFIELDP,PFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,ZFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(ZFIELDP(0,0,0,0,0,0))
       GALLOC = .TRUE.
@@ -1052,11 +1150,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+      END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+      END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -1126,13 +1232,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+    IF (ASSOCIATED(TZFD%CDF)) THEN
+       CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP)
+    ELSE
+       CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+    END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
            & ,IRESP)
+      END IF
     ELSE
       ALLOCATE(IFIELDP(0))
       GALLOC = .TRUE.
@@ -1210,22 +1324,38 @@ IF (ASSOCIATED(TZFD)) THEN
 !    IF (LPACK .AND. L1D .AND. HDIR=='XY') THEN 
     IF (LPACK .AND. L1D .AND. SIZE(KFIELD,1)==3 .AND. SIZE(KFIELD,2)==3) THEN 
       IFIELDP=>KFIELD(2:2,2:2)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+      END IF
       KFIELD(:,:)=SPREAD(SPREAD(KFIELD(2,2),DIM=1,NCOPIES=3),DIM=2,NCOPIES=3)
 !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
     ELSE IF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==3) THEN
       IFIELDP=>KFIELD(:,2:2)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+      END IF
       KFIELD(:,:)=SPREAD(KFIELD(:,2),DIM=2,NCOPIES=3)
     ELSE
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,KFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+      END IF
     END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
       CALL ALLOCBUFFER_ll(IFIELDP,KFIELD,HDIR,GALLOC)
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELDP,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP&
            & ,TZFMH,IRESP)
+      END IF
     ELSE
       ALLOCATE(IFIELDP(0,0))
       GALLOC = .TRUE.
@@ -1316,11 +1446,19 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+    IF (ASSOCIATED(TZFD%CDF)) THEN
+       CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP)
+    ELSE
+       CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+    END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+      END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -1395,13 +1533,21 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH&
          & ,IRESP)
+      END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH&
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,IFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH&
            & ,IRESP)
+      END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -1436,7 +1582,7 @@ END SUBROUTINE FMREADL1_ll
 
 SUBROUTINE FMREADC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,&
      KLENCH,HCOMMENT,KRESP)
-USE MODD_IO_ll, ONLY : ISP,GSMONOPROC 
+USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIREAD
 USE MODD_FM
 USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
 !
@@ -1463,7 +1609,8 @@ INTEGER                           :: IERR
 TYPE(FD_ll), POINTER              :: TZFD
 INTEGER                           :: IRESP
 INTEGER                           :: JLOOP
-INTEGER, DIMENSION(:), ALLOCATABLE:: IFIELD
+INTEGER, DIMENSION(LEN(HFIELD))   :: IFIELD
+CHARACTER(LEN(HFIELD))            :: YFIELD
 INTEGER                           :: ILENG
 TYPE(FMHEADER)                    :: TZFMH
 
@@ -1473,16 +1620,23 @@ TYPE(FMHEADER)                    :: TZFMH
 IRESP = 0
 YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 ILENG=LEN(HFIELD)
-ALLOCATE(IFIELD(ILENG))
 !
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN  ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+      END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE ! parallel execution
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,YFIELD,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+      END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -1490,13 +1644,26 @@ IF (ASSOCIATED(TZFD)) THEN
     !
     CALL BCAST_HEADER(TZFD,TZFMH)
     !
-    CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,&
-       & IERR)
+    IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN
+       ! NetCDF
+       CALL MPI_BCAST(YFIELD,ILENG,MPI_CHARACTER,TZFD%OWNER-1,TZFD%COMM,&
+            &IERR)
+    ELSE 
+       ! LFI
+       CALL MPI_BCAST(IFIELD,ILENG,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,&
+            & IERR)
+    END IF
   END IF ! parallel execution
   !
-  DO JLOOP=1,ILENG
-    HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP))
-  END DO
+  IF (LIOCDF4 .AND. .NOT. LLFIREAD) THEN
+     ! NetCDF
+     HFIELD = YFIELD
+  ELSE
+     ! LFI Case
+     DO JLOOP=1,ILENG
+        HFIELD(JLOOP:JLOOP)=ACHAR(IFIELD(JLOOP))
+     END DO
+  END IF
   KGRID  = TZFMH%GRID
   KLENCH = TZFMH%COMLEN
   HCOMMENT = TZFMH%COMMENT(1:TZFMH%COMLEN)
@@ -1509,7 +1676,6 @@ END IF
 IF (IRESP.NE.0) THEN
   CALL FM_READ_ERR("FMREADC0_ll",HFILEM,HFIPRI,HRECFM,HDIR,IRESP)
 ENDIF
-IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD)
 KRESP = IRESP
 RETURN
 
@@ -1561,17 +1727,28 @@ YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
 TZFD=>GETFD(YFNLFI)
 IF (ASSOCIATED(TZFD)) THEN
   IF (GSMONOPROC) THEN ! sequential execution
-    CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
-         & ,TZFMH,IRESP)
-    CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME&
-         & ,TZFMH,IRESP)
+    IF (ASSOCIATED(TZFD%CDF)) THEN
+       CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP)
+       CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP)
+    ELSE
+       CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
+       & ,TZFMH,IRESP)
+       CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME&
+       & ,TZFMH,IRESP)
+    END IF
     IF (IRESP /= 0) GOTO 1000
   ELSE
     IF (ISP == TZFD%OWNER)  THEN
-      CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
-           & ,TZFMH,IRESP)
-      CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME&
-           & ,TZFMH,IRESP)
+       IF (ASSOCIATED(TZFD%CDF)) THEN
+          CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TDATE',ITDATE,TZFMH,IRESP)
+          CALL NCREAD(TZFD%CDF%NCID,TRIM(HRECFM)//'%TIME',ZTIME,TZFMH,IRESP)
+       ELSE
+          CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
+               & ,TZFMH,IRESP)
+          CALL FM_READ_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,ZTIME&
+               & ,TZFMH,IRESP)
+
+       END IF
     END IF
     !
     CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -1667,18 +1844,30 @@ IF (ASSOCIATED(TZFD)) THEN
       Z3D = 0.0
       IF (LPACK .AND. L2D) THEN
         TX3DP=>Z3D(:,2:2,:)
-        CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+        IF (ASSOCIATED(TZFD%CDF)) THEN
+           CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP)
+        ELSE
+           CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+        END IF
         Z3D(:,:,:) = SPREAD(Z3D(:,2,:),DIM=2,NCOPIES=3)
       ELSE
-        CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+         IF (ASSOCIATED(TZFD%CDF)) THEN
+            CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP)
+         ELSE
+            CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+         END IF
       END IF
       PLB(1:KRIM+1,:,:)          = Z3D(1:KRIM+1,:,:)
       PLB(KRIM+2:2*(KRIM+1),:,:) = Z3D(KL3D-KRIM:KL3D,:,:)
     ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') 
       ALLOCATE(Z3D(SIZE(PLB,1),KL3D,SIZE(PLB,3)))
       Z3D = 0.0
-      CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
-      PLB(:,1:KRIM+1,:)          = Z3D(:,1:KRIM+1,:)
+      IF (ASSOCIATED(TZFD%CDF)) THEN
+         CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP)
+      ELSE
+         CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+      END IF
+         PLB(:,1:KRIM+1,:)          = Z3D(:,1:KRIM+1,:)
       PLB(:,KRIM+2:2*(KRIM+1),:) = Z3D(:,KL3D-KRIM:KL3D,:)
     END IF
     IF (IRESP /= 0) GOTO 1000
@@ -1691,17 +1880,29 @@ IF (ASSOCIATED(TZFD)) THEN
         Z3D = 0.0
         IF (LPACK .AND. L2D) THEN
           TX3DP=>Z3D(:,2:2,:)
-          CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+          IF (ASSOCIATED(TZFD%CDF)) THEN
+             CALL NCREAD(TZFD%CDF%NCID,HRECFM,TX3DP,TZFMH,IRESP)
+          ELSE
+             CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+          END IF
           Z3D(:,:,:) = SPREAD(Z3D(:,2,:),DIM=2,NCOPIES=3)
         ELSE
-          CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+           IF (ASSOCIATED(TZFD%CDF)) THEN
+              CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP)
+           ELSE
+              CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+           END IF
         END IF
         ! erase gap in LB field
         Z3D(KRIM+2:2*(KRIM+1),:,:) = Z3D(KL3D-KRIM:KL3D,:,:)
       ELSE !(HLBTYPE == 'LBY' .OR. HLBTYPE == 'LBYV') 
         ALLOCATE(Z3D(IIMAX_ll+2*JPHEXT,KL3D,SIZE(PLB,3)))
         Z3D = 0.0
-        CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+        IF (ASSOCIATED(TZFD%CDF)) THEN
+           CALL NCREAD(TZFD%CDF%NCID,HRECFM,Z3D,TZFMH,IRESP)
+        ELSE
+           CALL FM_READ_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(Z3D),Z3D,TZFMH,IRESP)
+        END IF
         ! erase gap in LB field
         Z3D(:,KRIM+2:2*(KRIM+1),:) = Z3D(:,KL3D-KRIM:KL3D,:)
       END IF
diff --git a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90 b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
index cd37f28c0ed990168f864a79f8008ff8295dbced..89ae95aa086ebad9d1adae76e496204f3237d6ba 100644
--- a/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
+++ b/src/LIB/SURCOUCHE/src/fmwrit_ll.f90
@@ -158,9 +158,13 @@ MODULE MODE_GA
 END MODULE MODE_GA
 
 #endif
+
 MODULE MODE_FMWRIT
 
   USE MODD_MPIF
+#if defined(MNH_IOCDF4)
+  USE MODE_NETCDF
+#endif
 
   IMPLICIT NONE 
 
@@ -170,7 +174,8 @@ MODULE MODE_FMWRIT
      MODULE PROCEDURE FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,&
           & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,&
           & FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,&
-          & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITT0_ll
+          & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,&
+          & FMWRITC1_ll,FMWRITT0_ll
   END INTERFACE
 
   INTERFACE FMWRITBOX
@@ -180,7 +185,7 @@ MODULE MODE_FMWRIT
 
   PUBLIC FMWRIT_LB,FMWRITBOX,FMWRIT,FMWRITX0_ll,FMWRITX1_ll,FMWRITX2_ll,FMWRITX3_ll,&
        & FMWRITX4_ll,FMWRITX5_ll,FMWRITX6_ll,FMWRITN0_ll,FMWRITN1_ll,FMWRITN2_ll,&
-       & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITT0_ll,FMWRITBOXX2_ll,&
+       & FMWRITL0_ll,FMWRITL1_ll,FMWRITC0_ll,FMWRITC1_ll,FMWRITT0_ll,FMWRITBOXX2_ll,&
        & FMWRITBOXX3_ll,FMWRITBOXX4_ll,FMWRITBOXX5_ll,FMWRITBOXX6_ll
 
   !INCLUDE 'mpif.h'
@@ -222,7 +227,7 @@ CONTAINS
 !  J.Escobar 15/04/2014 : add write to all Z files for all FMWRITX0_ll variables
 !  J.Escobar 23/06/2014 : bug , replace .FALSE. to .TRUE. = OREAL type transmetted to FM_WRIT_ll
 !
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
 #ifdef MNH_NCWRIT
@@ -295,7 +300,8 @@ CONTAINS
           END IF
           END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)    
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -323,7 +329,8 @@ CONTAINS
                END IF
              END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -345,7 +352,8 @@ CONTAINS
                 CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
                END IF
 #else
-                CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+               IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.TRUE.,1,PFIELD,TZFMH,IRESP)
+               IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
              END IF
           END DO
@@ -362,7 +370,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX1_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -437,7 +445,8 @@ CONTAINS
             END IF
          END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -470,8 +479,9 @@ CONTAINS
              END IF
            END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -490,7 +500,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX2_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -584,7 +594,8 @@ CONTAINS
                   & KLENCH,HCOMMENT)
       END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
              !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
@@ -611,7 +622,8 @@ CONTAINS
              END IF
                NCWR = .TRUE.
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -637,7 +649,8 @@ CONTAINS
                NCWR = .TRUE.
 !             END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
           END IF
        ELSE ! multiprocessor execution
@@ -724,8 +737,9 @@ CONTAINS
               END IF
                 NCWR=.TRUE.
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
 #ifdef MNH_GA
@@ -758,7 +772,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX3_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -889,7 +903,8 @@ CONTAINS
              & KLENCH,HCOMMENT)
         END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
              !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
@@ -908,7 +923,8 @@ CONTAINS
                & KLENCH,HCOMMENT)
         END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -924,7 +940,8 @@ CONTAINS
                 & KLENCH,HCOMMENT)
         END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
           END IF
        ELSEIF ( (TZFD%nb_procio .eq. 1 ) .OR. ( HDIR == '--' ) ) THEN  ! multiprocessor execution & 1 proc IO
@@ -968,8 +985,9 @@ CONTAINS
                & KLENCH,HCOMMENT)
         END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
        END IF
           !
@@ -980,6 +998,7 @@ CONTAINS
           !
           !JUAN BG Z SLIDE 
           !
+          !
 #ifdef MNH_GA
           !
           ! init/create the ga
@@ -1035,8 +1054,9 @@ CONTAINS
                CALL SECOND_MNH2(T1)
                TIMEZ%T_WRIT3D_RECV=TIMEZ%T_WRIT3D_RECV + T1 - T0
                !
-               CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
-                    & ,IRESP)
+               IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),&
+                    &ZSLIDE_ll,TZFMH,IRESP)
+               IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,HDIR,ZSLIDE_ll,TZFMH,IRESP)
                CALL SECOND_MNH2(T2)
                TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
             END IF
@@ -1159,8 +1179,9 @@ CONTAINS
                    TZFMH%COMMENT=HCOMMENT
                    WRITE(YK,'(I4.4)')  JKK
                    YRECZSLIDE = TRIM(HRECFM)//YK
-                   CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
+                   IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,YRECZSLIDE,.TRUE.,SIZE(ZSLIDE_ll),ZSLIDE_ll,TZFMH&
                         & ,IRESP)
+                   IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,YRECZSLIDE,HDIR,ZSLIDE_ll,TZFMH,IRESP)
                    CALL SECOND_MNH2(T2)
                    TIMEZ%T_WRIT3D_WRIT=TIMEZ%T_WRIT3D_WRIT + T2 - T1
                 END IF
@@ -1185,7 +1206,6 @@ CONTAINS
           !JUAN BG Z SLIDE  
 ! end of MNH_GA
 #endif
-
        END IF ! multiprocessor execution
     ELSE
        IRESP = -61
@@ -1205,7 +1225,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX4_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -1261,7 +1281,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
            END IF
 #else
-           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
              !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D  .AND. SIZE(PFIELD,2)==3) THEN
@@ -1271,7 +1292,8 @@ CONTAINS
             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
           END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -1279,7 +1301,8 @@ CONTAINS
             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
           END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
           END IF
        ELSE
@@ -1309,7 +1332,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
            END IF
 #else
-           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1328,7 +1352,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX5_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -1395,7 +1419,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
             END IF
 #else
-            CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
              !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
      ELSEIF (LPACK .AND. L2D .AND. SIZE(PFIELD,2)==3) THEN
@@ -1415,7 +1440,8 @@ CONTAINS
                & KLENCH,HCOMMENT)
              END IF
 #else
-        CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -1432,7 +1458,8 @@ CONTAINS
                & KLENCH,HCOMMENT)
              END IF
 #else
-       CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
           END IF
        ELSE
@@ -1473,8 +1500,9 @@ CONTAINS
                & KLENCH,HCOMMENT)
              END IF
 #else
-         CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1493,7 +1521,7 @@ CONTAINS
 
   SUBROUTINE FMWRITX6_ll(HFILEM,HRECFM,HFIPRI,HDIR,PFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -1546,7 +1574,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PFIELD),PFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,PFIELD,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -1572,8 +1601,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1592,7 +1622,7 @@ CONTAINS
 
   SUBROUTINE FMWRITN0_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     !*      0.    DECLARATIONS
@@ -1650,7 +1680,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP)
 #endif
        ELSE 
           IF (ISP == TZFD%OWNER)  THEN
@@ -1662,7 +1693,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1685,7 +1717,8 @@ CONTAINS
                 CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
                END IF
 #else
-                CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+                IF (LLFIOUT) CALL FM_WRIT_ll(TZFD_IOZ%FLU,HRECFM,.FALSE.,1,KFIELD,TZFMH,IRESP)
+                IF (LIOCDF4) CALL NCWRIT(TZFD_IOZ%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP)
 #endif
              END IF
           END DO
@@ -1703,7 +1736,7 @@ CONTAINS
 
   SUBROUTINE FMWRITN1_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -1772,7 +1805,8 @@ CONTAINS
           & .TRUE.,TZRECLIST,KLENCH,HCOMMENT)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -1801,8 +1835,9 @@ CONTAINS
                    & KLENCH,HCOMMENT)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1822,7 +1857,7 @@ CONTAINS
 
   SUBROUTINE FMWRITN2_ll(HFILEM,HRECFM,HFIPRI,HDIR,KFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LPACK,L1D,L2D
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L1D,L2D
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_ALLOCBUFFER_ll
@@ -1880,7 +1915,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP)
 #endif
              !    ELSE IF (LPACK .AND. L2D .AND. HDIR=='XY') THEN
           ELSEIF (LPACK .AND. L2D .AND. SIZE(KFIELD,2)==3) THEN
@@ -1890,7 +1926,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -1898,7 +1935,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(KFIELD),KFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,KFIELD,TZFMH,IRESP)
 #endif
           END IF
        ELSE
@@ -1929,8 +1967,9 @@ CONTAINS
                   & ,IRESP)
                 END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELDP),IFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -1951,7 +1990,7 @@ CONTAINS
 
   SUBROUTINE FMWRITL0_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
 
@@ -2012,7 +2051,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP)
 #endif 
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -2024,7 +2064,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,1,IFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP)
 #endif
           END IF
           CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
@@ -2042,7 +2083,7 @@ CONTAINS
 
   SUBROUTINE FMWRITL1_ll(HFILEM,HRECFM,HFIPRI,HDIR,OFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
 
@@ -2101,7 +2142,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -2113,7 +2155,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,SIZE(IFIELD),IFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,IFIELD,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2132,7 +2175,7 @@ CONTAINS
 
   SUBROUTINE FMWRITC0_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     !
@@ -2207,7 +2250,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -2219,7 +2263,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,KRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2237,9 +2282,98 @@ CONTAINS
     KRESP = IRESP
   END SUBROUTINE FMWRITC0_ll
 
+  SUBROUTINE FMWRITC1_ll(HFILEM,HRECFM,HFIPRI,HDIR,HFIELD,KGRID,&
+       KLENCH,HCOMMENT,KRESP)
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
+    USE MODD_FM
+    USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
+    !
+    !*      0.    DECLARATIONS
+    !             ------------
+    !
+    !
+    !*      0.1   Declarations of arguments
+    !
+    CHARACTER(LEN=*),             INTENT(IN) ::HFILEM ! FM-file name
+    CHARACTER(LEN=*),             INTENT(IN) ::HRECFM ! name of the article to read
+    CHARACTER(LEN=*),             INTENT(IN) ::HFIPRI ! output file for error messages
+    CHARACTER(LEN=*),             INTENT(IN) ::HDIR   ! field form
+    CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) ::HFIELD ! array containing the data field
+    INTEGER,                      INTENT(IN) ::KGRID  ! C-grid indicator (u,v,w,T)
+    INTEGER,                      INTENT(IN) ::KLENCH ! length of comment string
+    CHARACTER(LEN=*),             INTENT(IN) ::HCOMMENT ! comment string
+    INTEGER,                      INTENT(OUT)::KRESP    ! return-code
+    !
+    !*      0.2   Declarations of local variables
+    !
+    INTEGER                          :: J,JJ
+    INTEGER                          :: ILE, IP
+    INTEGER,DIMENSION(:),ALLOCATABLE :: IFIELD
+    INTEGER                          :: ILENG
+    CHARACTER(LEN=JPFINL)            :: YFNLFI
+    INTEGER                          :: IERR
+    TYPE(FD_ll), POINTER             :: TZFD
+    INTEGER                          :: IRESP
+    TYPE(FMHEADER)                   :: TZFMH
+    !----------------------------------------------------------------
+    !*      1.1   THE NAME OF LFIFM
+    !
+    IRESP = 0
+    YFNLFI=TRIM(ADJUSTL(HFILEM))//'.lfi'
+    !print * , ' Writing Article C1 ' , HRECFM
+    ILE=LEN(HFIELD)
+    IP=SIZE(HFIELD)
+    ILENG=ILE*IP
+    !
+    IF (ILENG==0) THEN
+       IP=1
+       ILE=1
+       ILENG=1
+       ALLOCATE(IFIELD(1))
+       IFIELD(1)=IACHAR(' ')
+    ELSE
+       ALLOCATE(IFIELD(ILENG))
+       DO JJ=1,IP
+          DO J=1,ILE
+             IFIELD(ILE*(JJ-1)+J)=IACHAR(HFIELD(JJ)(J:J))
+          END DO
+       END DO
+    END IF
+    !----------------------------------------------------------------
+    TZFD=>GETFD(YFNLFI)
+    IF (ASSOCIATED(TZFD)) THEN
+       IF (GSMONOPROC) THEN  ! sequential execution
+          TZFMH%GRID=KGRID
+          TZFMH%COMLEN=KLENCH
+          TZFMH%COMMENT=HCOMMENT
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP)
+       ELSE
+          IF (ISP == TZFD%OWNER)  THEN
+             TZFMH%GRID=KGRID
+             TZFMH%COMLEN=KLENCH
+             TZFMH%COMMENT=HCOMMENT
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.FALSE.,ILENG,IFIELD,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,HDIR,HFIELD,TZFMH,IRESP)
+          END IF
+          !
+          CALL MPI_BCAST(IRESP,1,MPI_INTEGER,TZFD%OWNER-1,TZFD%COMM,IERR)
+       END IF
+    ELSE 
+       IRESP = -61
+    END IF
+    !----------------------------------------------------------------
+    IF (IRESP.NE.0) THEN
+       CALL FM_WRIT_ERR("FMWRITC1_ll",HFILEM,HFIPRI,HRECFM,HDIR,KGRID,KLENCH&
+            & ,IRESP)
+    END IF
+    IF (ALLOCATED(IFIELD)) DEALLOCATE(IFIELD)
+    KRESP = IRESP
+  END SUBROUTINE FMWRITC1_ll
+
   SUBROUTINE FMWRITT0_ll(HFILEM,HRECFM,HFIPRI,HDIR,TFIELD,KGRID,&
        KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_TYPE_DATE
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
@@ -2293,8 +2427,9 @@ CONTAINS
                & ,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
                & ,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP)
 #endif
           TZFMH%COMMENT='SECONDS'
           TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT)
@@ -2304,8 +2439,9 @@ CONTAINS
                & ,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME&
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME&
                & ,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP)
 #endif
        ELSE
           IF (ISP == TZFD%OWNER)  THEN
@@ -2318,8 +2454,9 @@ CONTAINS
                   & ,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TDATE',.FALSE.,3,ITDATE&
                   & ,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TDATE',HDIR,ITDATE,TZFMH,IRESP)
 #endif
              TZFMH%COMMENT='SECONDS'
              TZFMH%COMLEN=LEN_TRIM(TZFMH%COMMENT)
@@ -2329,8 +2466,10 @@ CONTAINS
                   & ,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME&
+
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,TRIM(HRECFM)//'%TIME',.TRUE.,1,TFIELD%TIME&
                   & ,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,TRIM(HRECFM)//'%TIME',HDIR,TFIELD%TIME,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2349,7 +2488,7 @@ CONTAINS
 
   SUBROUTINE FMWRIT_LB(HFILEM,HRECFM,HFIPRI,HLBTYPE,PLB,KRIM,KL3D,&
        & KGRID,KLENCH,HCOMMENT,KRESP)
-    USE MODD_IO_ll,        ONLY : ISP,ISNPROC,GSMONOPROC,LPACK,L2D
+    USE MODD_IO_ll,        ONLY : ISP,ISNPROC,GSMONOPROC,LIOCDF4,LLFIOUT,LPACK,L2D
     USE MODD_PARAMETERS_ll,ONLY : JPHEXT
     USE MODD_FM
     USE MODE_DISTRIB_LB
@@ -2420,7 +2559,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP)
 #endif
           ELSE
 #ifdef MNH_NCWRIT
@@ -2428,7 +2568,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(PLB),PLB,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',PLB,TZFMH,IRESP)
 #endif
           END IF
        ELSE
@@ -2465,7 +2606,8 @@ CONTAINS
              CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(TX3DP),TX3DP,TZFMH,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',TX3DP,TZFMH,IRESP)
 #endif
           ELSE
              NB_REQ=0
@@ -2507,7 +2649,7 @@ CONTAINS
 
   SUBROUTINE FMWRITBOXX2_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,&
        HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_GATHER_ll
@@ -2571,7 +2713,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -2596,8 +2739,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2617,7 +2761,7 @@ CONTAINS
 
   SUBROUTINE FMWRITBOXX3_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,&
        HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_GATHER_ll
@@ -2681,7 +2825,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -2706,8 +2851,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2727,7 +2873,7 @@ CONTAINS
 
   SUBROUTINE FMWRITBOXX4_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,&
        HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_GATHER_ll
@@ -2791,7 +2937,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -2816,8 +2963,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2837,7 +2985,7 @@ CONTAINS
 
   SUBROUTINE FMWRITBOXX5_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,&
        HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_GATHER_ll
@@ -2901,7 +3049,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -2927,8 +3076,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
@@ -2948,7 +3098,7 @@ CONTAINS
 
   SUBROUTINE FMWRITBOXX6_ll(HFILEM,HRECFM,HFIPRI,HBUDGET,PFIELD,KGRID,&
        HCOMMENT,KXOBOX,KXEBOX,KYOBOX,KYEBOX,KRESP)
-    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC
+    USE MODD_IO_ll, ONLY : ISP,GSMONOPROC,LIOCDF4,LLFIOUT
     USE MODD_FM
     USE MODE_FD_ll, ONLY : GETFD,JPFINL,FD_LL
     USE MODE_GATHER_ll
@@ -3012,7 +3162,8 @@ CONTAINS
           CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
                END IF
 #else
-          CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH,IRESP)
+          IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
        ELSE ! multiprocessor execution
           IF (ISP == TZFD%OWNER)  THEN
@@ -3038,8 +3189,9 @@ CONTAINS
                   & ,IRESP)
                END IF
 #else
-             CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
+             IF (LLFIOUT) CALL FM_WRIT_ll(TZFD%FLU,HRECFM,.TRUE.,SIZE(ZFIELDP),ZFIELDP,TZFMH&
                   & ,IRESP)
+             IF (LIOCDF4) CALL NCWRIT(TZFD%CDF,HRECFM,'XY',ZFIELDP,TZFMH,IRESP)
 #endif
           END IF
           !
diff --git a/src/LIB/SURCOUCHE/src/modd_io.f90 b/src/LIB/SURCOUCHE/src/modd_io.f90
index f88dac6bc0b1b58ad9d3e19fabbe6df855d97d30..d58eeb88c83de738cffc35358da1ff3fa10bec88 100644
--- a/src/LIB/SURCOUCHE/src/modd_io.f90
+++ b/src/LIB/SURCOUCHE/src/modd_io.f90
@@ -31,4 +31,8 @@ LOGICAL, SAVE :: L1D   = .FALSE. ! TRUE if 1D model version
 LOGICAL, SAVE :: L2D   = .FALSE. ! TRUE if 2D model version
 LOGICAL, SAVE :: LPACK = .FALSE. ! TRUE if FM compression occurs in 1D or 2D model version
 
+LOGICAL, SAVE :: LIOCDF4    = .FALSE. ! TRUE will enable full NetCDF4 (HDF5) I/O support
+LOGICAL, SAVE :: LLFIOUT    = .FALSE. ! TRUE will also force LFI output when LIOCDF4 is on (debug only)  
+LOGICAL, SAVE :: LLFIREAD   = .FALSE. ! TRUE will force LFI read (instead of NetCDF) when LIOCDF4 is on (debug only)  
+LOGICAL, SAVE :: LDEFLATEX2 = .FALSE. ! TRUE to enable Zlib deflate compression on X2 fields  
 END MODULE MODD_IO_ll
diff --git a/src/LIB/SURCOUCHE/src/modd_netcdf.f90 b/src/LIB/SURCOUCHE/src/modd_netcdf.f90
new file mode 100644
index 0000000000000000000000000000000000000000..64658b353f9f91b8c32d0d8f29b6c8c0be72ba22
--- /dev/null
+++ b/src/LIB/SURCOUCHE/src/modd_netcdf.f90
@@ -0,0 +1,20 @@
+MODULE MODD_NETCDF
+IMPLICIT NONE 
+
+TYPE IOCDF
+   INTEGER :: NCID
+   TYPE(DIMCDF), POINTER :: DIMX
+   TYPE(DIMCDF), POINTER :: DIMY
+   TYPE(DIMCDF), POINTER :: DIMZ
+   TYPE(DIMCDF), POINTER :: DIMSTR
+   TYPE(DIMCDF), POINTER :: DIMLIST
+END TYPE IOCDF
+
+TYPE DIMCDF
+   CHARACTER(LEN=8)      :: NAME
+   INTEGER               :: LEN
+   INTEGER               :: ID
+   TYPE(DIMCDF), POINTER :: NEXT
+END TYPE DIMCDF
+
+END MODULE MODD_NETCDF
diff --git a/src/LIB/SURCOUCHE/src/mode_fd.f90 b/src/LIB/SURCOUCHE/src/mode_fd.f90
index bab16bca363ac88e26071819d0ed3bd99d627bf3..4233dc991073d4d1305ba52c5505e003fc1c2ded 100644
--- a/src/LIB/SURCOUCHE/src/mode_fd.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fd.f90
@@ -13,7 +13,8 @@
 !-----------------------------------------------------------------
 
 MODULE MODE_FD_ll
-USE MODD_IO_ll, ONLY : LFIPARAM
+USE MODD_IO_ll,  ONLY : LFIPARAM
+USE MODD_NETCDF, ONLY : IOCDF
 
 IMPLICIT NONE 
 
@@ -28,6 +29,7 @@ TYPE FD_ll
   CHARACTER(LEN=15)        :: MODE  ! Flag mode acces ('distrib','global','specific')   
   INTEGER                  :: OWNER ! I/O Processor number 
   TYPE(LFIPARAM),  POINTER :: PARAM
+  TYPE(IOCDF),     POINTER :: CDF
 !JUANZ
   INTEGER                  :: NB_PROCIO = 1
 !JUANZ
@@ -92,9 +94,10 @@ INTEGER              :: IRESP
 ALLOCATE(TZFD,STAT=IRESP)
 IF (IRESP > 0) THEN 
   !       CALL ABORT()
-  PRINT *, 'Erreur d"allocation memoire...'
+  PRINT *, 'NEWFD : Erreur d"allocation memoire...'
 END IF
 
+NULLIFY(TZFD%CDF)
 !! Add TZFD to top of list TPFDLIST
 TZFD%NEXT=>TFDLIST
 TFDLIST=>TZFD
diff --git a/src/LIB/SURCOUCHE/src/mode_fm.f90 b/src/LIB/SURCOUCHE/src/mode_fm.f90
index 5ab5c53c2e5a891b6b9dfa229b40b65427781d22..a204b894a7ca288dabd47288fb886ae486263e67 100644
--- a/src/LIB/SURCOUCHE/src/mode_fm.f90
+++ b/src/LIB/SURCOUCHE/src/mode_fm.f90
@@ -21,7 +21,6 @@ IMPLICIT NONE
 PRIVATE 
 
 INTEGER, PARAMETER :: JPPIPE = 10
-
 !INCLUDE 'mpif.h'
 
 PUBLIC SET_FMPACK_ll,FMATTR_ll,FMLOOK_ll,FMOPEN_ll,FMCLOS_ll
@@ -129,12 +128,15 @@ END SUBROUTINE FMLOOK_ll
 
 SUBROUTINE FMOPEN_ll(HFILEM,HACTION,HFIPRI,KNPRAR,KFTYPE,KVERB,KNINAR&
      & ,KRESP)
-USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM
+USE MODD_IO_ll, ONLY : ISP,ISTDOUT,LFIPARAM,LIOCDF4,LLFIOUT,LLFIREAD
 USE MODE_FD_ll, ONLY : FD_ll,GETFD,JPFINL
-USE MODE_IO_ll, ONLY : OPEN_ll
+USE MODE_IO_ll, ONLY : OPEN_ll,GCONFIO
 !JUANZ
 USE MODD_CONFZ,ONLY  : NB_PROCIO_R,NB_PROCIO_W
 !JUANZ
+#if defined(MNH_IOCDF4)
+USE MODE_NETCDF
+#endif
 CHARACTER(LEN=*),INTENT(IN) ::HFILEM  ! name of the file.
 CHARACTER(LEN=*),INTENT(IN) ::HACTION ! Action upon the file
 ! 'READ' or 'WRITE'
@@ -166,6 +168,12 @@ LOGICAL               :: GNAMFI8,GFATER8,GSTATS8
 INTEGER               :: INB_PROCIO
 !JUAN
 
+IF (.NOT. GCONFIO) THEN
+   PRINT *, 'FMOPEN_ll Aborting... Please, ensure to call SET_CONFIO_ll before &
+        &the first FMOPEN_ll call.'
+   STOP
+END IF
+
 INPRAR = KNPRAR+0 
 KNINAR = 0
 IROWF  = 0
@@ -228,33 +236,63 @@ IF (ISP == TZFDLFI%OWNER) THEN
     GSFIRST = .FALSE.
     OPEN(UNIT=JPPIPE,FILE='pipe_name',FORM='FORMATTED')
   END IF
+
+#if defined(MNH_IOCDF4)
+  IF (LIOCDF4) THEN
+     IF (HACTION == 'READ' .AND. .NOT. LLFIREAD) THEN
+        !! Open NetCDF File for reading
+        TZFDLFI%CDF => NEWIOCDF()
+        IRESOU = NF_OPEN(ADJUSTL(TRIM(HFILEM))//".nc4", NF_NOWRITE, TZFDLFI%CDF%NCID)
+        IF (IRESOU /= NF_NOERR) THEN
+           PRINT *, 'FMOPEN_ll, NF_OPEN error : ', NF_STRERROR(IRESOU)
+           STOP
+        END IF
+        PRINT *, 'NF_OPEN: ', TRIM(HFILEM)//'.nc4'
+     END IF
+     
+     IF (HACTION == 'WRITE') THEN
+        ! HACTION == 'WRITE'
+        TZFDLFI%CDF => NEWIOCDF()
+        IRESOU = NF_CREATE(ADJUSTL(TRIM(HFILEM))//".nc4", &
+             &IOR(NF_CLOBBER,NF_NETCDF4), TZFDLFI%CDF%NCID)
+        IF (IRESOU /= NF_NOERR) THEN
+           PRINT *, 'FMOPEN_ll, NF_CREATE error : ', NF_STRERROR(IRESOU)
+           STOP
+        END IF
+        PRINT *, 'NF_CREATE: ', TRIM(HFILEM)//'.nc4'
+     END IF
+  END IF
+#endif
   
-  !! LFI-File case
-  IRESOU = 0
-  GNAMFI = .TRUE.
-  GFATER = .TRUE.
-  !
-  INUMBR8 = INUMBR
-  GNAMFI8 = GNAMFI
-  GFATER8 = GFATER
-  GSTATS8 = GSTATS
-  !
-  CALL LFIOUV(IRESOU,     &
-       INUMBR8,           &
-       GNAMFI8,           &
-       YFNLFI,            &
-       "UNKNOWN",         &
-       GFATER8,           &
-       GSTATS8,           &
-       IMELEV,            &
-       INPRAR,            &
-       ININAR8)
-  KNINAR = ININAR8
-  
-  IF (IRESOU /= 0 .AND. IRESOU /= -11) THEN
-    IRESP = IRESOU
-  ENDIF
-  
+  IF (.NOT. LIOCDF4 .OR. (HACTION=='WRITE' .AND. LLFIOUT) &
+       &            .OR. (HACTION=='READ'  .AND. LLFIREAD)) THEN
+     ! LFI Case
+     IRESOU = 0
+     GNAMFI = .TRUE.
+     GFATER = .TRUE.
+     !
+     INUMBR8 = INUMBR
+     GNAMFI8 = GNAMFI
+     GFATER8 = GFATER
+     GSTATS8 = GSTATS
+     !
+     CALL LFIOUV(IRESOU,     &
+          INUMBR8,           &
+          GNAMFI8,           &
+          YFNLFI,            &
+          "UNKNOWN",         &
+          GFATER8,           &
+          GSTATS8,           &
+          IMELEV,            &
+          INPRAR,            &
+          ININAR8)
+     KNINAR = ININAR8
+     
+     IF (IRESOU /= 0 .AND. IRESOU /= -11) THEN
+        IRESP = IRESOU
+     ENDIF
+  END IF
+
   !
   !*      6.    TEST IF FILE IS NEWLY DEFINED
   !
@@ -296,6 +334,9 @@ USE MODE_IO_ll, ONLY : CLOSE_ll,UPCASE
 #if !defined(MNH_SGI)
 USE MODI_SYSTEM_MNH
 #endif
+#if defined(MNH_IOCDF4)
+USE MODE_NETCDF
+#endif
 CHARACTER(LEN=*),     INTENT(IN) ::HFILEM  ! file name
 CHARACTER(LEN=*),     INTENT(IN) ::HSTATU  ! status for the closed file
 CHARACTER(LEN=*),     INTENT(IN) ::HFIPRI  ! file for prints in FM
@@ -352,10 +393,12 @@ YFNLFI=ADJUSTL(TRIM(HFILEM)//'.lfi')
 TZFDLFI=>GETFD(YFNLFI)
 
 IF (ISP == TZFDLFI%OWNER) THEN
-  INUM8=TZFDLFI%FLU
-  CALL LFIFER(IRESP8,INUM8,YSTATU)
-  IRESP = IRESP8
-  
+  IF (TZFDLFI%FLU > 0) THEN
+     INUM8=TZFDLFI%FLU
+     CALL LFIFER(IRESP8,INUM8,YSTATU)
+     IRESP = IRESP8
+  END IF
+  IF (ASSOCIATED(TZFDLFI%CDF)) CALL CLEANIOCDF(TZFDLFI%CDF)
   IF (IRESP == 0) THEN
     !! Write in pipe
 #if defined(MNH_LINUX) || defined(MNH_SP4)
diff --git a/src/LIB/SURCOUCHE/src/mode_io.f90 b/src/LIB/SURCOUCHE/src/mode_io.f90
index 1edc573ea63be58096abdb89d7033c8075762af8..b975014e9c1d8edb36bc359d1be53e1e61ffb2e1 100644
--- a/src/LIB/SURCOUCHE/src/mode_io.f90
+++ b/src/LIB/SURCOUCHE/src/mode_io.f90
@@ -23,7 +23,6 @@
 MODULE MODE_IO_ll
 
   USE MODD_ERRCODES
-  USE MODD_IO_ll
   USE MODE_FD_ll
   USE MODD_MPIF
   !JUANZ
@@ -47,8 +46,12 @@ MODULE MODE_IO_ll
   !! Provisoire
   CHARACTER(LEN=*),PARAMETER :: GLOBAL='GLOBAL'
   CHARACTER(LEN=*),PARAMETER :: SPECIFIC='SPECIFIC'
+  !!
+  LOGICAL,SAVE :: GCONFIO = .FALSE. ! Turn TRUE when SET_CONFIO_ll is called.
+
   !! Provisoire
   PUBLIC IONEWFLU,UPCASE,INITIO_ll,OPEN_ll,CLOSE_ll,FLUSH_ll,GLOBAL,SPECIFIC
+  PUBLIC SET_CONFIO_ll,GCONFIO
   !JUANZ
   PUBLIC  io_file,io_rank
   !JUANZ
@@ -111,9 +114,46 @@ CONTAINS
 
   END FUNCTION UPCASE
 
+  SUBROUTINE SET_CONFIO_ll(OIOCDF4, OFORCELFIOUT, OFORCELFIREAD)
+    USE MODD_IO_ll, ONLY : LIOCDF4, LLFIOUT, LLFIREAD
+    LOGICAL, INTENT(IN)           :: OIOCDF4
+    LOGICAL, INTENT(IN), OPTIONAL :: OFORCELFIOUT, OFORCELFIREAD
 
+    LOGICAL :: GFORCELFIOUT, GFORCELFIREAD
+
+    IF (GCONFIO) THEN
+       PRINT *, 'SET_CONFIO_ll already called (ignoring this call).' 
+    ELSE
+       IF (PRESENT(OFORCELFIOUT)) THEN
+          GFORCELFIOUT = OFORCELFIOUT
+       ELSE
+          GFORCELFIOUT = .FALSE.
+       END IF
+       IF (PRESENT(OFORCELFIREAD)) THEN
+          GFORCELFIREAD = OFORCELFIREAD
+       ELSE
+          GFORCELFIREAD = .FALSE.
+       END IF
+
+#if defined(MNH_IOCDF4)
+       !PRINT *, 'SET_CONFIO_ll : sources compiled WITH IOCDF4 support.'       
+       LIOCDF4  = OIOCDF4
+       LLFIOUT  = (.NOT. OIOCDF4 .OR. GFORCELFIOUT)
+       LLFIREAD = GFORCELFIREAD
+#else
+       !PRINT *, 'SET_CONFIO_ll : sources compiled WITHOUT IOCDF4 support.'       
+       LIOCDF4 = .FALSE.
+       LLFIOUT = .TRUE.
+       LLFIREAD = .TRUE.
+#endif       
+       GCONFIO = .TRUE.
+    END IF
+    
+  END SUBROUTINE SET_CONFIO_ll
+  
   SUBROUTINE INITIO_ll()
     USE  MODE_MNH_WORLD , ONLY :  INIT_NMNH_COMM_WORLD
+    USE MODD_IO_ll
     IMPLICIT NONE
 
     INTEGER :: IERR, IOS
@@ -179,7 +219,10 @@ CONTAINS
        PAD,      &
        KNB_PROCIO,& 
        KMELEV)
-
+#if defined(MNH_IOCDF4)
+  USE MODE_NETCDF
+#endif
+  USE MODD_IO_ll
     INTEGER,         INTENT(OUT)           :: UNIT  !! Different from fortran OPEN
     CHARACTER(len=*),INTENT(IN),  OPTIONAL :: FILE
     CHARACTER(len=*),INTENT(IN),  OPTIONAL :: MODE
@@ -541,10 +584,15 @@ CONTAINS
        ENDIF
        TZFD%COMM = NMNH_COMM_WORLD
        TZFD%PARAM     =>LFIPAR
-       IF (ISP == TZFD%OWNER) THEN 
-          TZFD%FLU = IONEWFLU()
+#if defined(MNH_IOCDF4)
+       IF (ISP == TZFD%OWNER .AND. (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT) &
+            &                                     .OR. (YACTION=='READ'  .AND. LLFIREAD))) THEN
+#else
+       IF (ISP == TZFD%OWNER) THEN
+#endif
+             TZFD%FLU = IONEWFLU()
        ELSE 
-          !! NON I/O processors case
+          !! NON I/O processors OR NetCDF read case 
           IOS = 0
           TZFD%FLU = -1
        END IF
@@ -561,35 +609,72 @@ CONTAINS
              TZFD_IOZ%NB_PROCIO = TZFD%NB_PROCIO
              TZFD_IOZ%FLU       = -1
              TZFD_IOZ%PARAM     =>LFIPAR
+
              IF ( irank_procio .EQ. ISP ) THEN
-                !this proc must write on this file open it ...    
-                TZFD_IOZ%FLU       = IONEWFLU()
-                !! LFI-File case
-                IRESOU = 0
-                GNAMFI8 = .TRUE.
-                GFATER8 = .TRUE.
-                GSTATS8 = .FALSE.
-                IF (PRESENT(KMELEV)) THEN
-                   IMELEV = KMELEV
-                ELSE
-                   IMELEV = 0
-                ENDIF
-                INPRAR = 49
-                !
-                ! JUAN open lfi file temporary modif
-                !
-                INUMBR8 = TZFD_IOZ%FLU
-                CALL LFIOUV(IRESOU,     &
-                     INUMBR8,           &
-                     GNAMFI8,           &
-                     TZFD_IOZ%NAME,     &
-                     "UNKNOWN",         &
-                     GFATER8,           &
-                     GSTATS8,           &
-                     IMELEV,            &
-                     INPRAR,            &
-                     ININAR8)
-                !KNINAR = ININAR8
+#if defined(MNH_IOCDF4)                   
+                IF (LIOCDF4) THEN
+                   IF (YACTION == 'READ' .AND. .NOT. LLFIREAD) THEN
+                      ! Open NetCDF File for reading
+                      TZFD_IOZ%CDF => NEWIOCDF()
+                      IOS = NF_OPEN(TRIM(FILE)//cfile//".nc4", NF_NOWRITE, TZFD_IOZ%CDF%NCID)
+                      IF (IOS /= NF_NOERR) THEN
+                         PRINT *, 'NF_OPEN error : ', NF_STRERROR(IOS)
+                         STOP
+                      ELSE
+                         IOS = 0
+                      END IF
+                      PRINT *, 'NF_OPEN(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4'
+                   END IF
+                   
+                   IF (YACTION == 'WRITE') THEN
+                      ! YACTION == 'WRITE'
+                      ! Create NetCDF File for writing
+                      TZFD_IOZ%CDF => NEWIOCDF()
+                      IOS = NF_CREATE(TRIM(FILE)//cfile//".nc4", &
+                           &IOR(NF_CLOBBER,NF_NETCDF4), TZFD_IOZ%CDF%NCID)
+                      IF (IOS /= NF_NOERR) THEN
+                         PRINT *, 'NF_CREATE error : ', NF_STRERROR(IOS)
+                         STOP
+                      ELSE
+                         IOS = 0
+                      END IF
+                      PRINT *, 'NF_CREATE(IO_ZSPLIT): ',TRIM(FILE)//cfile//'.nc4'
+                   END IF
+                END IF
+#endif
+                IF (.NOT. LIOCDF4 .OR. (YACTION=='WRITE' .AND. LLFIOUT)&
+                     &            .OR. (YACTION=='READ'  .AND. LLFIREAD)) THEN
+                   ! LFI case
+                   ! Open LFI File for reading
+                   !this proc must write on this file open it ...    
+                   TZFD_IOZ%FLU       = IONEWFLU()
+                   !! LFI-File case
+                   IRESOU = 0
+                   GNAMFI8 = .TRUE.
+                   GFATER8 = .TRUE.
+                   GSTATS8 = .FALSE.
+                   IF (PRESENT(KMELEV)) THEN
+                      IMELEV = KMELEV
+                   ELSE
+                      IMELEV = 0
+                   ENDIF
+                   INPRAR = 49
+                   !
+                   ! JUAN open lfi file temporary modif
+                   !
+                   INUMBR8 = TZFD_IOZ%FLU
+                   CALL LFIOUV(IRESOU,     &
+                        INUMBR8,           &
+                        GNAMFI8,           &
+                        TZFD_IOZ%NAME,     &
+                        "UNKNOWN",         &
+                        GFATER8,           &
+                        GSTATS8,           &
+                        IMELEV,            &
+                        INPRAR,            &
+                        ININAR8)
+                   !KNINAR = ININAR8
+                END IF
              ENDIF
           ENDDO
        END IF
@@ -622,7 +707,7 @@ CONTAINS
 !!$    END IF
 
     IOSTAT = IOS
-    UNIT = TZFD%FLU 
+    UNIT = TZFD%FLU
 
   CONTAINS
     FUNCTION SUFFIX(HEXT)
@@ -637,7 +722,10 @@ CONTAINS
   END SUBROUTINE OPEN_ll
 
   SUBROUTINE CLOSE_ll(HFILE,IOSTAT,STATUS)
-
+  USE MODD_IO_ll
+#if defined(MNH_IOCDF4)
+  USE MODE_NETCDF
+#endif
     CHARACTER(LEN=*), INTENT(IN)            :: HFILE
     INTEGER,          INTENT(OUT), OPTIONAL :: IOSTAT
     CHARACTER(LEN=*), INTENT(IN),  OPTIONAL :: STATUS
@@ -698,10 +786,13 @@ CONTAINS
              YFILE_IOZ   = TRIM(TZFD%NAME(1:ilen-4))//yfile//".lfi"
              TZFD_IOZ => GETFD(YFILE_IOZ)
              IF (ISP == TZFD_IOZ%OWNER) THEN
-                INUM8=TZFD_IOZ%FLU
-                CALL LFIFER(IRESP8,INUM8,YSTATU)
-                CALL IOFREEFLU(TZFD_IOZ%FLU)
-                IRESP = IRESP8
+                IF (TZFD_IOZ%FLU > 0) THEN
+                   INUM8=TZFD_IOZ%FLU
+                   CALL LFIFER(IRESP8,INUM8,YSTATU)
+                   CALL IOFREEFLU(TZFD_IOZ%FLU)
+                   IRESP = IRESP8
+                END IF
+                IF (ASSOCIATED(TZFD_IOZ%CDF)) CALL CLEANIOCDF(TZFD_IOZ%CDF)
              END IF
           END DO
        END IF
@@ -730,6 +821,7 @@ CONTAINS
 #if defined(NAGf95)
     USE F90_UNIX
 #endif
+    USE MODD_IO_ll
     CHARACTER(LEN=*), INTENT(IN)            :: HFILE
     INTEGER,          INTENT(OUT), OPTIONAL :: IRESP
 
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
new file mode 100644
index 0000000000000000000000000000000000000000..d76c32cf68ceddb7747b002f6b57a30c120cbf2d
--- /dev/null
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -0,0 +1,1658 @@
+#if defined(MNH_IOCDF4)
+MODULE MODE_NETCDF
+USE MODD_NETCDF
+
+IMPLICIT NONE 
+
+PRIVATE
+
+INTERFACE NCWRIT
+   MODULE PROCEDURE NCWRITX0, NCWRITX1, NCWRITX2, NCWRITX3, &
+        & NCWRITX4, NCWRITX5, NCWRITX6, &
+        & NCWRITN0, NCWRITN1, NCWRITN2, &
+        & NCWRITC0, NCWRITC1
+END INTERFACE NCWRIT
+
+INTERFACE NCREAD
+   MODULE PROCEDURE NCREADX0, NCREADX1, NCREADX2, NCREADX3, &
+        & NCREADX4, NCREADX5, NCREADX6, &
+        & NCREADN0, NCREADN1, NCREADN2, &
+        & NCREADC0
+END INTERFACE NCREAD
+
+INCLUDE 'netcdf.inc'
+
+! Public from netcdf.inc :
+PUBLIC NF_OPEN,NF_CREATE,NF_NOWRITE,NF_CLOBBER,NF_NETCDF4,NF_NOERR,NF_STRERROR
+! Public from this module :
+PUBLIC NEWIOCDF,CLEANIOCDF,NCWRIT,NCREAD
+
+CONTAINS
+
+FUNCTION NEWIOCDF()
+TYPE(IOCDF), POINTER :: NEWIOCDF
+TYPE(IOCDF), POINTER :: TZIOCDF
+INTEGER              :: IRESP
+
+ALLOCATE(TZIOCDF, STAT=IRESP)
+IF (IRESP > 0) THEN 
+  PRINT *, 'NEWIOCDF : memory allocation error...'
+  STOP
+END IF
+
+TZIOCDF%NCID = -1
+NULLIFY(TZIOCDF%DIMX)
+NULLIFY(TZIOCDF%DIMY)
+NULLIFY(TZIOCDF%DIMZ)
+NULLIFY(TZIOCDF%DIMSTR)
+NULLIFY(TZIOCDF%DIMLIST)
+
+NEWIOCDF=>TZIOCDF
+
+END FUNCTION NEWIOCDF
+
+SUBROUTINE CLEANIOCDF(PIOCDF)
+TYPE(IOCDF),  POINTER :: PIOCDF
+
+INTEGER :: IRESP
+
+! Close Netcdf File
+IRESP = NF_CLOSE(PIOCDF%NCID)
+IF (IRESP /= NF_NOERR) THEN
+   PRINT *, 'CLEANIOCDF, NF_CLOSE error : ', NF_STRERROR(IRESP)
+END IF
+
+! Clean DIMLIST and DIMSTR
+CALL CLEANLIST(PIOCDF%DIMLIST)
+CALL CLEANLIST(PIOCDF%DIMSTR)
+! Then free iocdf
+DEALLOCATE(PIOCDF)
+
+PRINT *, 'CLEANIOCDF done.'
+
+CONTAINS
+
+SUBROUTINE CLEANLIST(PLIST)
+TYPE(DIMCDF), POINTER :: PLIST,TZDIMCUR, TZDIMNEXT    
+
+TZDIMCUR  => PLIST
+DO WHILE(ASSOCIATED(TZDIMCUR))
+   TZDIMNEXT => TZDIMCUR%NEXT
+   DEALLOCATE(TZDIMCUR)
+   TZDIMCUR => TZDIMNEXT
+END DO
+
+END SUBROUTINE CLEANLIST
+  
+END SUBROUTINE CLEANIOCDF
+
+SUBROUTINE HANDLE_ERR(status,line,text,kresp)
+INTEGER, INTENT(IN) :: status,line
+CHARACTER(LEN=*), INTENT(IN) :: text
+INTEGER, OPTIONAL, INTENT(OUT) :: kresp
+
+! Don't stop the code when kresp is present
+! and ensure kresp is a negative integer
+IF (status /= NF_NOERR) THEN
+   PRINT *, 'NETCDF ERROR in '//TRIM(text), line, NF_STRERROR(status)
+   IF (PRESENT(kresp)) THEN
+      IF (status < 0) THEN
+         kresp = status
+      ELSE IF (status == 0) THEN
+         kresp = -1
+      ELSE
+         kresp = -status
+      END IF
+   ELSE
+      STOP
+   END IF
+END IF
+END SUBROUTINE HANDLE_ERR
+
+FUNCTION str_replace(hstr, hold, hnew)
+CHARACTER(LEN=*) :: hstr, hold, hnew
+CHARACTER(LEN=LEN_TRIM(hstr)+MAX(0,LEN(hnew)-LEN(hold))) :: str_replace
+
+INTEGER :: pos
+
+pos = INDEX(hstr,hold)
+IF (pos /= 0) THEN
+   str_replace = hstr(1:pos-1)//hnew//hstr(pos+LEN(hold):)
+ELSE 
+   str_replace = hstr 
+END IF
+
+END FUNCTION str_replace
+
+SUBROUTINE WRITATTR(KNCID, KVARID, TPFMH)
+USE MODD_FM, ONLY : FMHEADER
+INTEGER,        INTENT(IN) :: KNCID
+INTEGER,        INTENT(IN) :: KVARID
+TYPE(FMHEADER), INTENT(IN) :: TPFMH
+
+INTEGER :: STATUS
+
+! GRID attribute definition
+STATUS = NF_PUT_ATT_INT(KNCID, KVARID, 'GRID', &
+     &NF_INT, 1, TPFMH%GRID)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITATTR [NF_PUT_ATT_INT]')
+
+! COMMENT attribute definition
+STATUS = NF_PUT_ATT_TEXT(KNCID, KVARID,'COMMENT', &
+     &LEN_TRIM(TPFMH%COMMENT), TPFMH%COMMENT)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'WRITATTR [NF_PUT_ATT_TEXT]')
+
+END SUBROUTINE WRITATTR
+
+FUNCTION GETDIMCDF(PIOCDF, KLEN, HDIMNAME)
+TYPE(IOCDF), POINTER       :: PIOCDF
+INTEGER,     INTENT(IN)    :: KLEN
+CHARACTER(LEN=*), OPTIONAL :: HDIMNAME ! When provided don't search but
+                                       ! simply create with name HDIMNAME
+TYPE(DIMCDF), POINTER   :: GETDIMCDF
+
+TYPE(DIMCDF), POINTER :: TMP
+INTEGER               :: COUNT
+CHARACTER(LEN=7)      :: YSUFFIX
+CHARACTER(LEN=8)      :: YDIMNAME
+INTEGER               :: STATUS
+
+IF (KLEN < 1) THEN
+   PRINT *, 'GETDIMCDF Error, KLEN=', KLEN
+   STOP
+END IF
+
+IF (PRESENT(HDIMNAME)) THEN
+   NULLIFY(TMP)
+   YDIMNAME = TRIM(HDIMNAME)
+ELSE
+   ! Search dimension with KLEN length
+   COUNT = 1
+   TMP  => PIOCDF%DIMLIST
+   DO WHILE(ASSOCIATED(TMP))
+      IF (TMP%LEN == KLEN .AND. TMP%NAME /= 'STRLEN') EXIT
+      TMP=>TMP%NEXT
+      COUNT = COUNT+1
+   END DO
+   WRITE(YSUFFIX,'(i7)') KLEN
+   YDIMNAME = 'D'//ADJUSTL(YSUFFIX)
+END IF
+
+IF (.NOT. ASSOCIATED(TMP)) THEN
+   ! Not found then define new dimension
+   ALLOCATE(TMP)
+   TMP%NAME = YDIMNAME
+   TMP%LEN = KLEN
+   STATUS = NF_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID)
+   IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETDIMCDF[NF_DEF_DIM]')
+   NULLIFY(TMP%NEXT)
+   TMP%NEXT       => PIOCDF%DIMLIST
+   PIOCDF%DIMLIST => TMP
+END IF
+
+GETDIMCDF => TMP
+
+END FUNCTION GETDIMCDF
+
+FUNCTION GETSTRDIMID(PIOCDF, KLEN)
+TYPE(IOCDF), POINTER    :: PIOCDF
+INTEGER,     INTENT(IN) :: KLEN
+INTEGER                 :: GETSTRDIMID
+
+TYPE(DIMCDF), POINTER :: TMP
+CHARACTER(LEN=7)      :: YSUFFIX
+CHARACTER(LEN=8)      :: YDIMNAME
+INTEGER               :: STATUS
+
+IF (KLEN < 1) THEN
+   PRINT *, 'GETSTRDIMID Error, KLEN=', KLEN
+   STOP
+END IF
+
+! Search string dimension with KLEN length
+TMP  => PIOCDF%DIMSTR
+DO WHILE(ASSOCIATED(TMP))
+   IF (TMP%LEN == KLEN) EXIT
+   TMP=>TMP%NEXT
+END DO
+WRITE(YSUFFIX,'(i7)') KLEN
+YDIMNAME = 'S'//ADJUSTL(YSUFFIX)
+
+IF (.NOT. ASSOCIATED(TMP)) THEN
+   ! Not found then define new dimension
+   ALLOCATE(TMP)
+   TMP%NAME = YDIMNAME
+   TMP%LEN = KLEN
+   STATUS = NF_DEF_DIM(PIOCDF%NCID, TMP%NAME, KLEN, TMP%ID)
+   IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'GETSTRDIMID[NF_DEF_DIM]')
+   NULLIFY(TMP%NEXT)
+   TMP%NEXT      => PIOCDF%DIMSTR
+   PIOCDF%DIMSTR => TMP
+END IF
+
+GETSTRDIMID = TMP%ID
+
+END FUNCTION GETSTRDIMID
+
+SUBROUTINE FILLVDIMS(PIOCDF, KSHAPE, HDIR, KVDIMS)
+TYPE(IOCDF),           POINTER        :: PIOCDF 
+INTEGER, DIMENSION(:), INTENT(IN)     :: KSHAPE
+CHARACTER(LEN=*),      INTENT(IN)     :: HDIR
+INTEGER, DIMENSION(:), INTENT(OUT)    :: KVDIMS
+
+INTEGER :: II
+TYPE(DIMCDF), POINTER :: PTDIM
+
+IF (SIZE(KSHAPE) < 1) THEN
+   PRINT *, 'FILLVDIMS Error, KSHAPE empty'
+   STOP
+END IF
+
+DO II=1, SIZE(KSHAPE)
+
+   IF (II == 1) THEN
+      IF (HDIR == 'XX' .OR. HDIR == 'XY') THEN
+         IF (.NOT. ASSOCIATED(PIOCDF%DIMX))  PIOCDF%DIMX => GETDIMCDF(PIOCDF, KSHAPE(II), 'X')
+         IF (KSHAPE(II) == PIOCDF%DIMX%LEN) THEN
+            PTDIM => PIOCDF%DIMX
+         ELSE
+            PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+         END IF
+      ELSE IF (HDIR == 'YY') THEN
+         IF (.NOT. ASSOCIATED(PIOCDF%DIMY))  PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y')
+         IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN
+            PTDIM => PIOCDF%DIMY
+         ELSE
+            PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+         END IF
+      ELSE
+         PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+         KVDIMS(II) = PTDIM%ID
+      END IF
+   ELSE IF (II == 2) THEN
+      IF (HDIR == 'XY') THEN
+         IF (.NOT. ASSOCIATED(PIOCDF%DIMY))  PIOCDF%DIMY => GETDIMCDF(PIOCDF, KSHAPE(II), 'Y')
+         IF (KSHAPE(II) == PIOCDF%DIMY%LEN) THEN
+            PTDIM => PIOCDF%DIMY
+         ELSE
+            PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+         END IF
+      ELSE
+         PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+      END IF
+   ELSE IF (II == 3) THEN
+      IF (HDIR == 'XY') THEN
+         IF (.NOT. ASSOCIATED(PIOCDF%DIMZ))  PIOCDF%DIMZ => GETDIMCDF(PIOCDF, KSHAPE(II), 'Z')
+         IF (KSHAPE(II) == PIOCDF%DIMZ%LEN) THEN
+            PTDIM => PIOCDF%DIMZ
+         ELSE
+            PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+         END IF
+      ELSE
+         PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+      END IF
+   ELSE
+      PTDIM => GETDIMCDF(PIOCDF, KSHAPE(II))
+   END IF
+   
+   KVDIMS(II) = PTDIM%ID
+      
+END DO
+
+END SUBROUTINE FILLVDIMS
+
+
+SUBROUTINE NCWRITX0(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER             :: PZCDF
+CHARACTER(LEN=*),     INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),     INTENT(IN) :: HDIR
+REAL,                 INTENT(IN) :: PFIELD
+TYPE(FMHEADER),       INTENT(IN) :: TPFMH
+INTEGER,              INTENT(OUT):: KRESP
+
+INTEGER           :: STATUS
+INTEGER           :: INCID
+CHARACTER(LEN=30) :: YVARNAME
+INTEGER           :: IVARID
+INTEGER           :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Define the scalar variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, 0, 0, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX0 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX0[NF_PUT_VAR_DOUBLE]',IRESP)
+
+KRESP = IRESP
+END SUBROUTINE NCWRITX0
+
+SUBROUTINE NCWRITX1(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER             :: PZCDF
+CHARACTER(LEN=*),     INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),     INTENT(IN) :: HDIR
+REAL, DIMENSION(:),   INTENT(IN) :: PFIELD
+TYPE(FMHEADER),       INTENT(IN) :: TPFMH
+INTEGER,              INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX1[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX1 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX1[NF_PUT_VAR_DOUBLE]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX1
+
+SUBROUTINE NCWRITX2(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_IO_ll, ONLY : LDEFLATEX2
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER             :: PZCDF
+CHARACTER(LEN=*),     INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),     INTENT(IN) :: HDIR
+REAL, DIMENSION(:,:), INTENT(IN) :: PFIELD
+TYPE(FMHEADER),       INTENT(IN) :: TPFMH
+INTEGER,              INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+   
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_DEF_VAR]')
+   IF (LDEFLATEX2) THEN
+      ! Compress the variable with deflate level 2
+      STATUS = NF_DEF_VAR_DEFLATE(INCID, IVARID, 0, 1, 2)
+      IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_DEF_VAR_DEFLATE]')
+   END IF
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX2 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX2[NF_PUT_VAR_DOUBLE]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX2
+
+SUBROUTINE NCWRITX3(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER              :: PZCDF
+CHARACTER(LEN=*),      INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),      INTENT(IN) :: HDIR
+REAL, DIMENSION(:,:,:),INTENT(IN) :: PFIELD
+TYPE(FMHEADER),        INTENT(IN) :: TPFMH
+INTEGER,               INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX3 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX3[NF_PUT_VAR_DOUBLE] '//TRIM(HVARNAME),IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX3
+
+SUBROUTINE NCWRITX4(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER                 :: PZCDF
+CHARACTER(LEN=*),         INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),         INTENT(IN) :: HDIR
+REAL, DIMENSION(:,:,:,:), INTENT(IN) :: PFIELD
+TYPE(FMHEADER),           INTENT(IN) :: TPFMH
+INTEGER,                  INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX4[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX4 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX4[NF_PUT_VAR_DOUBLE]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX4
+
+SUBROUTINE NCWRITX5(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER                   :: PZCDF
+CHARACTER(LEN=*),           INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),           INTENT(IN) :: HDIR
+REAL, DIMENSION(:,:,:,:,:), INTENT(IN) :: PFIELD
+TYPE(FMHEADER),             INTENT(IN) :: TPFMH
+INTEGER,                    INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX5 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX5[NF_PUT_VAR_DOUBLE]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX5
+
+SUBROUTINE NCWRITX6(PZCDF, HVARNAME, HDIR, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER                     :: PZCDF
+CHARACTER(LEN=*),             INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),             INTENT(IN) :: HDIR
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(IN) :: PFIELD
+TYPE(FMHEADER),               INTENT(IN) :: TPFMH
+INTEGER,                      INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(PFIELD), HDIR, IVDIMS)
+   
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_DOUBLE, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX6[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITX6 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_DOUBLE(INCID, IVARID, PFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITX6[NF_PUT_VAR_DOUBLE]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITX6
+
+SUBROUTINE NCWRITN0(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+USE MODD_PARAMETERS_ll,  ONLY : JPHEXT, JPVEXT
+USE MODD_IO_ll, ONLY : LPACK,L1D,L2D
+TYPE(IOCDF), POINTER             :: PZCDF
+CHARACTER(LEN=*),     INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),     INTENT(IN) :: HDIR
+INTEGER,              INTENT(IN) :: KFIELD
+TYPE(FMHEADER),       INTENT(IN) :: TPFMH
+INTEGER,              INTENT(OUT):: KRESP
+
+INTEGER           :: STATUS
+INTEGER           :: INCID
+CHARACTER(LEN=30) :: YVARNAME
+INTEGER           :: IVARID
+INTEGER           :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Define the scalar variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, 0, 0, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN0[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITN0 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN0[NF_PUT_VAR_INT]',IRESP)
+!
+! Use IMAX, JMAX, KMAX to define DIMX, DIMY, DIMZ
+! /!\ Can only work if IMAX, JMAX or KMAX are written before any array
+!
+#if 0
+IF (YVARNAME == 'IMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMX)) PZCDF%DIMX=>GETDIMCDF(PZCDF,KFIELD+2*JPHEXT,'X')
+IF (YVARNAME == 'JMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMY)) THEN
+   IF (LPACK .AND. L2D) THEN
+      PZCDF%DIMY=>GETDIMCDF(PZCDF, 1,'Y')
+   ELSE
+      PZCDF%DIMY=>GETDIMCDF(PZCDF, KFIELD+2*JPHEXT, 'Y')
+   END IF
+END IF
+#endif
+IF (YVARNAME == 'KMAX' .AND. .NOT. ASSOCIATED(PZCDF%DIMZ)) PZCDF%DIMZ=>GETDIMCDF(PZCDF,KFIELD+2*JPVEXT,'Z')
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITN0
+
+SUBROUTINE NCWRITN1(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER              :: PZCDF
+CHARACTER(LEN=*),      INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),      INTENT(IN) :: HDIR
+INTEGER, DIMENSION(:), INTENT(IN) :: KFIELD
+TYPE(FMHEADER),        INTENT(IN) :: TPFMH
+INTEGER,               INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(KFIELD), HDIR, IVDIMS)
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN1[NF_DEF_VAR] '//TRIM(YVARNAME))
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITN1 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+
+! Write the data
+STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN1[NF_PUT_VAR_INT]',IRESP)
+
+KRESP = IRESP 
+END SUBROUTINE NCWRITN1
+
+SUBROUTINE NCWRITN2(PZCDF, HVARNAME, HDIR, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER               :: PZCDF
+CHARACTER(LEN=*),       INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),       INTENT(IN) :: HDIR
+INTEGER, DIMENSION(:,:),INTENT(IN) :: KFIELD
+TYPE(FMHEADER),         INTENT(IN) :: TPFMH
+INTEGER,                INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER               :: IRESP
+
+IRESP = 0
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions
+   CALL FILLVDIMS(PZCDF, SHAPE(KFIELD), HDIR, IVDIMS)
+
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_INT, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN2[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITN2 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_INT(INCID, IVARID, KFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITN2[NF_PUT_VAR_INT]',IRESP)
+
+KRESP = IRESP
+END SUBROUTINE NCWRITN2
+
+SUBROUTINE NCWRITC0(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF), POINTER              :: PZCDF
+CHARACTER(LEN=*),      INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),      INTENT(IN) :: HDIR
+CHARACTER(LEN=*),      INTENT(IN) :: HFIELD
+TYPE(FMHEADER),        INTENT(IN) :: TPFMH
+INTEGER,               INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(1) :: IVDIMS
+CHARACTER(LEN=32)     :: YSTR
+!CHARACTER(LEN=LEN(HFIELD)) :: YSTR
+INTEGER               :: IRESP
+
+IRESP = 0
+YSTR = HFIELD
+IF (LEN_TRIM(HFIELD) > LEN(YSTR)) THEN
+   PRINT *,'NCWRIT0 : ',TRIM(YVARNAME), ' string variable TRUNCATED.'
+END IF
+
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf string dimensions id 
+   IVDIMS(1) = GETSTRDIMID(PZCDF, LEN(YSTR))
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_CHAR, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC0[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITC0 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VAR_TEXT(INCID, IVARID, YSTR)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC0[NF_PUT_VAR_TEXT]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITC0
+
+SUBROUTINE NCWRITC1(PZCDF, HVARNAME, HDIR, HFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER
+TYPE(IOCDF),        POINTER              :: PZCDF
+CHARACTER(LEN=*),             INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),             INTENT(IN) :: HDIR
+CHARACTER(LEN=*),DIMENSION(:),INTENT(IN) :: HFIELD
+TYPE(FMHEADER),               INTENT(IN) :: TPFMH
+INTEGER,                      INTENT(OUT):: KRESP
+
+INTEGER               :: STATUS
+INTEGER               :: INCID
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER, DIMENSION(2) :: IVDIMS
+INTEGER, DIMENSION(1) :: ITMP
+INTEGER               :: IRESP
+INTEGER               :: ILEN
+INTEGER               :: ISIZE
+
+IRESP = 0
+ILEN  = LEN(HFIELD)
+ISIZE = SIZE(HFIELD)
+
+! Get the Netcdf file ID
+INCID = PZCDF%NCID
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! The variable should not already exist but who knows ?
+STATUS = NF_INQ_VARID(INCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   ! Get the netcdf dimensions ID 
+   IVDIMS(1) = GETSTRDIMID(PZCDF,ILEN)
+   CALL FILLVDIMS(PZCDF, (/ISIZE/), HDIR, ITMP)
+   IVDIMS(2) = ITMP(1)
+   ! Define the variable 
+   STATUS = NF_DEF_VAR(INCID, YVARNAME, NF_CHAR, SIZE(IVDIMS), IVDIMS, IVARID)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC1[NF_DEF_VAR]')
+   CALL WRITATTR(INCID, IVARID, TPFMH)
+ELSE
+   PRINT *,'NCWRITC1 : ', TRIM(YVARNAME), ' already defined !'
+END IF
+
+! Write the data
+STATUS = NF_PUT_VARA_TEXT(INCID, IVARID, (/1,1/),(/ILEN,ISIZE/), HFIELD)
+IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCWRITC1[NF_PUT_VARA_TEXT]',IRESP)
+ 
+KRESP = IRESP
+END SUBROUTINE NCWRITC1
+
+!
+!
+! Here come the NetCDF READ routines
+!
+!
+SUBROUTINE READATTR(KNCID, KVARID, HVAR, TPFMH)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,         INTENT(IN) :: KNCID
+INTEGER,         INTENT(IN) :: KVARID
+CHARACTER(LEN=*),INTENT(IN) :: HVAR
+TYPE(FMHEADER),  INTENT(OUT):: TPFMH
+
+INTEGER :: STATUS
+INTEGER :: ICOMLEN
+      
+! Read variables attributes (GRID and COMMENT)
+STATUS = NF_GET_ATT_INT(KNCID, KVARID, 'GRID', TPFMH%GRID)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'READATTR[NF_GET_ATT_INT] '//TRIM(HVAR))
+STATUS = NF_INQ_ATTLEN(KNCID, KVARID, 'COMMENT', ICOMLEN)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'READATTR[NF_INQ_ATTLEN] '//TRIM(HVAR))
+IF (ICOMLEN <= JPXKRK) THEN
+   TPFMH%COMLEN = ICOMLEN
+   STATUS = NF_GET_ATT_TEXT(KNCID, KVARID, 'COMMENT', TPFMH%COMMENT)
+   IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'READATTR[NF_GET_ATT_TEXT] '//TRIM(HVAR))
+ELSE
+   PRINT *, 'READATTR : '//TRIM(HVAR)//' COMMENT attribute ignored because too long.'
+   TPFMH%COMLEN = 0
+END IF
+END SUBROUTINE READATTR
+
+SUBROUTINE NCREADX0(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,          INTENT(IN) :: KNCID
+CHARACTER(LEN=*), INTENT(IN) :: HVARNAME
+REAL,             INTENT(OUT):: PFIELD
+TYPE(FMHEADER),   INTENT(OUT):: TPFMH
+INTEGER,          INTENT(OUT):: KRESP  ! return-code
+
+INTEGER           :: STATUS
+CHARACTER(LEN=30) :: YVARNAME
+INTEGER           :: IVARID
+INTEGER           :: ITYPE   ! variable type
+INTEGER           :: IDIMS   ! number of dimensions
+INTEGER           :: ICOMLEN ! comment length
+INTEGER           :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX0[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 0 .AND. ITYPE == NF_DOUBLE) THEN
+   ! Read variable
+   STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+   IF (STATUS /= NF_NOERR) THEN
+      CALL HANDLE_ERR(status,__LINE__,'NCREADX0[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+      GOTO 1000
+   END IF
+   ! Read variables attributes (GRID and COMMENT)
+   CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+ELSE
+   PRINT *, 'NCREADNCREADX0 : '//TRIM(YVARNAME)//' not READ (wrong size or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX0
+
+SUBROUTINE NCREADX1(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,            INTENT(IN) :: KNCID
+CHARACTER(LEN=*),   INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),     INTENT(OUT):: TPFMH
+INTEGER,            INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX1[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX1[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX1[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX1 : '//TRIM(YVARNAME)//' not READ wrong size (file, mem) : ', IVARSIZE, SIZE(PFIELD)
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX1 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX1
+
+SUBROUTINE NCREADX2(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,              INTENT(IN) :: KNCID
+CHARACTER(LEN=*),     INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:,:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),       INTENT(OUT):: TPFMH
+INTEGER,              INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX2[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX2[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX2[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX2 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX2 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX2
+
+SUBROUTINE NCREADX3(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,                INTENT(IN) :: KNCID
+CHARACTER(LEN=*),       INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:,:,:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),         INTENT(OUT):: TPFMH
+INTEGER,                INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX3[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX3[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX3[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX3 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX3 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX3
+
+SUBROUTINE NCREADX4(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,                  INTENT(IN) :: KNCID
+CHARACTER(LEN=*),         INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:,:,:,:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),           INTENT(OUT):: TPFMH
+INTEGER,                  INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX4[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX4[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX4[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX4 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX4 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX4
+
+SUBROUTINE NCREADX5(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,                    INTENT(IN) :: KNCID
+CHARACTER(LEN=*),           INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:,:,:,:,:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),             INTENT(OUT):: TPFMH
+INTEGER,                    INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX5[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX5[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX5[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX5 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX5 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX5
+
+SUBROUTINE NCREADX6(KNCID, HVARNAME, PFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,                      INTENT(IN) :: KNCID
+CHARACTER(LEN=*),             INTENT(IN) :: HVARNAME
+REAL, DIMENSION(:,:,:,:,:,:), INTENT(OUT):: PFIELD
+TYPE(FMHEADER),               INTENT(OUT):: TPFMH
+INTEGER,                      INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(PFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX6[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADX6[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(PFIELD)) .AND. ITYPE == NF_DOUBLE) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(PFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_DOUBLE(KNCID, IVARID, PFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADX6[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADX6 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADX6 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADX6
+
+SUBROUTINE NCREADN0(KNCID, HVARNAME, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,          INTENT(IN) :: KNCID
+CHARACTER(LEN=*), INTENT(IN) :: HVARNAME
+INTEGER,          INTENT(OUT):: KFIELD
+TYPE(FMHEADER),   INTENT(OUT):: TPFMH
+INTEGER,          INTENT(OUT):: KRESP  ! return-code
+
+INTEGER           :: STATUS
+CHARACTER(LEN=30) :: YVARNAME
+INTEGER           :: IVARID
+INTEGER           :: ITYPE   ! variable type
+INTEGER           :: IDIMS   ! number of dimensions
+INTEGER           :: ICOMLEN ! comment length
+INTEGER           :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADN0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN0[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 0 .AND. ITYPE == NF_INT) THEN
+   ! Read variable
+   STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD)
+   IF (STATUS /= NF_NOERR) THEN
+      CALL HANDLE_ERR(status,__LINE__,'NCREADN0[NF_GET_VAR_DOUBLE] '//TRIM(YVARNAME),IRESP)
+      GOTO 1000
+   END IF
+   ! Read variables attributes (GRID and COMMENT)
+   CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+ELSE
+   PRINT *, 'NCREADN0 : '//TRIM(YVARNAME)//' not READ (wrong size or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADN0
+
+SUBROUTINE NCREADN1(KNCID, HVARNAME, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,               INTENT(IN) :: KNCID
+CHARACTER(LEN=*),      INTENT(IN) :: HVARNAME
+INTEGER, DIMENSION(:), INTENT(OUT):: KFIELD
+TYPE(FMHEADER),        INTENT(OUT):: TPFMH
+INTEGER,               INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN1[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN1[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF_INT) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(KFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADN1[NF_GET_VAR_INT] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADN1 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADN1 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADN1
+
+SUBROUTINE NCREADN2(KNCID, HVARNAME, KFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,                 INTENT(IN) :: KNCID
+CHARACTER(LEN=*),        INTENT(IN) :: HVARNAME
+INTEGER, DIMENSION(:,:), INTENT(OUT):: KFIELD
+TYPE(FMHEADER),          INTENT(OUT):: TPFMH
+INTEGER,                 INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(SIZE(SHAPE(KFIELD))) :: IVDIMS
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IVARSIZE, IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN2[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADN2[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == SIZE(SHAPE(KFIELD)) .AND. ITYPE == NF_INT) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   IVARSIZE = 1
+   DO II=1,IDIMS
+      STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(II),IDIMLEN)
+      IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+      IVARSIZE = IVARSIZE*IDIMLEN
+   END DO
+   
+   IF (IVARSIZE == SIZE(KFIELD)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_INT(KNCID, IVARID, KFIELD)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADN2[NF_GET_VAR_INT] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADN2 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADN2 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADN2
+
+SUBROUTINE NCREADC0(KNCID, HVARNAME, HFIELD, TPFMH, KRESP)
+USE MODD_FM, ONLY : FMHEADER, JPXKRK
+INTEGER,               INTENT(IN) :: KNCID
+CHARACTER(LEN=*),      INTENT(IN) :: HVARNAME
+CHARACTER(LEN=*),      INTENT(OUT):: HFIELD
+TYPE(FMHEADER),        INTENT(OUT):: TPFMH
+INTEGER,               INTENT(OUT):: KRESP  ! return-code
+
+INTEGER               :: STATUS
+CHARACTER(LEN=30)     :: YVARNAME
+INTEGER               :: IVARID
+INTEGER               :: ITYPE   ! variable type
+INTEGER               :: IDIMS   ! number of dimensions
+INTEGER, DIMENSION(1) :: IVDIMS
+CHARACTER(LEN=32)     :: YSTR
+!CHARACTER(LEN=LEN(HFIELD))     :: YSTR
+INTEGER               :: ICOMLEN ! comment length
+INTEGER               :: IDIMLEN
+INTEGER               :: II
+INTEGER               :: IRESP
+
+IRESP = 0
+
+! NetCDF var names can't contain '%' nor '.' 
+YVARNAME = str_replace(HVARNAME, '%', '__')
+YVARNAME = str_replace(YVARNAME, '.', '--')
+
+! Get variable ID, NDIMS and TYPE
+STATUS = NF_INQ_VARID(KNCID, YVARNAME, IVARID)
+IF (STATUS /= NF_NOERR) THEN
+   CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_VARID] '//TRIM(YVARNAME),IRESP)
+   GOTO 1000
+END IF
+STATUS = NF_INQ_VARNDIMS(KNCID, IVARID, IDIMS)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADC0[NF_INQ_VARNDIMS] '//TRIM(YVARNAME))
+STATUS = NF_INQ_VARTYPE(KNCID, IVARID, ITYPE)
+IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(STATUS,__LINE__,'NCREADC0[NF_INQ_VARTYPE] '//TRIM(YVARNAME))
+
+IF (IDIMS == 1 .AND. ITYPE == NF_CHAR) THEN
+   ! Check size of variable before reading
+   STATUS = NF_INQ_VARDIMID(KNCID, IVARID, IVDIMS)
+   IF (status /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_VARDIMID] '//TRIM(YVARNAME))
+   STATUS = NF_INQ_DIMLEN(KNCID,IVDIMS(1),IDIMLEN)
+   IF (STATUS /= NF_NOERR) CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_INQ_DIMLEN] '//TRIM(YVARNAME))
+   
+   IF (IDIMLEN <= LEN(YSTR)) THEN
+      ! Read variable
+      STATUS = NF_GET_VAR_TEXT(KNCID, IVARID, YSTR)
+      IF (STATUS /= NF_NOERR) THEN
+         CALL HANDLE_ERR(status,__LINE__,'NCREADC0[NF_GET_VAR_TEXT] '//TRIM(YVARNAME),IRESP)
+         GOTO 1000
+      END IF
+      IF (LEN_TRIM(YSTR) > LEN(HFIELD)) PRINT *, 'NCDREADC0 : '//TRIM(YVARNAME)//' truncated !!'
+      HFIELD = TRIM(YSTR)
+      ! Read variables attributes (GRID and COMMENT)
+      CALL READATTR(KNCID, IVARID, YVARNAME, TPFMH)
+   ELSE
+      PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong size).'
+      IRESP = -3
+   END IF
+ELSE
+   PRINT *, 'NCREADC0 : '//TRIM(YVARNAME)//' not READ (wrong shape or type).'
+   IRESP = -3
+END IF
+
+1000 CONTINUE
+KRESP = IRESP
+
+END SUBROUTINE NCREADC0
+
+END MODULE MODE_NETCDF
+
+#else
+!
+! External dummy subroutines
+!
+SUBROUTINE NCWRIT(A,B,C,D,E,F)
+INTEGER :: A,B,C,D,E,F
+PRINT *, 'NCWRIT empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.'
+END SUBROUTINE NCWRIT
+
+SUBROUTINE NCREAD(A,B,C,D,E)
+INTEGER :: A,B,C,D,E
+PRINT *, 'NCREAD empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.'
+END SUBROUTINE NCREAD
+
+SUBROUTINE CLEANIOCDF(A)
+INTEGER :: A
+PRINT *, 'CLEANIOCDF empty call. Compile with -DMNH_IOCDF4 flag to enable NetCDF4 I/Os.'
+END SUBROUTINE CLEANIOCDF
+
+#endif
diff --git a/src/LIB/SURCOUCHE/src/modn_confio.f90 b/src/LIB/SURCOUCHE/src/modn_confio.f90
new file mode 100644
index 0000000000000000000000000000000000000000..b0ae8246075ae540b5cb96d170cef7f45ffde12c
--- /dev/null
+++ b/src/LIB/SURCOUCHE/src/modn_confio.f90
@@ -0,0 +1,42 @@
+!     ##################
+      MODULE MODN_CONFIO
+!     ##################
+!
+!!****  *MODN_CONFIO* - declaration of namelist NAM_CONFIO
+!!
+!!    PURPOSE
+!!    -------
+!     Define I/O configuration variables that can be set with the NAM_CONFIO namelist
+!!    /!\ These variables must be transmitted to the SURCOUCHE library via the
+!!    SET_CONFIO_ll subroutine before the FIRST call to FMOPEN_ll.
+!
+!!
+!!**  IMPLICIT ARGUMENTS
+!!    ------------------
+!!
+!!    REFERENCE
+!!    ---------
+!!
+!!    AUTHOR
+!!    ------
+!!      D.Gazen L.A.
+!!
+!!    MODIFICATIONS
+!!    -------------
+!!      Original    31/03/2014    
+!-------------------------------------------------------------------------------
+!
+!*       0.   DECLARATIONS
+!             ------------
+!
+IMPLICIT NONE
+!
+LOGICAL,SAVE :: LCDF4    = .FALSE. ! TRUE : enable NetCDF4 Input/Output
+LOGICAL,SAVE :: LLFIOUT  = .FALSE. ! TRUE : add LFI output when NetCDF4 I/O is enabled (debug)
+LOGICAL,SAVE :: LLFIREAD = .FALSE. ! TRUE : enable LFI reading (disable NetCDF4 reading)
+                                   !        when NetCDF4 I/O is enabled (debug)
+!
+NAMELIST/NAM_CONFIO/ LCDF4, LLFIOUT, LLFIREAD
+!
+END MODULE MODN_CONFIO
+
diff --git a/src/MNH/diag.f90 b/src/MNH/diag.f90
index 2ff03b82fce52890a68ffa8ba6cee0f14c1ebf78..01b8ad3b08d16de5328da5c3af533b5d6c483817 100644
--- a/src/MNH/diag.f90
+++ b/src/MNH/diag.f90
@@ -134,6 +134,7 @@ USE MODD_STATION_n
 USE MODE_MNH_TIMING
 USE MODE_FMREAD
 USE MODN_CONFZ
+USE MODN_CONFIO
 !
 USE MODI_MNHGET_SURF_PARAM_n
 !
@@ -396,6 +397,12 @@ IF (GFOUND) THEN
   PRINT*, '  namelist NAM_NCOUT read'
 END IF
 #endif
+CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND)
+IF (GFOUND) THEN
+  READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+  PRINT*, '  namelist NAM_CONFIO read'
+END IF
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 !
 CALL CLOSE_ll(YNAM)
 !
diff --git a/src/MNH/ini_segn.f90 b/src/MNH/ini_segn.f90
index 40eb6bac3e5a04f67dca3496e091fac68b5483a2..dc4140b6c161b6f11b4a52f48a109a8bdff3c95e 100644
--- a/src/MNH/ini_segn.f90
+++ b/src/MNH/ini_segn.f90
@@ -168,6 +168,7 @@ END MODULE MODI_INI_SEG_n
 USE MODD_LUNIT
 USE MODD_CONF
 USE MODN_CONFZ
+USE MODN_CONFIO
 USE MODD_CONF_n, ONLY : CSTORAGE_TYPE
 USE MODD_LUNIT_n, ONLY : CINIFILE_n=> CINIFILE,CINIFILEPGD_n=> CINIFILEPGD
 USE MODN_LUNIT_n
@@ -337,6 +338,9 @@ IF (CPROGRAM=='MESONH') THEN
    IF (KMI.EQ.1) THEN
       CALL POSNAM(ILUSEG,'NAM_CONFZ',GFOUND,ILUOUT)
       IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFZ)
+      CALL POSNAM(ILUSEG,'NAM_CONFIO',GFOUND,ILUOUT)
+      IF (GFOUND) READ(UNIT=ILUSEG,NML=NAM_CONFIO)
+      CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
    END IF
   HINIFILEPGD=CINIFILEPGD_n
   HINIFILE=CINIFILE_n
diff --git a/src/MNH/latlon_to_xy.f90 b/src/MNH/latlon_to_xy.f90
index 6142bf357c910fdb4a437a753afa6277687c1e63..5158ae4a66d37a33fd5e9cdd3f52eb04f88f40ec 100644
--- a/src/MNH/latlon_to_xy.f90
+++ b/src/MNH/latlon_to_xy.f90
@@ -81,6 +81,8 @@ USE MODE_GRIDPROJ
 USE MODI_INI_CST
 USE MODI_READ_HGRID
 !
+USE MODN_CONFIO
+!
 IMPLICIT NONE
 !
 !*    0.2    Declaration of variables
@@ -126,6 +128,9 @@ CALL INITIO_ll()
 CALL OPEN_ll(UNIT=INAM,FILE='LATLON2XY1.nam',IOSTAT=IRESP,ACTION='READ', &
      DELIM='QUOTE',MODE=GLOBAL)
 READ(INAM,NAM_INIFILE)
+!
+READ(INAM,NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 CALL CLOSE_ll('LATLON2XY1.nam',IOSTAT=IRESP)
 !
 !*    1.     Opening of MESONH file
diff --git a/src/MNH/open_nestpgd_files.f90 b/src/MNH/open_nestpgd_files.f90
index e574a409d1ad70a84069e193f6deb86645f6a2fd..d0d575bbf19ed6be8e5a8496c1b44ed97fe225ce 100644
--- a/src/MNH/open_nestpgd_files.f90
+++ b/src/MNH/open_nestpgd_files.f90
@@ -85,6 +85,7 @@ USE MODE_MODELN_HANDLER
 #ifdef MNH_NCWRIT
 USE MODN_NCOUT
 #endif
+USE MODN_CONFIO
 !
 IMPLICIT NONE
 !
@@ -275,6 +276,10 @@ CALL POSNAM(IPRE_NEST_PGD,'NAM_NCOUT',GFOUND,ILUOUT0)
 IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_NCOUT)
 #endif
 !
+CALL POSNAM(IPRE_NEST_PGD,'NAM_CONFIO',GFOUND,ILUOUT0)
+IF (GFOUND) READ(UNIT=IPRE_NEST_PGD,NML=NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
+!
 !-------------------------------------------------------------------------------
 CALL CLOSE_ll(HPRE_NEST_PGD)
 !-------------------------------------------------------------------------------
diff --git a/src/MNH/open_prc_files.f90 b/src/MNH/open_prc_files.f90
index a00ba58265e1cdc4cebd59145d7c887bdc1c3dd6..587f257b1cb6dd76fa5343cc62ad6931434d6a5d 100644
--- a/src/MNH/open_prc_files.f90
+++ b/src/MNH/open_prc_files.f90
@@ -104,6 +104,7 @@ USE MODD_LUNIT_n, CINIFILE_n=>CINIFILE , CINIFILEPGD_n=>CINIFILEPGD
 !JUAN Z_SPLITTING
 USE MODN_CONFZ
 !JUAN Z_SPLITTING
+USE MODN_CONFIO
 !
 USE MODE_POS
 USE MODE_FM
@@ -189,7 +190,10 @@ ENDIF
 CALL POSNAM(IPRE_REAL1,'NAM_CONFZ',GFOUND,ILUOUT0)
 IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFZ)
 !JUANZ
-
+CALL POSNAM(IPRE_REAL1,'NAM_CONFIO',GFOUND,ILUOUT0)
+IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
+!
 CINIFILE = CINIFILE_n
 CALL POSNAM(IPRE_REAL1,'NAM_FILE_NAMES',GFOUND,ILUOUT0)
 IF (GFOUND) READ(UNIT=IPRE_REAL1,NML=NAM_FILE_NAMES)
diff --git a/src/MNH/prep_ideal_case.f90 b/src/MNH/prep_ideal_case.f90
index d6de2c319841f6407cd1ac0bf97b3f6bde231b2e..f85aa3cf4d37439e5a0697fb54aa3180761025cb 100644
--- a/src/MNH/prep_ideal_case.f90
+++ b/src/MNH/prep_ideal_case.f90
@@ -405,6 +405,7 @@ USE MODN_CONFZ
 USE MODN_NCOUT
 USE MODE_UTIL
 #endif
+USE MODN_CONFIO
 USE MODI_TH_R_FROM_THL_RT_3D
 !
 USE MODI_VERSION
@@ -676,6 +677,9 @@ IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFZ)
 CALL POSNAM(NLUPRE,'NAM_NCOUT',GFOUND,NLUOUT)
 IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_NCOUT)
 #endif
+CALL POSNAM(NLUPRE,'NAM_CONFIO',GFOUND,NLUOUT)
+IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 CALL POSNAM(NLUPRE,'NAM_GRID_PRE',GFOUND,NLUOUT)
 IF (GFOUND) READ(UNIT=NLUPRE,NML=NAM_GRID_PRE)
 CALL POSNAM(NLUPRE,'NAM_GRIDH_PRE',GFOUND,NLUOUT)
diff --git a/src/MNH/prep_pgd.f90 b/src/MNH/prep_pgd.f90
index 0ce96abcd10a92c8beb906306fea03dceb618b85..13f529569b6add68f1efd2f6933abbcb4a5f1d25 100644
--- a/src/MNH/prep_pgd.f90
+++ b/src/MNH/prep_pgd.f90
@@ -83,6 +83,7 @@ USE MODI_ZSMT_PGD
 !JUAN
 USE MODN_CONFZ
 !JUAN
+USE MODN_CONFIO
 !
 USE MODI_ALLOC_SURFEX
 USE MODI_READ_ALL_NAMELISTS
@@ -94,8 +95,8 @@ USE MODI_PGD_SURF_ATM
 USE MODI_WRITE_PGD_SURF_ATM_N
 USE MODI_DEALLOC_SURFEX
 !
-#ifdef MNH_NCWRIT
 USE MODD_SURF_ATM_GRID_n,     ONLY : XLON, XLAT
+#ifdef MNH_NCWRIT
 USE MODN_NCOUT
 USE MODE_UTIL
 USE MODE_FMREAD
@@ -118,7 +119,7 @@ CHARACTER(LEN=28) :: CPGDFILE ='PGDFILE'  ! name of the output file
 INTEGER           :: NZSFILTER=1          ! number of iteration for filter for fine   orography
 INTEGER           :: NSLEVE   =12         ! number of iteration for filter for smooth orography
 REAL              :: XSMOOTH_ZS = XUNDEF  ! optional uniform smooth orography for SLEVE coordinate
-#ifdef MNH_NCWRIT
+!#ifdef MNH_NCWRIT
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK ! work array for lat and lon reshape
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LAT ! work array for lat and lon reshape
 REAL, DIMENSION(:,:),ALLOCATABLE   :: ZWORK_LON ! work array for lat and lon reshape
@@ -127,7 +128,8 @@ CHARACTER(LEN=16) :: YRECFM   ! name of record
 INTEGER           :: IGRID    ! grid location
 INTEGER           :: ILENCH   ! length of comment string
 CHARACTER(LEN=100):: YCOMMENT ! comment string
-#endif
+INTEGER           :: IIMAX, IJMAX
+!#endif
 !
 NAMELIST/NAM_PGDFILE/CPGDFILE, NHALO
 NAMELIST/NAM_ZSFILTER/NZSFILTER
@@ -172,6 +174,9 @@ IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_SLEVE)
 CALL POSNAM(ILUNAM,'NAM_CONFZ',GFOUND)
 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFZ)
 !JUANZ
+CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND)
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 !SB
 #ifdef MNH_NCWRIT
 CALL POSNAM(ILUNAM,'NAM_NCOUT',GFOUND)
@@ -234,16 +239,16 @@ CALL WRITE_PGD_SURF_ATM_n('MESONH')
 IF (LNETCDF.AND..NOT.LCARTESIAN) THEN
   LLFIFM = .FALSE.
 !!!! WRITE LAT and LON
-  CALL GET_DIM_PHYS_ll('B',NIMAX,NJMAX)
-  ALLOCATE(ZWORK(NIMAX+NHALO*2,NJMAX+NHALO*2))
-  ALLOCATE(ZWORK_LAT(NIMAX+2,NJMAX+2))
-  ALLOCATE(ZWORK_LON(NIMAX+2,NJMAX+2))
-  ZWORK=RESHAPE(XLAT, (/ (NIMAX+NHALO*2),(NJMAX+NHALO*2) /) )
-  ZWORK_LAT=ZWORK(NHALO:(NIMAX+NHALO+1),NHALO:(NJMAX+NHALO+1))
+  CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX)
+  ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2))
+  ALLOCATE(ZWORK_LAT(IIMAX+2,IJMAX+2))
+  ALLOCATE(ZWORK_LON(IIMAX+2,IJMAX+2))
+  ZWORK=RESHAPE(XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) )
+  ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
 !!
 CALL FMWRIT(COUTFMFILE,'LAT',CLUOUT0,'XY',ZWORK_LAT,1,21,'X_Y_latitude (degree)',IRESP)
-  ZWORK=RESHAPE(XLON, (/ NIMAX+NHALO*2,NJMAX+NHALO*2 /) )
-  ZWORK_LON=ZWORK(NHALO:(NIMAX+NHALO+1),NHALO:(NJMAX+NHALO+1))
+  ZWORK=RESHAPE(XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) )
+  ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
 CALL FMWRIT(COUTFMFILE,'LON',CLUOUT0,'XY',ZWORK_LON,1,22,'X_Y_longitude (degree)',IRESP)
   DEALLOCATE(ZWORK)
   LLFIFM = .TRUE.
@@ -261,7 +266,7 @@ IF ( LNETCDF ) THEN
     CALL FMWRIT(COUTFMFILE,'LAT',CLUOUT0,'XY',ZWORK_LAT,1,21,'X_Y_latitude (degree)',IRESP)
     CALL FMWRIT(COUTFMFILE,'LON',CLUOUT0,'XY',ZWORK_LON,1,22,'X_Y_longitude (degree)',IRESP)
   END IF
-  ALLOCATE(ZZS(NIMAX+2,NJMAX+2))
+  ALLOCATE(ZZS(IIMAX+2,IJMAX+2))
 !!!!  writes smooth orography for SLEVE coordinate in netcdf
   YRECFM = 'ZS              '
   CALL FMREAD(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZZS,IGRID,ILENCH,YCOMMENT,IRESP)
@@ -277,6 +282,28 @@ CALL WRITE_PGD_SURF_ATM_n('MESONH')
 !*    4.      Computes and writes smooth orography for SLEVE coordinate
 !             ---------------------------------------------------------
 CALL ZSMT_PGD(COUTFMFILE,NZSFILTER,NSLEVE,XSMOOTH_ZS)
+IF (.NOT.LCARTESIAN) THEN
+!!!! WRITE LAT and LON
+   CALL GET_DIM_PHYS_ll('B',IIMAX,IJMAX)
+   ALLOCATE(ZWORK(IIMAX+NHALO*2,IJMAX+NHALO*2))
+   ALLOCATE(ZWORK_LAT(IIMAX+2,IJMAX+2))
+   ALLOCATE(ZWORK_LON(IIMAX+2,IJMAX+2))
+   ZWORK=RESHAPE(XLAT, (/ (IIMAX+NHALO*2),(IJMAX+NHALO*2) /) )
+   ZWORK_LAT=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
+   ZWORK=RESHAPE(XLON, (/ IIMAX+NHALO*2,IJMAX+NHALO*2 /) )
+   ZWORK_LON=ZWORK(NHALO:(IIMAX+NHALO+1),NHALO:(IJMAX+NHALO+1))
+   YRECFM='LAT'
+   YCOMMENT='X_Y_latitude (degree)'
+   IGRID=1
+   ILENCH=LEN(YCOMMENT)
+   CALL FMWRIT(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZWORK_LAT,IGRID,ILENCH,YCOMMENT,IRESP)
+   
+   YRECFM='LON'
+   YCOMMENT='X_Y_longitude (degree)'
+   IGRID=1
+   ILENCH=LEN(YCOMMENT)
+   CALL FMWRIT(COUTFMFILE,YRECFM,CLUOUT0,'XY',ZWORK_LON,IGRID,ILENCH,YCOMMENT,IRESP)
+END IF
 #endif
 !
 !
diff --git a/src/MNH/read_exspa.f90 b/src/MNH/read_exspa.f90
index 60ef4d964db1f8a248f7773d862f2f1301f82ee5..ee29d054f2e99e5b2e661992f2dd231c5d7e96a4 100644
--- a/src/MNH/read_exspa.f90
+++ b/src/MNH/read_exspa.f90
@@ -110,6 +110,7 @@ USE MODE_IO_ll
 USE MODE_POS
 USE MODE_MODELN_HANDLER
 !
+USE MODN_CONFIO
 #ifdef MNH_NCWRIT
 USE MODN_NCOUT
 #endif
@@ -222,7 +223,10 @@ CALL POSNAM(ILUSPA,'NAM_LUNIT2_SPA',GFOUND,ILUOUT)
 IF (GFOUND) READ(ILUSPA,NAM_LUNIT2_SPA)
 CINIFILE_n=CINIFILE
 CINIFILEPGD_n=CINIFILEPGD
-!! 
+!!
+CALL POSNAM(ILUSPA,'NAM_CONFIO',GFOUND,ILUOUT)
+IF (GFOUND) READ(ILUSPA,NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 #ifdef MNH_NCWRIT
 CALL POSNAM(ILUSPA,'NAM_NCOUT',GFOUND,ILUOUT)
 IF (GFOUND) READ(ILUSPA,NAM_NCOUT)
diff --git a/src/MNH/spectre.f90 b/src/MNH/spectre.f90
index 7f29c03fb1b9a659ecfb015a0596d8a53bcbdcf1..1e09822c4b77f8c83942e546467d237d90a664e4 100644
--- a/src/MNH/spectre.f90
+++ b/src/MNH/spectre.f90
@@ -39,6 +39,8 @@ USE MODE_FM
 USE MODI_VERSION
 !
 USE MODN_CONFZ
+!
+USE MODN_CONFIO
 !     
 IMPLICIT NONE
 !
@@ -154,6 +156,13 @@ IF (GFOUND) THEN
   PRINT*, '  namelist NAM_CONFZ read'
 END IF
 !
+CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND)
+IF (GFOUND) THEN
+  READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+  PRINT*, '  namelist NAM_CONFIO read'
+END IF
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
+!
 CALL CLOSE_ll(YNAM)
 !
 CINIFILE = YINIFILE(1)
diff --git a/src/MNH/write_diachro.f90 b/src/MNH/write_diachro.f90
index 73f29a0a8b5bfc67988243fe5e981f1e1641ad3f..a301f3bfdd5b53954628766f3f5c6b248cb0a969 100644
--- a/src/MNH/write_diachro.f90
+++ b/src/MNH/write_diachro.f90
@@ -237,6 +237,14 @@ ENDIF
 ! 1er enregistrement TYPE
 !
 YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.TYPE')
+
+#if defined(MNH_IOCDF4)
+
+CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
+            HTYPE,KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
+
+#else
+
 ILENG = LEN(HTYPE)
 ALLOCATE(ITABCHAR(ILENG))
 DO J = 1,ILENG
@@ -246,6 +254,9 @@ ENDDO
 CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
             ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
 DEALLOCATE(ITABCHAR)
+
+#endif
+
 IF (NVERB>=5) THEN
   WRITE(ILUOUTDIA,*)'  1st ENREGISTREMENT(',TRIM(YRECFM),'): OK'
 ENDIF
@@ -314,6 +325,13 @@ ENDIF
 ! 3eme enregistrement TITRE
 !
 YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.TITRE')
+#if defined(MNH_IOCDF4)
+
+CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
+            HTITRE(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
+
+#else
+
 ILE = LEN(HTITRE)
 ILENG = ILE*IP
 ALLOCATE(ITABCHAR(ILENG))
@@ -328,6 +346,9 @@ ENDDO
 CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
             ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
 DEALLOCATE(ITABCHAR)
+
+#endif
+
 IF (NVERB>=5) THEN
   WRITE(ILUOUTDIA,*)'  3rd ENREGISTREMENT(',TRIM(YRECFM),'): OK'
 ENDIF
@@ -335,6 +356,13 @@ ENDIF
 ! 4eme enregistrement UNITE
 !
 YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.UNITE')
+#if defined(MNH_IOCDF4)
+
+CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
+            HUNITE(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
+
+#else
+
 ILE = LEN(HUNITE)
 ILENG = ILE*IP
 ALLOCATE(ITABCHAR(ILENG))
@@ -349,6 +377,9 @@ ENDDO
 CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
             ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
 DEALLOCATE(ITABCHAR)
+
+#endif
+
 IF (NVERB>=5) THEN
   WRITE(ILUOUTDIA,*)'  4th ENREGISTREMENT(',TRIM(YRECFM),'): OK'
 ENDIF
@@ -356,6 +387,14 @@ ENDIF
 ! 5eme enregistrement COMMENT
 !
 YRECFM = ADJUSTL(ADJUSTR(HGROUP)//'.COMMENT')
+
+#if defined(MNH_IOCDF4)
+
+CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
+            HCOMMENT(1:IP),KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
+
+#else
+
 ILE = LEN(HCOMMENT)
 ILENG = ILE*IP
 ALLOCATE(ITABCHAR(ILENG))
@@ -370,6 +409,9 @@ ENDDO
 CALL FMWRIT(HFILEDIA,YRECFM,HLUOUTDIA,'--',  &
             ITABCHAR,KGRID(1),ILENCH,YCOMMENT,IRESPDIA)
 DEALLOCATE(ITABCHAR)
+
+#endif
+
 IF (NVERB>=5) THEN
   WRITE(ILUOUTDIA,*)'  5th ENREGISTREMENT(',TRIM(YRECFM),'): OK'
 ENDIF
diff --git a/src/MNH/write_lfin.f90 b/src/MNH/write_lfin.f90
index 4789204774671eb597db5980d6b8b4b00ae46a3a..bfbb6939736bdcb17b7e4bdcf888d0c9a9a214a6 100644
--- a/src/MNH/write_lfin.f90
+++ b/src/MNH/write_lfin.f90
@@ -507,6 +507,19 @@ IF (LNETCDF) THEN
  CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XZZ,IGRID,ILENCH,YCOMMENT,IRESP)
 END IF
 #endif 
+IF (.NOT.LCARTESIAN) THEN
+ YRECFM='LAT'
+ YCOMMENT='X_Y_latitude (degree)'
+ IGRID=1
+ ILENCH=LEN(YCOMMENT)
+ CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLAT,IGRID,ILENCH,YCOMMENT,IRESP)
+
+ YRECFM='LON'
+ YCOMMENT='X_Y_longitude (degree)'
+ IGRID=1
+ ILENCH=LEN(YCOMMENT)
+ CALL FMWRIT(HFMFILE,YRECFM,CLUOUT,'XY',XLON,IGRID,ILENCH,YCOMMENT,IRESP)
+END IF
 !
 YRECFM='ZS'
 YDIR='XY'
diff --git a/src/MNH/xy_to_latlon.f90 b/src/MNH/xy_to_latlon.f90
index 6aa0af691ffd68072a5418febc4629216a9639e9..64fe4a02021353d8aab711a08ae2976c3edcd645 100644
--- a/src/MNH/xy_to_latlon.f90
+++ b/src/MNH/xy_to_latlon.f90
@@ -80,6 +80,8 @@ USE MODE_GRIDPROJ
 USE MODI_INI_CST
 USE MODI_READ_HGRID
 !
+USE MODN_CONFIO
+!
 IMPLICIT NONE
 !
 !*    0.2    Declaration of variables
@@ -124,6 +126,8 @@ CALL INITIO_ll()
 CALL OPEN_ll(UNIT=INAM,FILE='XY2LATLON1.nam',IOSTAT=IRESP,ACTION='READ', &
      DELIM='QUOTE',MODE=GLOBAL)
 READ(INAM,NAM_INIFILE)
+READ(INAM,NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 CALL CLOSE_ll('XY2LATLON1.nam',IOSTAT=IRESP)
 !
 !*    1.     Opening of MESONH file
diff --git a/src/MNH/zoom_pgd.f90 b/src/MNH/zoom_pgd.f90
index 3a012db94c8c286feb2d9f8ced41fd7953a7366e..a3898c39d13c106c0a318ffc084b1a6cc53c10bb 100644
--- a/src/MNH/zoom_pgd.f90
+++ b/src/MNH/zoom_pgd.f90
@@ -81,6 +81,7 @@ USE MODI_DEALLOC_SURFEX
 #ifdef MNH_NCWRIT
 USE MODN_NCOUT
 #endif
+USE MODN_CONFIO
 !
 IMPLICIT NONE
 !
@@ -145,6 +146,9 @@ IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_PGDFILE)
 CALL POSNAM(ILUNAM,'NAM_NCOUT',GFOUND,ILUOUT0)
 IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_NCOUT)
 #endif
+CALL POSNAM(ILUNAM,'NAM_CONFIO',GFOUND,ILUOUT0)
+IF (GFOUND) READ(UNIT=ILUNAM,NML=NAM_CONFIO)
+CALL SET_CONFIO_ll(LCDF4, LLFIOUT, LLFIREAD)
 !
 CALL CLOSE_ll(YNAMELIST,IOSTAT=IRESP)
 !