Updated runtime files.
diff --git a/runtime/doc/channel.txt b/runtime/doc/channel.txt
index 47039e1..dd4b8d3 100644
--- a/runtime/doc/channel.txt
+++ b/runtime/doc/channel.txt
@@ -1,4 +1,4 @@
-*channel.txt*      For Vim version 7.4.  Last change: 2016 Jun 02
+*channel.txt*      For Vim version 7.4.  Last change: 2016 Jul 07
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -495,6 +495,9 @@
 job stdin.  This allows for editing the last line and sending it when pressing
 Enter.
 
+NUL bytes in the text will be passed to the job (internally Vim stores these
+as NL bytes).
+
 
 Reading job output in the close callback ~
 							*read-in-close-cb*
@@ -684,7 +687,8 @@
 first column of the last line, the cursor will be moved to the newly added
 line and the window is scrolled up to show the cursor if needed.
 
-Undo is synced for every added line.
+Undo is synced for every added line.  NUL bytes are accepted (internally Vim
+stores these as NL bytes).
 
 
 Writing to a file ~
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 438e28e..d8fe9c0 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -3283,7 +3283,7 @@
 		It is not possible to use `:redir` anywhere in {command}.
 
 		To get a list of lines use |split()| on the result: >
-			split(evalcmd('args'), "\n")
+			split(execute('args'), "\n")
 
 <		When used recursively the output of the recursive call is not
 		included in the output of the higher level call.
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 5584460..4b9299b 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1,4 +1,4 @@
-*map.txt*       For Vim version 7.4.  Last change: 2016 Jun 10
+*map.txt*       For Vim version 7.4.  Last change: 2016 Jul 06
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1274,6 +1274,7 @@
 	-complete=mapping	mapping name
 	-complete=menu		menus
 	-complete=option	options
+	-complete=packadd	optional package |pack-add| names
 	-complete=shellcmd	Shell command
 	-complete=sign		|:sign| suboptions
 	-complete=syntax	syntax file names |'syntax'|
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 98017ec..f535fcf 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 7.4.  Last change: 2016 Jul 01
+*options.txt*	For Vim version 7.4.  Last change: 2016 Jul 09
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -8180,10 +8180,10 @@
 		has been used since the last search command.
 							*viminfo-n*
 	n	Name of the viminfo file.  The name must immediately follow
-		the 'n'.  Must be the last one!  If the "-i" argument was
-		given when starting Vim, that file name overrides the one
-		given here with 'viminfo'.  Environment variables are expanded
-		when opening the file, not when setting the option.
+		the 'n'.  Must be at the end of the option!  If the "-i"
+		argument was given when starting Vim, that file name overrides
+		the one given here with 'viminfo'.  Environment variables are
+		expanded when opening the file, not when setting the option.
 							*viminfo-r*
 	r	Removable media.  The argument is a string (up to the next
 		',').  This parameter can be given several times.  Each
diff --git a/runtime/doc/starting.txt b/runtime/doc/starting.txt
index 817703d..b613cf0 100644
--- a/runtime/doc/starting.txt
+++ b/runtime/doc/starting.txt
@@ -1,4 +1,4 @@
-*starting.txt*  For Vim version 7.4.  Last change: 2016 Jun 15
+*starting.txt*  For Vim version 7.4.  Last change: 2016 Jul 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1426,6 +1426,7 @@
    BBB   - value from session B
    BOTH  - value from session B, value from session A is lost
 
+							*viminfo-timestamp*
 For some items a timestamp is used to keep the last changed version.  Here it
 doesn't matter in which sequence Vim sessions exit, the newest item(s) are
 always kept.  This is used for:
