diff --git a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90 b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
index cf047fba4d9a0542d1af9c6eb744bde637a1616c..3e0a8b2d75ab14e94b8bb20b0cddcc38ea04fff9 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/lfi2cdf.f90
@@ -134,14 +134,14 @@ program LFI2CDF
      ! Conversion LFI -> NetCDF
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options)
      CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode)
-     CALL def_ncdf(outfiles,nfiles_out)
+     CALL def_ncdf(infiles,outfiles,nfiles_out)
      CALL fill_files(infiles,outfiles,tzreclist,nbvar,options)
 
   ELSE IF (runmode == MODECDF2CDF) THEN
      ! Conversion netCDF -> netCDF
      IF (options(OPTSPLIT)%set) call open_split_ncfiles_out(outfiles,nfiles_out,houtfile,nbvar_tbw,options)
      CALL parse_infiles(infiles,outfiles,nfiles_out,nbvar_infile,nbvar_tbr,nbvar_calc,nbvar_tbw,tzreclist,options,runmode)
-     CALL def_ncdf(outfiles,nfiles_out)
+     CALL def_ncdf(infiles,outfiles,nfiles_out)
      CALL fill_files(infiles,outfiles,tzreclist,nbvar,options)
 
   ELSE
diff --git a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90 b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
index 01d871f75510d95cb732139cb95a241e91edd56a..e30ba71e190ecf85378485046e8146d96addfae6 100644
--- a/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
+++ b/LIBTOOLS/tools/lfi2cdf/src/mode_util.f90
@@ -618,21 +618,47 @@ END DO
     END IF
   END SUBROUTINE HANDLE_ERR
 
-  SUBROUTINE def_ncdf(outfiles,KNFILES_OUT)
+  SUBROUTINE def_ncdf(infiles,outfiles,KNFILES_OUT)
     USE MODD_CONF,   ONLY: NMNHVERSION
     USE MODE_NETCDF, ONLY: IO_WRITE_HEADER_NC4
 
+    TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: infiles
     TYPE(TFILE_ELT),DIMENSION(:),INTENT(IN) :: outfiles
     INTEGER,                     INTENT(IN) :: KNFILES_OUT
 
+    CHARACTER(LEN=*),PARAMETER :: YUNKNOWNHIST = 'Previous history is unknown'
+
     CHARACTER(LEN=16) :: YMNHVERSION
-    INTEGER :: ji
+    CHARACTER(LEN=:),ALLOCATABLE :: YHISTORY
+    INTEGER :: ilen, ji
     INTEGER(KIND=IDCDF_KIND) :: status
     INTEGER(KIND=IDCDF_KIND) :: kcdf_id
 
 
     CALL PRINT_MSG(NVERB_DEBUG,'IO','def_ncdf','called')
 
+    !Copy history attribute for netCDF files
+    IF( outfiles(1)%TFILE%CFORMAT=='NETCDF4' ) THEN
+      IF( infiles(1)%TFILE%CFORMAT=='NETCDF4' ) THEN
+        status = NF90_INQUIRE_ATTRIBUTE(infiles(1)%TFILE%NNCID, NF90_GLOBAL, 'history', LEN=ilen)
+        IF (status == NF90_NOERR) THEN
+          ALLOCATE(CHARACTER(LEN=ilen) :: YHISTORY)
+          status = NF90_GET_ATT(infiles(1)%TFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY)
+        ELSE
+          YHISTORY = YUNKNOWNHIST
+        END IF
+      ELSE
+        YHISTORY = YUNKNOWNHIST
+      END IF
+
+      DO ji = 1,KNFILES_OUT
+        kcdf_id = outfiles(ji)%TFILE%NNCID
+        status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'history',YHISTORY)
+        IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
+      END DO
+    END IF
+
+    !Write header for netCDF files
     DO ji = 1,KNFILES_OUT
       kcdf_id = outfiles(ji)%TFILE%NNCID
 
@@ -643,7 +669,7 @@ END DO
       status = NF90_PUT_ATT(kcdf_id,NF90_GLOBAL,'lfi2cdf_version',TRIM(YMNHVERSION))
       IF (status /= NF90_NOERR) CALL HANDLE_ERR(status,__LINE__)
     END DO
-    
+
   END SUBROUTINE def_ncdf
 
   SUBROUTINE fill_files(infiles,outfiles,tpreclist,knaf,options)
diff --git a/src/LIB/SURCOUCHE/src/mode_netcdf.f90 b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
index 5449f9d3e6d06cc49b19d0c8c70a4b0ca77bec02..9f5aa1ba51bc758c3308d71c65e44235f81cd93a 100644
--- a/src/LIB/SURCOUCHE/src/mode_netcdf.f90
+++ b/src/LIB/SURCOUCHE/src/mode_netcdf.f90
@@ -697,7 +697,7 @@ USE MODD_IO_ll, ONLY: TFILEDATA
 !
 TYPE(TFILEDATA), INTENT(IN)  :: TPFILE ! File structure
 !
