patch 9.0.0817
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 5beb6a2..de388bb 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -3052,6 +3052,13 @@
 'endofline' 'eol'	boolean	(default on)
 			local to buffer
 	When writing a file and this option is off and the 'binary' option
+	is on, or 'fixeol' option is off, no CTRL-Z will be written for at the
+	end of the file.
+
+			*'endofline'* *'eol'* *'noendofline'* *'noeol'*
+'endofline' 'eol'	boolean	(default on)
+			local to buffer
+	When writing a file and this option is off and the 'binary' option
 	is on, or 'fixeol' option is off, no <EOL> will be written for the
 	last line in the file.  This option is automatically set or reset when
 	starting to edit a new file, depending on whether file has an <EOL>
@@ -3452,7 +3459,7 @@
 'fixendofline' 'fixeol'	boolean	(default on)
 			local to buffer
 	When writing a file and this option is on, <EOL> at the end of file
-	will be restored if missing. Turn this option off if you want to
+	will be restored if missing.  Turn this option off if you want to
 	preserve the situation from the original file.
 	When the 'binary' option is set the value of this option doesn't
 	matter.
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,