diff --git a/runtime/doc/tags b/runtime/doc/tags
index a35bb7a..12ed733 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -2041,6 +2041,8 @@
 :cat	eval.txt	/*:cat*
 :catch	eval.txt	/*:catch*
 :cb	quickfix.txt	/*:cb*
+:cbo	quickfix.txt	/*:cbo*
+:cbottom	quickfix.txt	/*:cbottom*
 :cbuffer	quickfix.txt	/*:cbuffer*
 :cc	quickfix.txt	/*:cc*
 :ccl	quickfix.txt	/*:ccl*
@@ -2393,6 +2395,8 @@
 :lat	undo.txt	/*:lat*
 :later	undo.txt	/*:later*
 :lb	quickfix.txt	/*:lb*
+:lbo	quickfix.txt	/*:lbo*
+:lbottom	quickfix.txt	/*:lbottom*
 :lbuffer	quickfix.txt	/*:lbuffer*
 :lc	editing.txt	/*:lc*
 :lcd	editing.txt	/*:lcd*
@@ -4457,6 +4461,7 @@
 E928	eval.txt	/*E928*
 E929	starting.txt	/*E929*
 E93	windows.txt	/*E93*
+E930	eval.txt	/*E930*
 E94	windows.txt	/*E94*
 E95	message.txt	/*E95*
 E96	diff.txt	/*E96*
@@ -4472,6 +4477,7 @@
 Ex-mode	intro.txt	/*Ex-mode*
 Exuberant_ctags	tagsrch.txt	/*Exuberant_ctags*
 F	motion.txt	/*F*
+FALSE	eval.txt	/*FALSE*
 FAQ	intro.txt	/*FAQ*
 Farsi	farsi.txt	/*Farsi*
 FileAppendCmd	autocmd.txt	/*FileAppendCmd*
@@ -4686,6 +4692,7 @@
 TOhtml-performance	syntax.txt	/*TOhtml-performance*
 TOhtml-uncopyable-text	syntax.txt	/*TOhtml-uncopyable-text*
 TOhtml-wrap-text	syntax.txt	/*TOhtml-wrap-text*
+TRUE	eval.txt	/*TRUE*
 TSQL	ft_sql.txt	/*TSQL*
 TTpro-telnet	syntax.txt	/*TTpro-telnet*
 Tab	intro.txt	/*Tab*
@@ -5746,6 +5753,7 @@
 exclusive	motion.txt	/*exclusive*
 exclusive-linewise	motion.txt	/*exclusive-linewise*
 executable()	eval.txt	/*executable()*
+execute()	eval.txt	/*execute()*
 execute-menus	gui.txt	/*execute-menus*
 exepath()	eval.txt	/*exepath()*
 exim	starting.txt	/*exim*
@@ -6373,6 +6381,7 @@
 getcmdpos()	eval.txt	/*getcmdpos()*
 getcmdtype()	eval.txt	/*getcmdtype()*
 getcmdwintype()	eval.txt	/*getcmdwintype()*
+getcompletion()	eval.txt	/*getcompletion()*
 getcurpos()	eval.txt	/*getcurpos()*
 getcwd()	eval.txt	/*getcwd()*
 getfontname()	eval.txt	/*getfontname()*
@@ -9051,6 +9060,7 @@
 viminfo-read	starting.txt	/*viminfo-read*
 viminfo-read-write	starting.txt	/*viminfo-read-write*
 viminfo-s	options.txt	/*viminfo-s*
+viminfo-timestamp	starting.txt	/*viminfo-timestamp*
 viminfo-write	starting.txt	/*viminfo-write*
 vimrc	starting.txt	/*vimrc*
 vimrc-filetype	usr_05.txt	/*vimrc-filetype*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 07c4f05..88a6ce2 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.4.  Last change: 2016 Jul 02
+*todo.txt*      For Vim version 7.4.  Last change: 2016 Jul 09
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -34,14 +34,10 @@
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
-Further implement 'barline' in viminfo:
-- Use timestamp for more items: locations, marks.
-
 Problem with setqflist([]): grep 4 times, ":colder 3", setqflist([]) will
 clear the next list, not the current one.  Ramel Eshed, Jun 8.
 
 +channel:
-- Should write_buf_line() change NL to NUL characters?
 - GUI cursor blinking interrupted when the job output goes to a buffer that is
   in a window. (Ramel Eshed, 2016 Jun 9)
 - GUI cursor blinking interrupted when there is a status line.  (Ramel Eshed,
@@ -61,17 +57,11 @@
     With xterm could use -S{pty}.
 
 Quickfix improvements for background building and grepping:
-  Patch from Yegappan, 2016 Jun 17.
-  Need to reset values when starting a new list.
-- If 'efm' is the same as last time re-use the fmt_first list.
-- Do not clear "dir_stack", "directory" and "file_stack", "currfile" when
-  using ":addexpr".
-  Move multiline, multiignore, multiscan outside of the function.
-- Add :cbottom, if quickfix window is visible scroll to make the last line
-  visible. Use scroll_cursor_bot(0, FALSE);
-- Add a flag/property/option to quickfix commands and functions to keep a file
-  name as a string and not create a buffer for it? To avoid creating lots of
-  buffers. (Ramel Eshed)
+- Add a command modifier ":usefname" to quickfix commands and functions to
+  keep a file name as a string and not create a buffer for it? To avoid
+  creating lots of buffers. (Ramel Eshed)
+  Store the relative file name and set a flag "qf_relative".  Before changing
+  directory turn them into full paths.
 
 Regexp problems:
 - When using automatic engine selection there is a false match.  Forcing
@@ -130,16 +120,18 @@
 Should json_encode()/json_decode() restrict recursiveness?
 Or avoid recursiveness.
 
-Patch to support 64 bit ints for Number. (Ken Takata, 2016 Jan 21)
-Update 2016 Apr 24.
-Update 2016 Jun 14, includes some tests.
-
-Patch to support expression argument to sort() instead of a function name.
-Yasuhiro Matsumoto, 2013 May 31.
-Or should we add a more general mechanism, like a lambda() function?
+Add a lambda() function.
 Patch by Yasuhiro Matsumoto, 2014 Sep 16, update 2016 Apr 17.
 Correction for test, Ken Takata, 2016 May 27.
 Merged patch: Ken Takata, 2016 Jun 15.
+Need to separate-out closure and lambda somehow.
+Define lambda directly, not as a string: {v -> v * 8}
+Lambda implementation by Ken Takata, 2016 Jul 7.
+
+Python: Extended funcrefs: use func_T* structure in place of char_u* function
+names.
+(ZyX, 2013 Jul 15, update Sep 22, 24, 28; Update 2013 Dec 15, 2014 Jan 6)
+Also fixes Bug: E685 error for func_unref(). (ZyX, 2010 Aug 5)
 
 Once .exe with updated installer is available: Add remark to download page
 about /S and /D options (Ken Takata, 2016 Apr 13)
@@ -161,7 +153,8 @@
 5)
 
 'completeopt' noinsert breaks redo register (Shougo, 2016 Jun 18, #874)
-Patch to fix this: #875
+Patch to fix this: #905.
+There also is #875 to fix another problem?
 
 Problem with whitespace in errorformat. (Gerd Wachsmuth, 2016 May 15, #807)
 
@@ -769,11 +762,6 @@
 
 :help gives example for z?, but it does not work.  m? and t? do work.
 
-Python: Extended funcrefs: use func_T* structure in place of char_u* function
-names.
-(ZyX, 2013 Jul 15, update Sep 22, 24, 28; Update 2013 Dec 15, 2014 Jan 6)
-Also fixes Bug: E685 error for func_unref(). (ZyX, 2010 Aug 5)
-
 Patch to add funcref to Lua.  (Luis Carvalho, 2013 Sep 4)
 With tests: Sep 5.
 
diff --git a/runtime/doc/usr_41.txt b/runtime/doc/usr_41.txt
index d720344..1eec17e 100644
--- a/runtime/doc/usr_41.txt
+++ b/runtime/doc/usr_41.txt
@@ -1,4 +1,4 @@
-*usr_41.txt*	For Vim version 7.4.  Last change: 2016 Jun 13
+*usr_41.txt*	For Vim version 7.4.  Last change: 2016 Jul 09
 
 		     VIM USER MANUAL - by Bram Moolenaar
 
@@ -611,6 +611,7 @@
 	byteidxcomp()		like byteidx() but count composing characters
 	repeat()		repeat a string multiple times
 	eval()			evaluate a string expression
+	execute()		execute an Ex command and get the output
 
 List manipulation:					*list-functions*
 	get()			get an item without error for wrong index
@@ -978,6 +979,8 @@
 
 	shiftwidth()		effective value of 'shiftwidth'
 
+	wordcount()		get byte/word/char count of buffer
+
 	taglist()		get list of matching tags
 	tagfiles()		get a list of tags files
 
@@ -986,7 +989,6 @@
 	perleval()		evaluate Perl expression (|+perl|)
 	py3eval()		evaluate Python expression (|+python3|)
 	pyeval()		evaluate Python expression (|+python|)
-	wordcount()		get byte/word/char count of buffer
 
 ==============================================================================
 *41.7*	Defining a function
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index 31f1a1b..01182c7 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -1,4 +1,4 @@
-*various.txt*   For Vim version 7.4.  Last change: 2016 May 24
+*various.txt*   For Vim version 7.4.  Last change: 2016 Jul 09
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -470,9 +470,12 @@
 			shown on the screen.  When [!] is included, an
 			existing file is overwritten.  When [!] is omitted,
 			and {file} exists, this command fails.
+
 			Only one ":redir" can be active at a time.  Calls to
 			":redir" will close any active redirection before
-			starting redirection to the new target.
+			starting redirection to the new target.  For recursive
+			use check out |execute()|.
+
 			To stop the messages and commands from being echoed to
 			the screen, put the commands in a function and call it
 			with ":silent call Function()".
@@ -512,6 +515,8 @@
 			redirection starts, if the variable is removed or
 			locked or the variable type is changed, then further
 			command output messages will cause errors. {not in Vi}
+			To get the output of one command the |execute()|
+			function can be used.
 
 :redi[r] =>> {var}	Append messages to an existing variable.  Only string
 			variables can be used. {not in Vi}
diff --git a/runtime/doc/version8.txt b/runtime/doc/version8.txt
index bb8d62d..5340733 100644
--- a/runtime/doc/version8.txt
+++ b/runtime/doc/version8.txt
@@ -1,4 +1,4 @@
-*version8.txt*  For Vim version 8.0.  Last change: 2016 Jun 04
+*version8.txt*  For Vim version 8.0.  Last change: 2016 Jul 03
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -16,12 +16,12 @@
 See |version4.txt|, |version5.txt|, |version6.txt| and |version7.txt| for
 differences between other versions.
 
-INCOMPATIBLE CHANGES			|incompatible-8|
-
 NEW FEATURES				|new-8|
 
 Vim script enhancements			|new-vim-script-8|
 
+INCOMPATIBLE CHANGES			|incompatible-8|
+
 IMPROVEMENTS				|improvements-8|
 
 COMPILE TIME CHANGES			|compile-changes-8|
@@ -30,21 +30,6 @@
 
 
 ==============================================================================
-INCOMPATIBLE CHANGES				*incompatible-8*
-
-These changes are incompatible with previous releases.  Check this list if you
-run into a problem when upgrading from Vim 7.4 to 8.0.
-
-The support for MS-DOS has been removed.  It hasn't been working for a while
-and removing it cleans up the code quite a bit.
-
-The support for Windows 16 bit (Windows 95 and older) has been removed.
-
-Minor incompatibilities:
-
-For filetype detection: ...
-
-==============================================================================
 NEW FEATURES						*new-8*
 
 First a list of the bigger new features.  A comprehensive list is below.
@@ -52,14 +37,18 @@
 
 Asynchronous I/O support, channels ~
 
-Vim can now exchange messages with another process in the background.  The
-messages are received and handled while Vim is waiting for a character.  See
-|channel-demo| for an example, communicating with a Python server.
+Vim can now exchange messages with other processes in the background.  This
+makes it possible to have servers do work and send back the results to Vim.
+See |channel-demo| for an example, this shows communicating with a Python
+server.
 
 Closely related to channels is JSON support.  JSON is widely supported and can
 easily be used for inter-process communication, allowing for writing a server
 in any language.  The functions to use are |json_encode()| and |json_decode()|.
 
+This makes it possible to build very complex plugins, written in any language
+and running in a separate process.
+
 
 Jobs ~
 
@@ -74,8 +63,8 @@
 Also asynchronous are timers.  They can fire once or repeatedly and invoke a
 function to do any work.  For example: >
 	let tempTimer = timer_start(4000, 'CheckTemp')
-This will make a call four seconds (4000 milli seconds) later, like: >
-	call CheckTemp()
+This will call the CheckTemp() function four seconds (4000 milli seconds)
+later.
 
 
 Partials ~
@@ -85,8 +74,7 @@
 especially useful for callbacks on channels and timers.  E.g., for the timer
 example above, to pass an argument to the function: >
 	let tempTimer = timer_start(4000, function('CheckTemp', ['out']))
-This will a make call four seconds later, like: >
-	call CheckTemp('out')
+This will call CheckTemp('out') four seconds later.
 
 
 Packages ~
@@ -103,26 +91,7 @@
 This is for Vim developers.  So far writing tests for Vim has not been easy.
 Vim 8 adds assert functions and a framework to run tests.  This makes it a lot
 simpler to write tests and keep them updated.  Also new are several functions
-that are added specifically for testing.
-
-These functions have been added:
-	|assert_equal()|
-	|assert_notequal()|
-	|assert_exception()|
-	|assert_fails()|
-	|assert_false()|
-	|assert_match()|
-	|assert_notmatch()|
-	|assert_true()|
-	|test_alloc_fail()|
-	|test_disable_char_avail()|
-	|test_garbagecollect_now()|
-	|test_null_channel()|
-	|test_null_dict()|
-	|test_null_job()|
-	|test_null_list()|
-	|test_null_partial()|
-	|test_null_string()|
+that are added specifically for testing. See |test-functions|.
 
 
 Window IDs ~
@@ -132,6 +101,13 @@
 unique ID, so that they are easy to find.  See |win_getid()| and |win_id2win()|.
 
 
+Viminfo uses timestamps ~
+
+Previously the information stored in viminfo was whatever the last Vim wrote
+there.  Now timestamps are used to always keep the most recent items.
+See |viminfo-timestamp|.
+
+
 Wrapping lines with indent ~
 
 The 'breakindent' option has been added to be able to wrap lines without
@@ -216,6 +192,21 @@
 
 
 ==============================================================================
+INCOMPATIBLE CHANGES				*incompatible-8*
+
+These changes are incompatible with previous releases.  Check this list if you
+run into a problem when upgrading from Vim 7.4 to 8.0.
+
+The support for MS-DOS has been removed.  It hasn't been working for a while
+and removing it cleans up the code quite a bit.
+
+The support for Windows 16 bit (Windows 95 and older) has been removed.
+
+Minor incompatibilities:
+
+For filetype detection: ...
+
+==============================================================================
 IMPROVEMENTS						*improvements-8*
 
 The existing blowfish encryption turned out to be much weaker than it was
diff --git a/runtime/syntax/c.vim b/runtime/syntax/c.vim
index 3fe3256..57d99ab 100644
--- a/runtime/syntax/c.vim
+++ b/runtime/syntax/c.vim
@@ -1,7 +1,7 @@
 " Vim syntax file
 " Language:	C
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2016 Apr 10
+" Last Change:	2016 Jul 07
 
 " Quit when a (custom) syntax file was already loaded
 if exists("b:current_syntax")
@@ -295,7 +295,7 @@
   syn keyword cConstant SCHAR_MIN SINT_MIN SLONG_MIN SSHRT_MIN
   syn keyword cConstant SCHAR_MAX SINT_MAX SLONG_MAX SSHRT_MAX
   if !exists("c_no_c99")
-    syn keyword cConstant __func__
+    syn keyword cConstant __func__ __VA_ARGS__
     syn keyword cConstant LLONG_MIN LLONG_MAX ULLONG_MAX
     syn keyword cConstant INT8_MIN INT16_MIN INT32_MIN INT64_MIN
     syn keyword cConstant INT8_MAX INT16_MAX INT32_MAX INT64_MAX
diff --git a/runtime/syntax/cpp.vim b/runtime/syntax/cpp.vim
index c7a6838..fefd0ff 100644
--- a/runtime/syntax/cpp.vim
+++ b/runtime/syntax/cpp.vim
@@ -2,7 +2,7 @@
 " Language:	C++
 " Current Maintainer:	vim-jp (https://github.com/vim-jp/vim-cpp)
 " Previous Maintainer:	Ken Shan <ccshan@post.harvard.edu>
-" Last Change:	2015 Nov 10
+" Last Change:	2016 Jul 07
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
@@ -80,6 +80,7 @@
   HiLink cppConstant		Constant
   HiLink cppRawStringDelimiter	Delimiter
   HiLink cppRawString		String
+  HiLink cppNumber		Number
   delcommand HiLink
 endif
 
diff --git a/runtime/syntax/pf.vim b/runtime/syntax/pf.vim
index 1a8f34b..81add10 100644
--- a/runtime/syntax/pf.vim
+++ b/runtime/syntax/pf.vim
@@ -2,30 +2,22 @@
 " Language:        OpenBSD packet filter configuration (pf.conf)
 " Original Author: Camiel Dobbelaar <cd@sentia.nl>
 " Maintainer:      Lauri Tirkkonen <lotheac@iki.fi>
-" Last Change:     2013 Apr 02
+" Last Change:     2016 Jul 06
 
-" For version 5.x: Clear all syntax items
-" For version 6.x: Quit when a syntax file was already loaded
-if version < 600
-  syntax clear
-elseif exists("b:current_syntax")
+if exists("b:current_syntax")
   finish
 endif
 
 setlocal foldmethod=syntax
+syn iskeyword @,48-57,_,-,+
 syn sync fromstart
 
 syn cluster	pfNotLS		contains=pfTodo,pfVarAssign
-syn keyword	pfCmd		altq anchor antispoof binat nat pass
-syn keyword	pfCmd		queue rdr scrub table set
-syn keyword	pfService	auth bgp domain finger ftp http https ident
-syn keyword	pfService	imap irc isakmp kerberos mail nameserver nfs
-syn keyword	pfService	nntp ntp pop3 portmap pptp rpcbind rsync smtp
-syn keyword	pfService	snmp snmptrap socks ssh sunrpc syslog telnet
-syn keyword	pfService	tftp www
+syn keyword	pfCmd		anchor antispoof block include match pass queue
+syn keyword	pfCmd		queue set table
+syn match	pfCmd		/^\s*load\sanchor\>/
 syn keyword	pfTodo		TODO XXX contained
 syn keyword	pfWildAddr	all any
-syn match	pfCmd		/block\s/
 syn match	pfComment	/#.*$/ contains=pfTodo
 syn match	pfCont		/\\$/
 syn match	pfErrClose	/}/
@@ -34,43 +26,81 @@
 syn match	pfIPv6		/[a-fA-F0-9:]\+:[a-fA-F0-9:]\+:[a-fA-F0-9:.]\+/
 syn match	pfNetmask	/\/\d\+/
 syn match	pfNum		/[a-zA-Z0-9_:.]\@<!\d\+[a-zA-Z0-9_:.]\@!/
-syn match	pfTable		/<\s*[a-zA-Z][a-zA-Z0-9_]*\s*>/
+syn match	pfTable		/<\s*[a-zA-Z0-9_:][a-zA-Z0-9_:.-]*\s*>/
 syn match	pfVar		/$[a-zA-Z][a-zA-Z0-9_]*/
 syn match	pfVarAssign	/^\s*[a-zA-Z][a-zA-Z0-9_]*\s*=/me=e-1
 syn region	pfFold1		start=/^#\{1}>/ end=/^#\{1,3}>/me=s-1 transparent fold
 syn region	pfFold2		start=/^#\{2}>/ end=/^#\{2,3}>/me=s-1 transparent fold
 syn region	pfFold3		start=/^#\{3}>/ end=/^#\{3}>/me=s-1 transparent fold
 syn region	pfList		start=/{/ end=/}/ transparent contains=ALLBUT,pfErrClose,@pfNotLS