-INTEGER(KIND=IDCDF_KIND) :: ISTATUS
+INTEGER(KIND=IDCDF_KIND)     :: ISTATUS
 !
 IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETURN
 !
@@ -723,7 +723,8 @@ IF (TPFILE%LMASTER)  THEN
 
 !title
 
-!history
+  !history
+  CALL IO_APPEND_HISTORY_NC4(TPFILE)
 
 !institution
 
@@ -737,6 +738,62 @@ END IF
 END SUBROUTINE IO_WRITE_HEADER_NC4
 
 
+SUBROUTINE IO_APPEND_HISTORY_NC4(TPFILE)
+!
+USE MODD_IO_ll, ONLY: TFILEDATA
+!
+TYPE(TFILEDATA), INTENT(IN)  :: TPFILE ! File structure
+!
+INTEGER,PARAMETER :: YEAR=1, MONTH=2, DAY=3, HH=5, MM=6, SS=7
+!
+CHARACTER(len=5)             :: YZONE
+CHARACTER(LEN=:),ALLOCATABLE :: YCMD, YHISTORY, YHISTORY_NEW, YHISTORY_PREV
+INTEGER                      :: ILEN_CMD, ILEN_PREV
+INTEGER(KIND=IDCDF_KIND)     :: ISTATUS
+INTEGER,DIMENSION(8)         :: IDATETIME
+!
+IF (TRIM(TPFILE%CFORMAT)/='NETCDF4' .AND. TRIM(TPFILE%CFORMAT)/='LFICDF4') RETURN
+!
+CALL PRINT_MSG(NVERB_DEBUG,'IO','IO_APPEND_HISTORY_NC4','called for file '//TRIM(TPFILE%CNAME))
+!
+IF (TPFILE%LMASTER)  THEN
+  !Check if history attribute already exists in file and read it
+  ISTATUS = NF90_INQUIRE_ATTRIBUTE(TPFILE%NNCID, NF90_GLOBAL, 'history', LEN=ILEN_PREV)
+  IF (ISTATUS == NF90_NOERR) THEN
+    ALLOCATE(CHARACTER(LEN=ILEN_PREV) :: YHISTORY_PREV)
+    ISTATUS = NF90_GET_ATT(TPFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY_PREV)
+    IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_APPEND_HISTORY_NC4[NF90_GET_ATT]')
+    YHISTORY_PREV = YHISTORY_PREV
+  ELSE
+    ILEN_PREV = 0
+  END IF
+
+  !Get date and time
+  call DATE_AND_TIME( VALUES=IDATETIME, ZONE=YZONE )
+  call GET_COMMAND(lENGTH=ILEN_CMD)
+  IF (ILEN_CMD>0) THEN
+    ALLOCATE(CHARACTER(ILEN_CMD) :: YCMD)
+    CALL GET_COMMAND(COMMAND=YCMD)
+  END IF
+
+  !Prepare new history entry
+  ALLOCATE(CHARACTER(26+ILEN_CMD) :: YHISTORY_NEW)
+  WRITE(YHISTORY_NEW, '( I4.4,"-",I2.2,"-",I2.2,"T",I2.2,":",I2.2,":",I2.2,A5,": ", A )') &
+        IDATETIME(YEAR),IDATETIME(MONTH),IDATETIME(DAY),IDATETIME(HH),IDATETIME(MM),IDATETIME(SS),YZONE, YCMD
+
+  !Write full history
+  IF (ILEN_PREV == 0) THEN
+    YHISTORY = YHISTORY_NEW
+  ELSE
+    YHISTORY = YHISTORY_NEW//NEW_LINE('A')//YHISTORY_PREV
+  END IF
+  ISTATUS = NF90_PUT_ATT(TPFILE%NNCID, NF90_GLOBAL, 'history', YHISTORY  )
+  IF (ISTATUS /= NF90_NOERR) CALL HANDLE_ERR(ISTATUS,__LINE__,'IO_APPEND_HISTORY_NC4[NF90_PUT_ATT]')
+END IF
+
+END SUBROUTINE IO_APPEND_HISTORY_NC4
+
+
 SUBROUTINE IO_WRITE_FIELD_ATTR_NC4(TPFILE,TPFIELD,KVARID,OEXISTED,KSHAPE,HCALENDAR,OISCOORD)
 !
 USE MODD_CONF,   ONLY: CPROGRAM, LCARTESIAN