patch 9.0.0817
diff --git a/src/Makefile b/src/Makefile
index bd6c187..4b342da 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -355,7 +355,7 @@
 #CONF_OPT_GUI = --enable-gui=gnome2 --disable-gtktest
 #CONF_OPT_GUI = --enable-gui=gtk3
 #CONF_OPT_GUI = --enable-gui=gtk3 --disable-gtktest
-#CONF_OPT_GUI = --enable-gui=motif
+CONF_OPT_GUI = --enable-gui=motif
 #CONF_OPT_GUI = --enable-gui=motif --with-motif-lib="-static -lXm -shared"
 
 # Uncomment this line to run an individual test with gvim.
diff --git a/src/bufwrite.c b/src/bufwrite.c
index 3ff7fb3..713dac5 100644
--- a/src/bufwrite.c
+++ b/src/bufwrite.c
@@ -2050,6 +2050,10 @@
 		len = 0;
 		write_info.bw_start_lnum = lnum;
 	    }
+	    if (!buf->b_p_fixeol && buf->b_p_eof)
+		// write trailing CTRL-Z
+		(void)write_eintr(write_info->bw_fd, "\x1a", 1);
+
 	    // write failed or last line has no EOL: stop here
 	    if (end == 0
 		    || (lnum == end
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 676ab70..44333d5 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -929,8 +929,6 @@
 	    STRCAT(t, newcmd);
 	if (ins_prevcmd)
 	    STRCAT(t, prevcmd);
-	else
-	    vim_free(t);
 	p = t + STRLEN(t);
 	STRCAT(t, trailarg);
 	vim_free(newcmd);
diff --git a/src/fileio.c b/src/fileio.c
index 701521a..ab867b7 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -590,6 +590,7 @@
 	if (!read_buffer)
 	{
 	    curbuf->b_p_eol = TRUE;
+	    curbuf->b_p_eof = FALSE;
 	    curbuf->b_start_eol = TRUE;
 	}
 	curbuf->b_p_bomb = FALSE;
@@ -2278,13 +2279,15 @@
 	    && !got_int
 	    && linerest != 0
 	    && !(!curbuf->b_p_bin
-		&& fileformat == EOL_DOS
-		&& *line_start == Ctrl_Z
-		&& ptr == line_start + 1))
+		&& fileformat == EOL_DOS))
     {
 	// remember for when writing
 	if (set_options)
+	{
 	    curbuf->b_p_eol = FALSE;
+	    if (*line_start == Ctrl_Z && ptr == line_start + 1)
+		curbuf->b_p_eof = FALSE;
+	}
 	*ptr = NUL;
 	len = (colnr_T)(ptr - line_start + 1);
 	if (ml_append(lnum, line_start, len, newfile) == FAIL)
diff --git a/src/option.h b/src/option.h
index e266d38..eed12e8 100644
--- a/src/option.h
+++ b/src/option.h
@@ -555,6 +555,7 @@
 EXTERN char_u	*p_gefm;	// 'grepformat'
 EXTERN char_u	*p_gp;		// 'grepprg'
 #endif
+EXTERN int	p_eof;		// 'endoffile'
 EXTERN int	p_eol;		// 'endofline'
 EXTERN int	p_ek;		// 'esckeys'
 EXTERN char_u	*p_ei;		// 'eventignore'
@@ -1123,6 +1124,7 @@
     , BV_DEF
     , BV_INC
 #endif
+    , BV_EOF
     , BV_EOL
     , BV_FIXEOL
     , BV_EP
diff --git a/src/optiondefs.h b/src/optiondefs.h
index 9ea8602..43a334f 100644
--- a/src/optiondefs.h
+++ b/src/optiondefs.h
@@ -61,6 +61,7 @@
 # define PV_DEF		OPT_BOTH(OPT_BUF(BV_DEF))
 # define PV_INC		OPT_BOTH(OPT_BUF(BV_INC))
 #endif
+#define PV_EOF		OPT_BUF(BV_EOF)
 #define PV_EOL		OPT_BUF(BV_EOL)
 #define PV_FIXEOL	OPT_BUF(BV_FIXEOL)
 #define PV_EP		OPT_BOTH(OPT_BUF(BV_EP))
@@ -846,7 +847,7 @@
     {"edcompatible","ed",   P_BOOL|P_VI_DEF,
 			    (char_u *)&p_ed, PV_NONE,
 			    {(char_u *)FALSE, (char_u *)0L} SCTX_INIT},
-    {"emoji",  "emo",	    P_BOOL|P_VI_DEF|P_RCLR,
+    {"emoji",      "emo",   P_BOOL|P_VI_DEF|P_RCLR,
 			    (char_u *)&p_emoji, PV_NONE,
 			    {(char_u *)TRUE, (char_u *)0L}
 			    SCTX_INIT},
@@ -854,6 +855,9 @@
 			    (char_u *)&p_enc, PV_NONE,
 			    {(char_u *)ENC_DFLT, (char_u *)0L}
 			    SCTX_INIT},
+    {"endoffile",   "eof",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
+			    (char_u *)&p_eof, PV_EOF,
+			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
     {"endofline",   "eol",  P_BOOL|P_NO_MKRC|P_VI_DEF|P_RSTAT,
 			    (char_u *)&p_eol, PV_EOL,
 			    {(char_u *)TRUE, (char_u *)0L} SCTX_INIT},
diff --git a/src/structs.h b/src/structs.h
index bc3d8cb..02c9c2a 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -2999,6 +2999,7 @@
     char_u	*b_p_tfu;	// 'tagfunc' option value
     callback_T	b_tfu_cb;	// 'tagfunc' callback
 #endif
+    int		b_p_eof;	// 'endoffile'
     int		b_p_eol;	// 'endofline'
     int		b_p_fixeol;	// 'fixendofline'
     int		b_p_et;		// 'expandtab'
diff --git a/src/testdir/test_fixeol.vim b/src/testdir/test_fixeol.vim
index e97bf00..3ede84f 100644
--- a/src/testdir/test_fixeol.vim
+++ b/src/testdir/test_fixeol.vim
@@ -1,17 +1,17 @@
-" Tests for 'fixeol' and 'eol'
+" Tests for 'fixeol', 'eof' and 'eol'
 
 func Test_fixeol()
   " first write two test files – with and without trailing EOL
   " use Unix fileformat for consistency
   set ff=unix
   enew!
-  call setline('.', 'with eol')
+  call setline('.', 'with eol or eof')
   w! XXEol
   enew!
-  set noeol nofixeol
-  call setline('.', 'without eol')
+  set noeof noeol nofixeol
+  call setline('.', 'without eol or eof')
   w! XXNoEol
-  set eol fixeol
+  set eol eof fixeol
   bwipe XXEol XXNoEol
 
   " try editing files with 'fixeol' disabled
@@ -44,7 +44,7 @@
   call delete('XXNoEol')
   call delete('XXTestEol')
   call delete('XXTestNoEol')
-  set ff& fixeol& eol&
+  set ff& fixeol& eof& eol&
   enew!
 endfunc
 
diff --git a/src/version.c b/src/version.c
index 237cd7c..e9f9f12 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,10 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    817,
+/**/
+    816,
+/**/
     815,
 /**/
     814,