-syn region	pfString	start=/"/ end=/"/ transparent contains=ALLBUT,pfString,@pfNotLS
-syn region	pfString	start=/'/ end=/'/ transparent contains=ALLBUT,pfString,@pfNotLS
+syn region	pfString	start=/"/ skip=/\\"/ end=/"/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
+syn region	pfString	start=/'/ skip=/\\'/ end=/'/ contains=pfIPv4,pfIPv6,pfNetmask,pfTable,pfVar
 
-" Define the default highlighting.
-" For version 5.7 and earlier: only when not done already
-" For version 5.8 and later: only when an item doesn't have highlighting yet
-if version >= 508 || !exists("did_c_syn_inits")
-  if version < 508
-    let did_c_syn_inits = 1
-    command -nargs=+ HiLink hi link <args>
-  else
-    command -nargs=+ HiLink hi def link <args>
-  endif
+syn keyword	pfService	802-11-iapp Microsoft-SQL-Monitor
+syn keyword	pfService	Microsoft-SQL-Server NeXTStep NextStep
+syn keyword	pfService	afpovertcp afs3-bos afs3-callback afs3-errors
+syn keyword	pfService	afs3-fileserver afs3-kaserver afs3-prserver
+syn keyword	pfService	afs3-rmtsys afs3-update afs3-vlserver
+syn keyword	pfService	afs3-volser amt-redir-tcp amt-redir-tls
+syn keyword	pfService	amt-soap-http amt-soap-https asf-rmcp at-echo
+syn keyword	pfService	at-nbp at-rtmp at-zis auth authentication
+syn keyword	pfService	bfd-control bfd-echo bftp bgp bgpd biff bootpc
+syn keyword	pfService	bootps canna cddb cddbp chargen chat cmd
+syn keyword	pfService	cmip-agent cmip-man comsat conference
+syn keyword	pfService	conserver courier csnet-ns cso-ns cvspserver
+syn keyword	pfService	daap datametrics daytime dhcpd-sync
+syn keyword	pfService	dhcpv6-client dhcpv6-server discard domain
+syn keyword	pfService	echo efs eklogin ekshell ekshell2 epmap eppc
+syn keyword	pfService	exec finger ftp ftp-data git gopher hostname
+syn keyword	pfService	hostnames hprop http https hunt hylafax iapp
+syn keyword	pfService	icb ident imap imap2 imap3 imaps ingreslock
+syn keyword	pfService	ipp iprop ipsec-msft ipsec-nat-t ipx irc
+syn keyword	pfService	isakmp iscsi isisd iso-tsap kauth kdc kerberos
+syn keyword	pfService	kerberos-adm kerberos-iv kerberos-sec
+syn keyword	pfService	kerberos_master kf kip klogin kpasswd kpop
+syn keyword	pfService	krb524 krb_prop krbupdate krcmd kreg kshell kx
+syn keyword	pfService	l2tp ldap ldaps ldp link login mail mdns
+syn keyword	pfService	mdnsresponder microsoft-ds ms-sql-m ms-sql-s
+syn keyword	pfService	msa msp mtp mysql name nameserver netbios-dgm
+syn keyword	pfService	netbios-ns netbios-ssn netnews netplan netrjs
+syn keyword	pfService	netstat netwall newdate nextstep nfs nfsd
+syn keyword	pfService	nicname nnsp nntp ntalk ntp null openwebnet
+syn keyword	pfService	ospf6d ospfapi ospfd photuris pop2 pop3 pop3pw
+syn keyword	pfService	pop3s poppassd portmap postgresql postoffice
+syn keyword	pfService	pptp presence printer prospero prospero-np
+syn keyword	pfService	puppet pwdgen qotd quote radacct radius
+syn keyword	pfService	radius-acct rdp readnews remotefs resource rfb
+syn keyword	pfService	rfe rfs rfs_server ripd ripng rje rkinit rlp
+syn keyword	pfService	routed router rpc rpcbind rsync rtelnet rtsp
+syn keyword	pfService	sa-msg-port sane-port sftp shell sieve silc
+syn keyword	pfService	sink sip smtp smtps smux snmp snmp-trap
+syn keyword	pfService	snmptrap snpp socks source spamd spamd-cfg
+syn keyword	pfService	spamd-sync spooler spop3 ssdp ssh submission
+syn keyword	pfService	sunrpc supdup supfiledbg supfilesrv support
+syn keyword	pfService	svn svrloc swat syslog syslog-tls systat
+syn keyword	pfService	tacacs tacas+ talk tap tcpmux telnet tempo
+syn keyword	pfService	tftp time timed timeserver timserver tsap
+syn keyword	pfService	ttylink ttytst ub-dns-control ulistserv untp
+syn keyword	pfService	usenet users uucp uucp-path uucpd vnc vxlan
+syn keyword	pfService	wais webster who whod whois www x400 x400-snd
+syn keyword	pfService	xcept xdmcp xmpp-bosh xmpp-client xmpp-server
+syn keyword	pfService	z3950 zabbix-agent zabbix-trapper zebra
+syn keyword	pfService	zebrasrv
 
-  HiLink pfCmd		Statement
-  HiLink pfComment	Comment
-  HiLink pfCont		Statement
-  HiLink pfErrClose	Error
-  HiLink pfIPv4		Type
-  HiLink pfIPv6		Type
-  HiLink pfNetmask	Constant
-  HiLink pfNum		Constant
-  HiLink pfService	Constant
-  HiLink pfTable	Identifier
-  HiLink pfTodo		Todo
-  HiLink pfVar		Identifier
-  HiLink pfVarAssign	Identifier
-  HiLink pfWildAddr	Type
-
-  delcommand HiLink
-endif
+hi def link pfCmd	Statement
+hi def link pfComment	Comment
+hi def link pfCont	Statement
+hi def link pfErrClose	Error
+hi def link pfIPv4	Type
+hi def link pfIPv6	Type
+hi def link pfNetmask	Constant
+hi def link pfNum	Constant
+hi def link pfService	Constant
+hi def link pfString	String
+hi def link pfTable	Identifier
+hi def link pfTodo	Todo
+hi def link pfVar	Identifier
+hi def link pfVarAssign	Identifier
+hi def link pfWildAddr	Type
 
 let b:current_syntax = "pf"