diff --git a/README.txt b/README.txt
index 7674299d019623a27fdd2dd6ac5c9486713d3071..fda27ec63c3be142e6ec186dacaee7b80f535eab 100644
--- a/README.txt
+++ b/README.txt
@@ -5,9 +5,9 @@ WHAT IS VIM
 
 Vim is an almost compatible version of the UNIX editor Vi.  Many new features
 have been added: multi-level undo, syntax highlighting, command line history,
-on-line help, filename completion, block operations, etc.  There is also a
-Graphical User Interface (GUI) available.  See "runtime/doc/vi_diff.txt" for
-differences with Vi.
+on-line help, spell checking, filename completion, block operations, etc.
+There is also a Graphical User Interface (GUI) available.  See
+"runtime/doc/vi_diff.txt" for differences with Vi.
 
 This editor is very useful for editing programs and other plain ASCII files.
 All commands are given with normal keyboard characters, so those who can type
@@ -56,15 +56,16 @@ distribute it.
 
 SPONSORING
 
-Fixing bugs and adding new features takes a lot of effort.  For a few years
-Bram has attempted to do this next to a full-time job.  During that time the
-todo list kept getting longer and longer.
+Fixing bugs and adding new features takes a lot of time and effort.  To show
+your appreciation for the work and motivate Bram and others to continue
+working on Vim please send a donation.
 
-In order for Bram to support Vim properly he needs your help.  Through your
-donations Bram will be able to have a part-time job and spend more time on
-fixing bugs and adding new features.
+Since Bram is back to a paid job the money will now be used to help children
+in Uganda.  See runtime/doc/uganda.txt.  But at the same time donations
+increase Bram's motivation to keep working on Vim!
 
 For the most recent information about sponsoring look on the Vim web site:
+
 	http://www.vim.org/sponsor/
 
 
@@ -132,6 +133,9 @@ MAIN AUTHOR
 Send any other comments, patches, pizza and suggestions to:
 
 	Bram Moolenaar		E-mail:	Bram@vim.org
-	Clematisstraat 30
-	5925 BE  Venlo		Tel: +31 77 387 2340
-	The Netherlands		Fax/voice-mail: +31 20 773 8272
+	Molenstraat 2
+	2161 HP  Lisse
+	The Netherlands
+
+This is the address of my parents, they will forward mail and eat the pizza.
+My actual address will change a couple of times in 2006.
diff --git a/runtime/autoload/zip.vim b/runtime/autoload/zip.vim
index 6790f4ff4ef5341ea2400f8e0402fe0650a44fdb..c71a4dc3d32ee4432d380f888ed263f0b1fb0000 100644
--- a/runtime/autoload/zip.vim
+++ b/runtime/autoload/zip.vim
@@ -1,7 +1,7 @@
 " zip.vim: Handles browsing zipfiles
 "            AUTOLOAD PORTION
-" Date:			Mar 22, 2006
-" Version:		7
+" Date:			Apr 10, 2006
+" Version:		8
 " Maintainer:	Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
 " License:		Vim License  (see vim's :help license)
 " Copyright:    Copyright (C) 2005 Charles E. Campbell, Jr. {{{1
@@ -22,7 +22,7 @@ if exists("g:loaded_zip")
  finish
 endif
 
-let g:loaded_zip     = "v7"
+let g:loaded_zip     = "v8"
 let s:zipfile_escape = ' ?&;\'
 
 " ----------------
@@ -83,7 +83,9 @@ fun! zip#Browse(zipfile)
   4,$g/^\s*----/d
   4,$g/^\s*\a/d
   $d
-  exe 'silent 4,$s/^.*\%'.namecol.'c//'
+  if namecol > 0
+   exe 'silent 4,$s/^.*\%'.namecol.'c//'
+  endif
 
   setlocal noma nomod ro
   noremap <silent> <buffer> <cr> :call <SID>ZipBrowseSelect()<cr>
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index e8e1caa6a17c7cc4791b0c0acd5c43ccc309a279..4aebe30c8b647f32f042fae068497c581e50384c 100644
--- a/runtime/doc/change.txt
+++ b/runtime/doc/change.txt
@@ -1,4 +1,4 @@
-*change.txt*    For Vim version 7.0d.  Last change: 2006 Apr 09
+*change.txt*    For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1508,7 +1508,7 @@ Vim has a sorting function and a sorting command.  The sorting function can be
 found here: |sort()|.
 
 							*:sor* *:sort*
-:[range]sor[t][!] [i][u][n][x][o] [/{pattern}/]
+:[range]sor[t][!] [i][u][r][n][x][o] [/{pattern}/]
 			Sort lines in [range].  When no range is given all
 			lines are sorted.
 
@@ -1517,24 +1517,25 @@ found here: |sort()|.
 			With [i] case is ignored.
 
 			With [n] sorting is done on the first decimal number
-			in the line (after a {pattern} match).
+			in the line (after or inside a {pattern} match).
 
 			With [x] sorting is done on the first hexadecimal
-			number in the line (after a {pattern} match).  A
-			leading "0x" or "0X" is ignored.
+			number in the line (after or inside a {pattern}
+			match).  A leading "0x" or "0X" is ignored.
 
 			With [o] sorting is done on the first octal number in
-			the line (after a {pattern} match).
+			the line (after or inside a {pattern} match).
 
 			With [u] only keep the first of a sequence of
 			identical lines (ignoring case when [i] is used).
+			Without this flag, a sequence of identical lines
+			will be kept in their original order.
 			Note that leading and trailing white space may cause
 			lines to be different.
 
-			When /{pattern}/ is specified the text matched with
-			{pattern} is skipped, so that you sort on what comes
-			after the match.  For lines without a match sorting
-			starts in the first column (e.g., for empty lines).
+			When /{pattern}/ is specified and there is no [r] flag
+			the text matched with {pattern} is skipped, so that
+			you sort on what comes after the match.
 			Instead of the slash any non-letter can be used.
 			For example, to sort on the second comma-separated
 			field: >
@@ -1545,7 +1546,21 @@ found here: |sort()|.
 <			To sort on the first number in the line, no matter
 			what is in front of it: >
 				:sort /.*\ze\d/
-<
+
+<			With [r] sorting is done on the matching {pattern}
+			instead of skipping past it as described above.
+			For example, to sort on only the first three letters
+			of each line: >
+				:sort /\a\a\a/ r
+
+<			If a {pattern} is used, any lines which don't have a
+			match for {pattern} are kept in their current order,
+			but separate from the lines which do match {pattern}.
+			If you sorted in reverse, they will be in reverse
+			order after the sorted lines, otherwise they will be
+			in their original order, right before the sorted
+			lines.
+
 Note that using ":sort" with ":global" doesn't sort the matching lines, it's
 quite useless.
 
@@ -1553,8 +1568,8 @@ The details about sorting depend on the library function used.  There is no
 guarantee that sorting is "stable" or obeys the current locale.  You will have
 to try it out.
 
-The sorting itself cannot be interrupted, because of using a system library
-function.  You can interrupt the preparation (for undo) and putting the sorted
-lines into the buffer.  In the last case you may end up with duplicated lines.
+The sorting can be interrupted, but if you interrupt it too late in the
+process you may end up with duplicated lines.  This also depends on the system
+library function used.
 
  vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/index.txt b/runtime/doc/index.txt
index 491f4cab6acd4003e9c6b54e3b65a7e2b6d21a88..848ce0ba796dedbcb8c2190f4f9165bcb2fc2902 100644
--- a/runtime/doc/index.txt
+++ b/runtime/doc/index.txt
@@ -1,4 +1,4 @@
-*index.txt*     For Vim version 7.0d.  Last change: 2006 Apr 06
+*index.txt*     For Vim version 7.0d.  Last change: 2006 Apr 10
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -529,6 +529,7 @@ tag		command		   action in Normal mode	~
 |CTRL-W_P|	CTRL-W P	   go to preview window
 |CTRL-W_R|	CTRL-W R	   rotate windows upwards N times
 |CTRL-W_S|	CTRL-W S	   same as "CTRL-W s"
+|CTRL-W_T|	CTRL-W T	   move current window to a new tab page
 |CTRL-W_W|	CTRL-W W	   go to N previous window (wrap around)
 |CTRL-W_]|	CTRL-W ]	   split window and jump to tag under cursor
 |CTRL-W_^|	CTRL-W ^	   split current window and edit alternate
diff --git a/runtime/doc/insert.txt b/runtime/doc/insert.txt
index 412771de51300aa37b13afb4e7d6c5adf87a035e..ae47469f2188e6efeb347d8574d78be2c848e144 100644
--- a/runtime/doc/insert.txt
+++ b/runtime/doc/insert.txt
@@ -1,4 +1,4 @@
-*insert.txt*    For Vim version 7.0d.  Last change: 2006 Apr 10
+*insert.txt*    For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -1419,8 +1419,8 @@ Features are:
   a tag)
 - when attribute has limited number of possible values help to complete
   them
-- complete names of entities (defined in |xml-omni-datafile| and in current file
-  with "<!ENTITY" declarations
+- complete names of entities (defined in |xml-omni-datafile| and in current
+  file with "<!ENTITY" declarations
 - when used after "</" CTRL-X CTRL-O will close the last opened tag
 
 Format of XML data file					*xml-omni-datafile*
diff --git a/runtime/doc/map.txt b/runtime/doc/map.txt
index 1ee0e40d5ad0d595b6d2df03f42fbc55c4bbe748..49e1faa806a937d925731c38d1af1c1da6b6a9db 100644
--- a/runtime/doc/map.txt
+++ b/runtime/doc/map.txt
@@ -1,4 +1,4 @@
-*map.txt*       For Vim version 7.0d.  Last change: 2006 Mar 20
+*map.txt*       For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -265,6 +265,7 @@ Overview of which map command works in which mode:
 :vmap  :vnoremap  :vunmap  :vmapclear     -         yes             -
 :omap  :onoremap  :ounmap  :omapclear     -          -             yes
 
+:nunmap can also be used outside of a monastery.
                                                 *mapmode-x* *mapmode-s*
 Some commands work both in Visual and Select mode, some in only one.  Note
 that quite often "Visual" is mentioned where both Visual and Select mode
diff --git a/runtime/doc/message.txt b/runtime/doc/message.txt
index 129c43eadfa3d46bf3feffd3277b3d58280bc4f2..790cccf8ffe3adaee2f9a5d03930f2cb54e53d30 100644
--- a/runtime/doc/message.txt
+++ b/runtime/doc/message.txt
@@ -1,4 +1,4 @@
-*message.txt*   For Vim version 7.0d.  Last change: 2006 Mar 01
+*message.txt*   For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -413,7 +413,10 @@ device and it isn't present.  You can ignore this error.
 
 You have used an ":unmap" command with an argument which is not an existing
 mapping.  All variations of this command give the same message: ":cunmap",
-":unmap!", etc.  Check for trailing white space.
+":unmap!", etc.  A few hints:
+- Check for trailing white space.
+- If the mapping is buffer-local you need to use ":unmap <buffer>".
+  |:map-<buffer>|
 
 							*E37* *E89*  >
   No write since last change (use ! to override)
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 7718a584ed8591bee917ca4849ba48fa757d969a..deaf590ae44fb36e9ce2a2ac0939055528e64c2a 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -1,4 +1,4 @@
-*options.txt*	For Vim version 7.0d.  Last change: 2006 Apr 10
+*options.txt*	For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -2068,6 +2068,11 @@ A jump table for the options with a short description can be found at |Q_op|.
 	Highlight the screen column of the cursor with CursorColumn
 	|hl-CursorColumn|.  Useful to align text.  Will make screen redrawing
 	slower.
+	If you only want the highlighting in the current window you can use
+	these autocommands: >
+		au WinLeave * set nocursorline nocursorcolumn
+		au WinEnter * set cursorline cursorcolumn
+<
 
 			*'cursorline'* *'cul'* *'nocursorline'* *'nocul'*
 'cursorline' 'cul'	boolean	(default off)
diff --git a/runtime/doc/pi_zip.txt b/runtime/doc/pi_zip.txt
index eca77df2bfcfd1bfd6c4b96d0f771900f279e8b4..fa4f3b071f313350daf6f7935de74c645f35934a 100644
--- a/runtime/doc/pi_zip.txt
+++ b/runtime/doc/pi_zip.txt
@@ -1,4 +1,4 @@
-*zip.txt*	For Vim version 7.0d.  Last change: 2006 Apr 03
+*zip.txt*	For Vim version 7.0d.  Last change: 2006 Apr 10
 
 				+====================+
 				| Zip File Interface |
@@ -33,6 +33,11 @@ Copyright: Copyright (C) 2005,2006 Charles E Campbell, Jr {{{1 *zip-copyright*
 
 ==============================================================================
 3. History					*zip-history*
+   v8 Apr 10, 2006 * Bram Moolenaar reported that he received an error message
+                     due to "Pattern not found: ^.*\%0c"; this was caused by
+		     stridx finding a Name... at the beginning of the line;
+		     zip.vim tried 4,$s/^.*\%0c//, but that doesn't work.
+		     Fixed.
    v7 Mar 22, 2006 * escaped some characters that can cause filename handling
                      problems.
    v6 Dec 21, 2005 * writing to files not in directories caused problems -
diff --git a/runtime/doc/tags b/runtime/doc/tags
index 4134a1da1d00fb23c712c53a114871d043d7d8cd..7fa442d5aa623d4cb18f71d968cec610f337147c 100644
--- a/runtime/doc/tags
+++ b/runtime/doc/tags
@@ -3188,6 +3188,7 @@ CTRL-W_L	windows.txt	/*CTRL-W_L*
 CTRL-W_P	windows.txt	/*CTRL-W_P*
 CTRL-W_R	windows.txt	/*CTRL-W_R*
 CTRL-W_S	windows.txt	/*CTRL-W_S*
+CTRL-W_T	windows.txt	/*CTRL-W_T*
 CTRL-W_W	windows.txt	/*CTRL-W_W*
 CTRL-W_]	windows.txt	/*CTRL-W_]*
 CTRL-W_^	windows.txt	/*CTRL-W_^*
diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 979988fec686a9372be60d755e5b6b0d0fd420d4..6ca47b61f72ac58f3490779c4641cf93a4769813 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1,4 +1,4 @@
-*todo.txt*      For Vim version 7.0d.  Last change: 2006 Apr 10
+*todo.txt*      For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL	  by Bram Moolenaar
@@ -30,7 +30,11 @@ be worked on, but only if you sponsor Vim development.  See |sponsor|.
 							*known-bugs*
 -------------------- Known bugs and current work -----------------------
 
+Include autoload/xml/*.vim files?  Need to adjust install scripts then.
+
 ":mkspell" still takes much too long in Hungarian dictionary.
+- Are all prefixes really postponed now?
+- postpone secondary suffixes?
 
 Handle postponed prefix with COMPOUNDPERMITFLAG or COMPOUNDFORBIDFLAG.
     WFP_COMPPERMIT and WFP_COMPFORBID
@@ -47,8 +51,14 @@ New Hungarian dictionary. (Laci Nemeth)
     How is it supposed to work?
 -   implement using CHECKCOMPOUNDPATTERN: match words with sl_comppat[].
 
+Update vi_diff.txt for Vim 7 features.
+
+8   tab pages in the session file, if "tabpages" in 'sessionoptions'
+
 Add more tests for all new functionality in Vim 7.  Especially new functions.
 
+Do some of the 'cindent' bugs below.
+
 Win32: Describe how to do debugging. (George Reilly)
 
 Mac unicode patch (Da Woon Jung, Eckehard Berns):
@@ -1092,7 +1102,6 @@ User Friendlier:
 Tab pages:
 9   GUI implementation for the tab pages line for other systems.
 8   Make GUI menu in tab pages line configurable.  Like the popup menu.
-8   tab pages in the session file, if "tabpages" in 'sessionoptions'
 8   :tabmove +N	 move tab page N pages forward
 8   :tabmove -N	 move tab page N pages backward
 7   :tabdup	 duplicate the tab with all its windows.
diff --git a/runtime/doc/version7.txt b/runtime/doc/version7.txt
index a0758a69e6caae0d5fceabf05c063eec3b69f1d0..4afaaeb49a72b9c4b547294fecd2598ba767130a 100644
--- a/runtime/doc/version7.txt
+++ b/runtime/doc/version7.txt
@@ -1,4 +1,4 @@
-*version7.txt*  For Vim version 7.0d.  Last change: 2006 Apr 10
+*version7.txt*  For Vim version 7.0d.  Last change: 2006 Apr 11
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -628,7 +628,7 @@ Win32: The ":winpos" command now also works in the console. (Vipin Aravind)
 |:viusage|		Help for Vi commands (Nvi command).
 
 |:sort|			Sort lines in the buffer without depending on an
-			external command.
+			external command. (partly by Bryce Wagner)
 
 |:caddfile|		Add error messages to an existing quickfix list
 			(Yegappan Lakshmanan).
@@ -913,6 +913,7 @@ Haskell ftplugin file. (Nikolai Weibull)
 help ftplugin file. (Nikolai Weibull)
 indent ftplugin file. (Nikolai Weibull)
 Javascript ftplugin file. (Bram Moolenaar)
+Kconfig ftplugin and syntax file. (Nikolai Weibull)
 ld syntax, indent and ftplugin file. (Nikolai Weibull)
 lftp ftplugin file. (Nikolai Weibull)
 libao config ftplugin file. (Nikolai Weibull)
@@ -2420,4 +2421,26 @@ Now use Enter to select the match after using a cursor key.
 
 Added "usetab" to 'switchbuf'.
 
+
+--- fixes and changes since Vim 7.0d ---
+
+Added CTRL-W T: move a window to a new tab page.
+
+Using CTRL-X s in Insert mode to complete spelling suggestions and using BS
+deleted characters before the bad word.
+
+A few small fixes for the VMS makefile. (Zoltan Arpadffy)
+
+With a window of 91 lines 45 cols, ":vsp" scrolled the window.  Copy w_wrow
+when splitting a window and skip setting the height when it's already at the
+right value.
+
+Using <silent> in a mapping with a shell command and the GUI caused redraw
+to use wrong attributes.
+
+Win32: Using MSVC 4.1 for install.exe resulted in the start menu items to be
+created in the administrator directory instead of "All Users".  Define the
+CSIDL_ items if they are missing.
+
+
  vim:tw=78:ts=8:ft=help:norl:
diff --git a/runtime/doc/vim-fr.1 b/runtime/doc/vim-fr.1
index 956c1208fafc894213668cbd6c9538bfd77ecb31..820985715d439f69a0b9cfce89c33886dbf252d9 100644
--- a/runtime/doc/vim-fr.1
+++ b/runtime/doc/vim-fr.1
@@ -1,7 +1,7 @@
 .\" Traduction Lundi 7 août 2000 par Richard Hitier
 .\" (richard.hitier@dial.oleane.com)
 .\" Mise ā jour de la traduction par David Blanchet
-.\" (david.blanchet@free.fr) 2005-01-17
+.\" (david.blanchet@free.fr) 2006-06-10
 .\"
 .TH VIM 1 "22 Février 2002"
 .SH NOM
@@ -325,6 +325,10 @@ Quand N est omis, ouvre une fen
 Ouvre N fenętres côte ā côte.
 Quand N est omis, ouvre une fenętre pour chaque fichier fichier.
 .TP
+\-p[N]
+Ouvre N onglets.
+Quand N est omis, ouvre un onglet pour chaque fichier fichier.
+.TP
 \-R
 Mode Lecture-Seule.
 Active l'option 'readonly'.
@@ -579,4 +583,4 @@ Cette page de manuel a 
 <richard.hitier@dial.oleane.com> 2000-08-07.
 .br
 Cette page de manuel a été mise ā jour par David Blanchet.
-<david.blanchet@free.fr> 2005-01-17.
+<david.blanchet@free.fr> 2006-04-10.
diff --git a/runtime/doc/vim-fr.UTF-8.1 b/runtime/doc/vim-fr.UTF-8.1
index d9b7cf43803964295c66adcf7d6d03766b79e39c..a21ad06659a8fe0cda55ad6e380610a84a4a3b15 100644
--- a/runtime/doc/vim-fr.UTF-8.1
+++ b/runtime/doc/vim-fr.UTF-8.1
@@ -1,7 +1,7 @@
 .\" Traduction Lundi 7 aoÃŧt 2000 par Richard Hitier
 .\" (richard.hitier@dial.oleane.com)
 .\" Mise à jour de la traduction par David Blanchet
-.\" (david.blanchet@free.fr) 2005-01-17
+.\" (david.blanchet@free.fr) 2006-06-10
 .\"
 .TH VIM 1 "22 FÃĐvrier 2002"
 .SH NOM
@@ -325,6 +325,10 @@ Quand N est omis, ouvre une fenÊtre pour chaque fichier.
 Ouvre N fenÊtres cÃīte à cÃīte.
 Quand N est omis, ouvre une fenÊtre pour chaque fichier fichier.
 .TP
+\-p[N]
+Ouvre N onglets.
+Quand N est omis, ouvre un onglet pour chaque fichier fichier.
+.TP
 \-R
 Mode Lecture-Seule.
 Active l'option 'readonly'.
@@ -579,4 +583,4 @@ Cette page de manuel a ÃĐtÃĐ traduite par Richard Hitier.
 <richard.hitier@dial.oleane.com> 2000-08-07.
 .br
 Cette page de manuel a ÃĐtÃĐ mise à jour par David Blanchet.
-<david.blanchet@free.fr> 2005-01-17.
+<david.blanchet@free.fr> 2006-04-10.
diff --git a/runtime/doc/vim.1 b/runtime/doc/vim.1
index cdf71ac3bdae6d6b1f4224d2ac9a83a84ac87e41..4e90da276040c079692e6da372458c1051d4ed33 100644
--- a/runtime/doc/vim.1
+++ b/runtime/doc/vim.1
@@ -1,4 +1,4 @@
-.TH VIM 1 "2002 Feb 22"
+.TH VIM 1 "2006 Apr 11"
 .SH NAME
 vim \- Vi IMproved, a programmers text editor
 .SH SYNOPSIS
diff --git a/runtime/doc/vim.man b/runtime/doc/vim.man
index 9b70e7f96f2893c6f0136cff3b5472df706715e4..fa5c5c855ff1bfcee9668cc74d575688581f4629 100644
--- a/runtime/doc/vim.man
+++ b/runtime/doc/vim.man
@@ -425,4 +425,4 @@ BUGS
 
 
 
-                                  2002 Feb 22                           VIM(1)
+                                  2006 Apr 11                           VIM(1)
diff --git a/runtime/doc/windows.txt b/runtime/doc/windows.txt
index c4aeb87d5019bcdd0052e61cb0e59b4812401745..499b6caf4447766b415cec1843e27e9943527411 100644
--- a/runtime/doc/windows.txt
+++ b/runtime/doc/windows.txt
@@ -1,4 +1,4 @@
-*windows.txt*   For Vim version 7.0d.  Last change: 2006 Apr 06
+*windows.txt*   For Vim version 7.0d.  Last change: 2006 Apr 10
 
 
 		  VIM REFERENCE MANUAL    by Bram Moolenaar
@@ -434,6 +434,13 @@ CTRL-W L	Move the current window to be at the far right, using the full
 		contents is used for the new window.
 		{not available when compiled without the +vertsplit feature}
 
+						*CTRL-W_T*
+CTRL-W T	Move the current window to a new tab page.  This fails if
+		there is only one window in the current tab page.
+		When a count is specified the new tab page will be opened
+		before the tab page with this index.  Otherwise it comes after
+		the current tab page.
+
 ==============================================================================
 6. Window resizing					*window-resize*
 
diff --git a/runtime/filetype.vim b/runtime/filetype.vim
index 8d1f155eb3f86235f524da8426f6a37ad0f21164..3aa1ee79ce37d030d983a511daae79c478432f95 100644
--- a/runtime/filetype.vim
+++ b/runtime/filetype.vim
@@ -1,7 +1,7 @@
 " Vim support file to detect file types
 "
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2006 Apr 04
+" Last Change:	2006 Apr 11
 
 " Listen very carefully, I will say this only once
 if exists("did_load_filetypes")
@@ -784,6 +784,9 @@ au BufNewFile,BufRead *.k			setf kwt
 " KDE script
 au BufNewFile,BufRead *.ks			setf kscript
 
+" Kconfig
+au BufNewFile,BufRead Kconfig,Kconfig.debug	setf kconfig
+
 " Lace (ISE)
 au BufNewFile,BufRead *.ace,*.ACE		setf lace
 
@@ -1662,13 +1665,25 @@ au BufNewFile,BufRead /etc/sysctl.conf		setf sysctl
 " Sudoers
 au BufNewFile,BufRead /etc/sudoers,sudoers.tmp	setf sudoers
 
+" If the file has an extension of 't' and is in a directory 't' then it is
+" almost certainly a Perl test file.
 " If the first line starts with '#' and contains 'perl' it's probably a Perl
 " file.
+" (Slow test) If a file contains a 'use' statement then it is almost certainly
+" a Perl file.
 fun! s:FTperl()
+  if expand("%:e") == 't' && expand("%:p:h:t") == 't'
+    setf perl
+    return 1
+  endif
   if getline(1)[0] == '#' && getline(1) =~ 'perl'
     setf perl
     return 1
   endif
+  if search('^use\s\s*\k', 'nc', 30)
+    setf perl
+    return 1
+  endif
   return 0
 endfun
 
@@ -1961,7 +1976,7 @@ au BufNewFile,BufRead *.yaml,*.yml		setf yaml
 " Zope
 "   dtml (zope dynamic template markup language), pt (zope page template),
 "   cpt (zope form controller page template)
-au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call <SID>FTCheck_html()
+au BufNewFile,BufRead *.dtml,*.pt,*.cpt		call s:FThtml()
 "   zsql (zope sql method)
 au BufNewFile,BufRead *.zsql			call s:SQL()
 
diff --git a/runtime/ftplugin/kconfig.vim b/runtime/ftplugin/kconfig.vim
new file mode 100644
index 0000000000000000000000000000000000000000..ca1a56b8eb3bcd4bb7fac3a3fbbb473dca8e898e
--- /dev/null
+++ b/runtime/ftplugin/kconfig.vim
@@ -0,0 +1,14 @@
+" Vim filetype plugin file
+" Maintainer:       Nikolai Weibull <now@bitwi.se>
+" Latest Revision:  2006-04-10
+
+if exists("b:did_ftplugin")
+  finish
+endif
+let b:did_ftplugin = 1
+
+let b:undo_ftplugin = "setl com< cms< fo<"
+
+setlocal comments=:# commentstring=#\ %s formatoptions-=t formatoptions+=croql
+
+
diff --git a/runtime/ftplugin/ocaml.vim b/runtime/ftplugin/ocaml.vim
index 6f2b17cb7e03f8c93374085154716fa94829afc7..0b9819a9b6e0ceaa47229d7ec4ec5ab8ce352461 100644
--- a/runtime/ftplugin/ocaml.vim
+++ b/runtime/ftplugin/ocaml.vim
@@ -4,11 +4,12 @@
 "              Markus Mottl        <markus.mottl@gmail.com>
 "              Stefano Zacchiroli  <zack@bononia.it>
 " URL:         http://www.ocaml.info/vim/ftplugin/ocaml.vim
-" Last Change: 2006 Feb 05
+" Last Change: 2006 Apr 11 - Fixed an initialization bug; fixed ASS abbrev (MM)
+"              2005 Oct 13 - removed GPL; better matchit support (MM, SZ)
 "
-" if exists("b:did_ftplugin")
-"   finish
-" endif
+if exists("b:did_ftplugin")
+  finish
+endif
 let b:did_ftplugin=1
 
 " Error handling -- helps moving where the compiler wants you to go
@@ -44,7 +45,7 @@ if !exists("no_plugin_maps") && !exists("no_ocaml_maps")
   vnoremap <buffer> <Plug>BUncomOff <ESC>:'<,'><CR>`<dd`>dd`<
 
   if !hasmapto('<Plug>Abbrev')
-    iabbrev <buffer> ASS (assert false (* XXX *))
+    iabbrev <buffer> ASS (assert (0=1) (* XXX *))
   endif
 endif
 
diff --git a/runtime/indent/html.vim b/runtime/indent/html.vim
index d78da193b8089750accb23a02daa38a9eb273635..6c2d49942fd97296232056ec5e1323d674ed5555 100644
--- a/runtime/indent/html.vim
+++ b/runtime/indent/html.vim
@@ -1,8 +1,8 @@
 " Description:	html indenter
 " Author:	Johannes Zellner <johannes@zellner.org>
 " Last Change:	Tue, 27 Apr 2004 10:28:39 CEST
-" Globals:	g:html_indent_tags	   -- indenting tags
-"		g:html_indent_strict	   -- inhibit 'O O' elements
+" Globals:	g:html_indent_tags         -- indenting tags
+"		g:html_indent_strict       -- inhibit 'O O' elements
 "		g:html_indent_strict_table -- inhibit 'O -' elements
 
 " Only load this indent file when no other was loaded.
@@ -14,7 +14,7 @@ let b:did_indent = 1
 
 " [-- local settings (must come before aborting the script) --]
 setlocal indentexpr=HtmlIndentGet(v:lnum)
-setlocal indentkeys=o,O,*<Return>,<>>,<bs>,{,}
+setlocal indentkeys=o,O,*<Return>,<>>,{,}
 
 
 if exists('g:html_indent_tags')
diff --git a/runtime/makemenu.vim b/runtime/makemenu.vim
index 02905c95e32de5647dc813b48937b88d3dbe5249..9194e9f0ffee24475b2864403f9db054bb92361f 100644
--- a/runtime/makemenu.vim
+++ b/runtime/makemenu.vim
@@ -1,6 +1,6 @@
 " Script to define the syntax menu in synmenu.vim
 " Maintainer:	Bram Moolenaar <Bram@vim.org>
-" Last Change:	2006 Apr 10
+" Last Change:	2006 Apr 11
 
 " This is used by "make menu" in the src directory.
 edit <sfile>:p:h/synmenu.vim
@@ -237,6 +237,7 @@ SynMenu HIJK.Java.Java\ Properties:jproperties
 SynMenu HIJK.JavaScript:javascript
 SynMenu HIJK.Jess:jess
 SynMenu HIJK.Jgraph:jgraph
+SynMenu HIJK.Kconfig:kconfig
 SynMenu HIJK.KDE\ script:kscript
 SynMenu HIJK.Kimwitu++:kwt
 SynMenu HIJK.KixTart:kix
diff --git a/runtime/synmenu.vim b/runtime/synmenu.vim
index e7aec094793bfb7d9b98ba0ae86b03e82266c910..1bda521002124da99c13591309dfd72f99173ea9 100644
--- a/runtime/synmenu.vim
+++ b/runtime/synmenu.vim
@@ -213,9 +213,10 @@ an 50.50.440 &Syntax.HIJK.Java.Java\ Properties :cal SetSyn("jproperties")<CR>
 an 50.50.450 &Syntax.HIJK.JavaScript :cal SetSyn("javascript")<CR>
 an 50.50.460 &Syntax.HIJK.Jess :cal SetSyn("jess")<CR>
 an 50.50.470 &Syntax.HIJK.Jgraph :cal SetSyn("jgraph")<CR>
-an 50.50.490 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
-an 50.50.500 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
-an 50.50.510 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
+an 50.50.490 &Syntax.HIJK.Kconfig :cal SetSyn("kconfig")<CR>
+an 50.50.500 &Syntax.HIJK.KDE\ script :cal SetSyn("kscript")<CR>
+an 50.50.510 &Syntax.HIJK.Kimwitu++ :cal SetSyn("kwt")<CR>
+an 50.50.520 &Syntax.HIJK.KixTart :cal SetSyn("kix")<CR>
 an 50.60.100 &Syntax.L-Ma.Lace :cal SetSyn("lace")<CR>
 an 50.60.110 &Syntax.L-Ma.LamdaProlog :cal SetSyn("lprolog")<CR>
 an 50.60.120 &Syntax.L-Ma.Latte :cal SetSyn("latte")<CR>
diff --git a/runtime/syntax/cl.vim b/runtime/syntax/cl.vim
index 3c6f41ba826dc0ab92b9b1b63b3b6d06adb17d04..30308e12a72669aecfdca98a59ffbfac7eb19892 100644
--- a/runtime/syntax/cl.vim
+++ b/runtime/syntax/cl.vim
@@ -1,8 +1,9 @@
 " Vim syntax file
 " Language:	cl ("Clever Language" by Multibase, http://www.mbase.com.au)
 " Filename extensions: *.ent, *.eni
-" Maintainer:	Philip Uren <philu@system77.com>
-" Last update:	Wed May  2 10:30:30 EST 2001
+" Maintainer:	Philip Uren <philuSPAX@ieee.org> - Remove SPAX spam block
+" Last update:	Tue Apr 11 10:19:01 EST 2006
+" $Id$
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
@@ -28,12 +29,15 @@ syn match   clifError		"\<elsif\>"
 syn match   clifError		"\<else\>"
 syn match   clifError		"\<endif\>"
 
+syn match   clSpaceError	"\s\+$"
+
 " If and while regions
 syn region clLoop	transparent matchgroup=clWhile start="\<while\>" matchgroup=clWhile end="\<wend\>" contains=ALLBUT,clBreak,clProcedure
 syn region clIf		transparent matchgroup=clConditional start="\<if\>" matchgroup=clConditional end="\<endif\>"   contains=ALLBUT,clBreak,clProcedure
 
 " Make those TODO notes and debugging stand out!
 syn keyword	clTodo			contained	TODO BUG DEBUG FIX
+syn match	clNeedsWork		contained	"NEED[S]*\s\s*WORK"
 syn keyword clDebug			contained	debug
 
 syn match	clComment		"#.*$"		contains=clTodo,clNeedsWork
@@ -77,6 +81,7 @@ if	version >= 508 || !exists("did_cl_syntax_inits")
 	endif
 
 	HiLink clifError			Error
+	HiLink clSpaceError			Error
 	HiLink clWhile				Repeat
 	HiLink clConditional		Conditional
 	HiLink clDebug				Debug
diff --git a/runtime/syntax/dtd.vim b/runtime/syntax/dtd.vim
index 0f80e199c0169006be0daae7f57f3712594f59dc..76778ba881321081db3bd906f232358f6817e13c 100644
--- a/runtime/syntax/dtd.vim
+++ b/runtime/syntax/dtd.vim
@@ -52,11 +52,11 @@ endif
 
 " if this is a html like comment hightlight also
 " the opening <! and the closing > as Comment.
-syn region dtdComment		start=+<![ \t]*--+ end=+-->+ contains=dtdTodo
+syn region dtdComment		start=+<![ \t]*--+ end=+-->+ contains=dtdTodo,@Spell
 
 
 " proper DTD comment
-syn region dtdComment contained start=+--+ end=+--+ contains=dtdTodo
+syn region dtdComment contained start=+--+ end=+--+ contains=dtdTodo,@Spell
 
 
 " Start tags (keywords). This is contained in dtdFunction.
diff --git a/runtime/syntax/kconfig.vim b/runtime/syntax/kconfig.vim
new file mode 100644
index 0000000000000000000000000000000000000000..f7910144bc1bb9e21f8acf2927b742be4dd91c0c
--- /dev/null
+++ b/runtime/syntax/kconfig.vim
@@ -0,0 +1,728 @@
+" Vim syntax file
+" Maintainer:       Nikolai Weibull <now@bitwi.se>
+" Latest Revision:  2006-04-11
+
+if exists("b:current_syntax")
+  finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+if exists("g:kconfig_syntax_heavy")
+
+syn match   kconfigBegin              '^' nextgroup=kconfigKeyword
+                                      \ skipwhite
+
+syn keyword kconfigTodo               contained TODO FIXME XXX NOTE
+
+syn match   kconfigComment            display '#.*$' contains=kconfigTodo
+
+syn keyword kconfigKeyword            config nextgroup=kconfigSymbol
+                                      \ skipwhite
+
+syn keyword kconfigKeyword            menuconfig nextgroup=kconfigSymbol
+                                      \ skipwhite
+
+syn keyword kconfigKeyword            comment menu mainmenu
+                                      \ nextgroup=kconfigKeywordPrompt
+                                      \ skipwhite
+
+syn keyword kconfigKeyword            choice
+                                      \ nextgroup=@kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn keyword kconfigKeyword            endmenu endchoice
+
+syn keyword kconfigPreProc            source
+                                      \ nextgroup=kconfigPath
+                                      \ skipwhite
+
+" TODO: This is a hack.  The who .*Expr stuff should really be generated so
+" that we can reuse it for various nextgroups.
+syn keyword kconfigConditional        if endif
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn match   kconfigKeywordPrompt      '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigPath               '"[^"\\]*\%(\\.[^"\\]*\)*"\|\S\+'
+                                      \ contained
+
+syn match   kconfigSymbol             '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+" FIXME: There is – probably – no reason to cluster these instead of just
+" defining them in the same group.
+syn cluster kconfigConfigOptions      contains=kconfigTypeDefinition,
+                                      \        kconfigInputPrompt,
+                                      \        kconfigDefaultValue,
+                                      \        kconfigDependencies,
+                                      \        kconfigReverseDependencies,
+                                      \        kconfigNumericalRanges,
+                                      \        kconfigHelpText,
+                                      \        kconfigDefBool,
+                                      \        kconfigOptional
+
+syn keyword kconfigTypeDefinition     bool boolean tristate string hex int
+                                      \ contained
+                                      \ nextgroup=kconfigTypeDefPrompt,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigTypeDefPrompt      '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigTypeDefPrompt      "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn keyword kconfigInputPrompt        prompt
+                                      \ contained
+                                      \ nextgroup=kconfigPromptPrompt
+                                      \ skipwhite
+
+syn match   kconfigPromptPrompt       '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigPromptPrompt       "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn keyword   kconfigDefaultValue     default
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionExpr
+                                      \ skipwhite
+
+syn match   kconfigDependencies       'depends on\|requires'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn keyword kconfigReverseDependencies select
+                                      \ contained
+                                      \ nextgroup=@kconfigRevDepSymbol
+                                      \ skipwhite
+
+syn cluster kconfigRevDepSymbol       contains=kconfigRevDepCSymbol,
+                                      \        kconfigRevDepNCSymbol
+
+syn match   kconfigRevDepCSymbol      '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigRevDepCSymbol      "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigRevDepNCSymbol     '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn keyword kconfigNumericalRanges    range
+                                      \ contained
+                                      \ nextgroup=@kconfigRangeSymbol
+                                      \ skipwhite
+
+syn cluster kconfigRangeSymbol        contains=kconfigRangeCSymbol,
+                                      \        kconfigRangeNCSymbol
+
+syn match   kconfigRangeCSymbol       '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=@kconfigRangeSymbol2
+                                      \ skipwhite skipnl
+
+syn match   kconfigRangeCSymbol       "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=@kconfigRangeSymbol2
+                                      \ skipwhite skipnl
+
+syn match   kconfigRangeNCSymbol      '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=@kconfigRangeSymbol2
+                                      \ skipwhite skipnl
+
+syn cluster kconfigRangeSymbol2       contains=kconfigRangeCSymbol2,
+                                      \        kconfigRangeNCSymbol2
+
+syn match   kconfigRangeCSymbol2      "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigRangeNCSymbol2     '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn region  kconfigHelpText           contained
+      \ matchgroup=kconfigConfigOption
+      \ start='\%(help\|---help---\)\s*\n\ze\z(\s\+\)'
+      \ skip='^$'
+      \ end='^\z1\@!'
+      \ nextgroup=@kconfigConfigOptions
+      \ skipwhite skipnl
+
+" XXX: Undocumented
+syn keyword kconfigDefBool            def_bool
+                                      \ contained
+                                      \ nextgroup=@kconfigDefBoolSymbol
+                                      \ skipwhite
+
+syn cluster kconfigDefBoolSymbol      contains=kconfigDefBoolCSymbol,
+                                      \        kconfigDefBoolNCSymbol
+
+syn match   kconfigDefBoolCSymbol     '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigDefBoolCSymbol     "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigDefBoolNCSymbol    '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+" XXX: This is actually only a valid option for “choice”, but treating it
+" specially would require a lot of extra groups.
+syn keyword kconfigOptional           optional
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn keyword kconfigConfigOptionIf     if
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn cluster kconfigConfigOptionIfExpr contains=@kconfigConfOptIfExprSym,
+                                      \        kconfigConfOptIfExprNeg,
+                                      \        kconfigConfOptIfExprGroup
+
+syn cluster kconfigConfOptIfExprSym   contains=kconfigConfOptIfExprCSym,
+                                      \        kconfigConfOptIfExprNCSym
+
+syn match   kconfigConfOptIfExprCSym  '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr,
+                                      \           kconfigConfOptIfExprEq,
+                                      \           kconfigConfOptIfExprNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfExprCSym  "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr,
+                                      \           kconfigConfOptIfExprEq,
+                                      \           kconfigConfOptIfExprNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfExprNCSym '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr,
+                                      \           kconfigConfOptIfExprEq,
+                                      \           kconfigConfOptIfExprNEq
+                                      \ skipwhite skipnl
+
+syn cluster kconfigConfOptIfExprSym2  contains=kconfigConfOptIfExprCSym2,
+                                      \        kconfigConfOptIfExprNCSym2
+
+syn match   kconfigConfOptIfExprEq    '='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptIfExprSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprNEq   '!='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptIfExprSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfExprNCSym2 '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfExprNeg   '!'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprAnd   '&&'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprOr    '||'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprGroup '('
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfGExp
+                                      \ skipwhite
+
+" TODO: hm, this kind of recursion doesn't work right.  We need another set of
+" expressions that have kconfigConfigOPtionIfGExp as nextgroup and a matcher
+" for '(' that sets it all off.
+syn cluster kconfigConfigOptionIfGExp contains=@kconfigConfOptIfGExpSym,
+                                      \        kconfigConfOptIfGExpNeg,
+                                      \        kconfigConfOptIfExprGroup
+
+syn cluster kconfigConfOptIfGExpSym   contains=kconfigConfOptIfGExpCSym,
+                                      \        kconfigConfOptIfGExpNCSym
+
+syn match   kconfigConfOptIfGExpCSym  '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigIf,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr,
+                                      \           kconfigConfOptIfGExpEq,
+                                      \           kconfigConfOptIfGExpNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfGExpCSym  "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigIf,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr,
+                                      \           kconfigConfOptIfGExpEq,
+                                      \           kconfigConfOptIfGExpNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfGExpNCSym '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptIfExprGrpE,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr,
+                                      \           kconfigConfOptIfGExpEq,
+                                      \           kconfigConfOptIfGExpNEq
+                                      \ skipwhite skipnl
+
+syn cluster kconfigConfOptIfGExpSym2  contains=kconfigConfOptIfGExpCSym2,
+                                      \        kconfigConfOptIfGExpNCSym2
+
+syn match   kconfigConfOptIfGExpEq    '='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptIfGExpSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfGExpNEq   '!='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptIfGExpSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfGExpCSym2 '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptIfExprGrpE,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfGExpCSym2 "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptIfExprGrpE,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfGExpNCSym2 '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptIfExprGrpE,
+                                      \           kconfigConfOptIfGExpAnd,
+                                      \           kconfigConfOptIfGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptIfGExpNeg   '!'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfGExpAnd   '&&'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfGExpOr    '||'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionIfGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptIfExprGrpE  ')'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptions,
+                                      \           kconfigConfOptIfExprAnd,
+                                      \           kconfigConfOptIfExprOr
+                                      \ skipwhite skipnl
+
+
+syn cluster kconfigConfigOptionExpr   contains=@kconfigConfOptExprSym,
+                                      \        kconfigConfOptExprNeg,
+                                      \        kconfigConfOptExprGroup
+
+syn cluster kconfigConfOptExprSym     contains=kconfigConfOptExprCSym,
+                                      \        kconfigConfOptExprNCSym
+
+syn match   kconfigConfOptExprCSym    '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           kconfigConfOptExprEq,
+                                      \           kconfigConfOptExprNEq,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptExprCSym    "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           kconfigConfOptExprEq,
+                                      \           kconfigConfOptExprNEq,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptExprNCSym   '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           kconfigConfOptExprEq,
+                                      \           kconfigConfOptExprNEq,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn cluster kconfigConfOptExprSym2    contains=kconfigConfOptExprCSym2,
+                                      \        kconfigConfOptExprNCSym2
+
+syn match   kconfigConfOptExprEq      '='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptExprSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprNEq     '!='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptExprSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprCSym2   '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptExprCSym2   "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptExprNCSym2  '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr,
+                                      \           @kconfigConfigOptions
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptExprNeg     '!'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprAnd     '&&'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprOr      '||'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionExpr
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprGroup   '('
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionGExp
+                                      \ skipwhite
+
+syn cluster kconfigConfigOptionGExp   contains=@kconfigConfOptGExpSym,
+                                      \        kconfigConfOptGExpNeg,
+                                      \        kconfigConfOptGExpGroup
+
+syn cluster kconfigConfOptGExpSym     contains=kconfigConfOptGExpCSym,
+                                      \        kconfigConfOptGExpNCSym
+
+syn match   kconfigConfOptGExpCSym    '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr,
+                                      \           kconfigConfOptGExpEq,
+                                      \           kconfigConfOptGExpNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptGExpCSym    "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr,
+                                      \           kconfigConfOptGExpEq,
+                                      \           kconfigConfOptGExpNEq
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptGExpNCSym   '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr,
+                                      \           kconfigConfOptGExpEq,
+                                      \           kconfigConfOptGExpNEq
+                                      \ skipwhite skipnl
+
+syn cluster kconfigConfOptGExpSym2    contains=kconfigConfOptGExpCSym2,
+                                      \        kconfigConfOptGExpNCSym2
+
+syn match   kconfigConfOptGExpEq      '='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptGExpSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptGExpNEq     '!='
+                                      \ contained
+                                      \ nextgroup=@kconfigConfOptGExpSym2
+                                      \ skipwhite
+
+syn match   kconfigConfOptGExpCSym2   '"[^"\\]*\%(\\.[^"\\]*\)*"'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptGExpCSym2   "'[^'\\]*\%(\\.[^'\\]*\)*'"
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptGExpNCSym2  '\<\k\+\>'
+                                      \ contained
+                                      \ nextgroup=kconfigConfOptExprGrpE,
+                                      \           kconfigConfOptGExpAnd,
+                                      \           kconfigConfOptGExpOr
+                                      \ skipwhite skipnl
+
+syn match   kconfigConfOptGExpNeg     '!'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptGExpAnd     '&&'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptGExpOr      '||'
+                                      \ contained
+                                      \ nextgroup=@kconfigConfigOptionGExp
+                                      \ skipwhite
+
+syn match   kconfigConfOptExprGrpE    ')'
+                                      \ contained
+                                      \ nextgroup=kconfigConfigOptionIf,
+                                      \           kconfigConfOptExprAnd,
+                                      \           kconfigConfOptExprOr
+                                      \ skipwhite skipnl
+
+hi def link kconfigTodo                 Todo
+hi def link kconfigComment              Comment
+hi def link kconfigKeyword              Keyword
+hi def link kconfigPreProc              PreProc
+hi def link kconfigConditional          Conditional
+hi def link kconfigPrompt               String
+hi def link kconfigKeywordPrompt        kconfigPrompt
+hi def link kconfigPath                 String
+hi def link kconfigSymbol               String
+hi def link kconfigConstantSymbol       Constant
+hi def link kconfigConfigOption         Type
+hi def link kconfigTypeDefinition       kconfigConfigOption
+hi def link kconfigTypeDefPrompt        kconfigPrompt
+hi def link kconfigInputPrompt          kconfigConfigOption
+hi def link kconfigPromptPrompt         kconfigPrompt
+hi def link kconfigDefaultValue         kconfigConfigOption
+hi def link kconfigDependencies         kconfigConfigOption
+hi def link kconfigReverseDependencies  kconfigConfigOption
+hi def link kconfigRevDepCSymbol        kconfigConstantSymbol
+hi def link kconfigRevDepNCSymbol       kconfigSymbol
+hi def link kconfigNumericalRanges      kconfigConfigOption
+hi def link kconfigRangeCSymbol         kconfigConstantSymbol
+hi def link kconfigRangeNCSymbol        kconfigSymbol
+hi def link kconfigRangeCSymbol2        kconfigConstantSymbol
+hi def link kconfigRangeNCSymbol2       kconfigSymbol
+hi def link kconfigHelpText             Normal
+hi def link kconfigDefBool              kconfigConfigOption
+hi def link kconfigDefBoolCSymbol       kconfigConstantSymbol
+hi def link kconfigDefBoolNCSymbol      kconfigSymbol
+hi def link kconfigOptional             kconfigConfigOption
+hi def link kconfigConfigOptionIf       Conditional
+hi def link kconfigConfOptIfExprCSym    kconfigConstantSymbol
+hi def link kconfigConfOptIfExprNCSym   kconfigSymbol
+hi def link kconfigOperator             Operator
+hi def link kconfigConfOptIfExprEq      kconfigOperator
+hi def link kconfigConfOptIfExprNEq     kconfigOperator
+hi def link kconfigConfOptIfExprCSym2   kconfigConstantSymbol
+hi def link kconfigConfOptIfExprNCSym2  kconfigSymbol
+hi def link kconfigConfOptIfExprNeg     kconfigOperator
+hi def link kconfigConfOptIfExprAnd     kconfigOperator
+hi def link kconfigConfOptIfExprOr      kconfigOperator
+hi def link kconfigDelimiter            Delimiter
+hi def link kconfigConfOptIfExprGroup   kconfigDelimiter
+hi def link kconfigConfOptIfGExpCSym    kconfigConstantSymbol
+hi def link kconfigConfOptIfGExpNCSym   kconfigSymbol
+hi def link kconfigConfOptIfGExpEq      kconfigOperator
+hi def link kconfigConfOptIfGExpNEq     kconfigOperator
+hi def link kconfigConfOptIfGExpCSym2   kconfigConstantSymbol
+hi def link kconfigConfOptIfGExpNCSym2  kconfigSymbol
+hi def link kconfigConfOptIfGExpNeg     kconfigOperator
+hi def link kconfigConfOptIfGExpAnd     kconfigOperator
+hi def link kconfigConfOptIfGExpOr      kconfigOperator
+hi def link kconfigConfOptIfExprGrpE    kconfigDelimiter
+hi def link kconfigConfOptExprCSym      kconfigConstantSymbol
+hi def link kconfigConfOptExprNCSym     kconfigSymbol
+hi def link kconfigConfOptExprEq        kconfigOperator
+hi def link kconfigConfOptExprNEq       kconfigOperator
+hi def link kconfigConfOptExprCSym2     kconfigConstantSymbol
+hi def link kconfigConfOptExprNCSym2    kconfigSymbol
+hi def link kconfigConfOptExprNeg       kconfigOperator
+hi def link kconfigConfOptExprAnd       kconfigOperator
+hi def link kconfigConfOptExprOr        kconfigOperator
+hi def link kconfigConfOptExprGroup     kconfigDelimiter
+hi def link kconfigConfOptGExpCSym      kconfigConstantSymbol
+hi def link kconfigConfOptGExpNCSym     kconfigSymbol
+hi def link kconfigConfOptGExpEq        kconfigOperator
+hi def link kconfigConfOptGExpNEq       kconfigOperator
+hi def link kconfigConfOptGExpCSym2     kconfigConstantSymbol
+hi def link kconfigConfOptGExpNCSym2    kconfigSymbol
+hi def link kconfigConfOptGExpNeg       kconfigOperator
+hi def link kconfigConfOptGExpAnd       kconfigOperator
+hi def link kconfigConfOptGExpOr        kconfigOperator
+hi def link kconfigConfOptExprGrpE      kconfigConfOptIfExprGroup
+
+else
+
+syn keyword kconfigTodo               contained TODO FIXME XXX NOTE
+
+syn match   kconfigComment            display '#.*$' contains=kconfigTodo
+
+syn keyword kconfigKeyword            config menuconfig comment menu mainmenu
+
+syn keyword kconfigConditional        choice endchoice if endif
+
+syn keyword kconfigPreProc            source
+                                      \ nextgroup=kconfigPath
+                                      \ skipwhite
+
+syn match   kconfigSpecialChar        contained '\\.'
+
+syn region  kconfigPath               matchgroup=kconfigPath
+                                      \ start=+"+ skip=+\\\\\|\\\"+ end=+"+
+                                      \ contains=kconfigSpecialChar
+
+syn region  kconfigPath               matchgroup=kconfigPath
+                                      \ start=+'+ skip=+\\\\\|\\\'+ end=+'+
+                                      \ contains=kconfigSpecialChar
+
+syn match   kconfigPath               '\S\+'
+                                      \ contained
+
+syn region  kconfigString             matchgroup=kconfigString
+                                      \ start=+"+ skip=+\\\\\|\\\"+ end=+"+
+                                      \ contains=kconfigSpecialChar
+
+syn region  kconfigString             matchgroup=kconfigString
+                                      \ start=+'+ skip=+\\\\\|\\\'+ end=+'+
+                                      \ contains=kconfigSpecialChar
+
+syn keyword kconfigType               bool boolean tristate string hex int
+
+syn keyword kconfigOption             prompt default requires select range
+                                      \ optional
+syn match   kconfigOption             'depends\%( on\)'
+
+syn keyword kconfigMacro              def_bool def_tristate
+
+syn region  kconfigHelpText           contained
+      \ matchgroup=kconfigConfigOption
+      \ start='\%(help\|---help---\)\s*\n\ze\z(\s\+\)'
+      \ skip='^$'
+      \ end='^\z1\@!'
+
+hi def link kconfigTodo         Todo
+hi def link kconfigComment      Comment
+hi def link kconfigKeyword      Keyword
+hi def link kconfigConditional  Conditional
+hi def link kconfigPreProc      PreProc
+hi def link kconfigSpecialChar  SpecialChar
+hi def link kconfigPath         String
+hi def link kconfigString       String
+hi def link kconfigType         Type
+hi def link kconfigOption       Identifier
+hi def link kconfigHelpText     Normal
+hi def link kconfigmacro        Macro
+
+endif
+
+let b:current_syntax = "kconfig"
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/runtime/syntax/ocaml.vim b/runtime/syntax/ocaml.vim
index d95a3c8d438aab59edf2fcd5d358abb0c0ec8a23..cdef8c38bf49c0388e21c92efea59c4ea777a1e7 100644
--- a/runtime/syntax/ocaml.vim
+++ b/runtime/syntax/ocaml.vim
@@ -5,9 +5,9 @@
 "               Karl-Heinz Sylla  <Karl-Heinz.Sylla@gmd.de>
 "               Issac Trotts      <ijtrotts@ucdavis.edu>
 " URL:          http://www.ocaml.info/vim/syntax/ocaml.vim
-" Last Change:  2005 May 18 - Added 'NOTE' to highlighted comment words (MM)
+" Last Change:  2006 Apr 11 - Fixed an initialization bug (MM)
+"               2005 May 18 - Added 'NOTE' to highlighted comment words (MM)
 "               2005 Apr 14 - Fixed a small bug concerning 'include' (MM)
-"               2005 Mar 15 - Added a patch from David Baelde (MM)
 
 " A minor patch was applied to the official version so that object/end
 " can be distinguished from begin/end, which is used for indentation,
@@ -17,7 +17,7 @@
 " For version 6.x: Quit when a syntax file was already loaded
 if version < 600
   syntax clear
-elseif exists("b:current_syntax") && b:current_syntax != "ocaml"
+elseif exists("b:current_syntax") && b:current_syntax == "ocaml"
   finish
 endif
 
diff --git a/runtime/syntax/progress.vim b/runtime/syntax/progress.vim
index dd29310ad9bd4cdca915f96c8f352684f18350ca..576042397e69c8b8c58485a29796d193daefd256 100644
--- a/runtime/syntax/progress.vim
+++ b/runtime/syntax/progress.vim
@@ -3,12 +3,12 @@
 " Filename extensions:	*.p (collides with Pascal),
 "						*.i (collides with assembler)
 "						*.w (collides with cweb)
-" Maintainer:			Philip Uren			<philu@computer.org>
-" Contributors:			Chris Ruprecht		<chrup@mac.com>
-"						Philip Uren			<philu@computer.org>
+" Maintainer:			Philip Uren			<philuSPAX@ieee.org> Remove "SPAX" spam block
+" Contributors:         Chris Ruprecht		<chrup@mac.com>
 "						Mikhail Kuperblum	<mikhail@whasup.com>
-" URL:					http://www.zeta.org.au/~philu/vim/progress.vim
-" Last Change:			Thu May  3 08:49:47 EST 2001
+"						John Florian		<jflorian@voyager.net>
+" Last Change:			Tue Apr 11 10:18:23 EST 2006
+" $Id$
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
@@ -24,6 +24,9 @@ else
   set iskeyword=@,48-57,_,-,!,#,$,%
 endif
 
+" The Progress editor doesn't cope with tabs very well.
+set expandtab
+
 syn case ignore
 
 " Progress Blocks of code and mismatched "end." errors.
@@ -31,7 +34,7 @@ syn match   ProgressEndError		"\<end\>"
 syn region ProgressDoBlock transparent matchgroup=ProgressDo start="\<do\>" matchgroup=ProgressDo end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
 syn region ProgressForBlock transparent matchgroup=ProgressFor start="\<for\>" matchgroup=ProgressFor end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
 syn region ProgressRepeatBlock transparent matchgroup=ProgressRepeat start="\<repeat\>" matchgroup=ProgressRepeat end="\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
-syn region ProgressCaseBlock transparent matchgroup=ProgressCase start="\<case\>" matchgroup=ProgressCase end="\<end\scase\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
+syn region ProgressCaseBlock transparent matchgroup=ProgressCase start="\<case\>" matchgroup=ProgressCase end="\<end\scase\>\|\<end\>" contains=ALLBUT,ProgressProcedure,ProgressFunction
 
 " These are Progress reserved words,
 " and they could go in ProgressReserved,
@@ -43,14 +46,23 @@ syn keyword ProgressFor				each where
 syn keyword	ProgressTodo			contained	TODO BUG FIX
 syn keyword ProgressDebug			contained	DEBUG
 syn keyword ProgressDebug						debugger
-
-syn keyword ProgressFunction	procedure function
+syn match   ProgressTodo            contained   "NEED[S]*\s\s*WORK"
+
+" If you like to highlight the whole line of
+" the start and end of procedures
+" to make the whole block of code stand out:
+syn match ProgressProcedure		"^\s*procedure.*"
+syn match ProgressProcedure		"^\s*end\s\s*procedure.*"
+syn match ProgressFunction		"^\s*function.*"
+syn match ProgressFunction		"^\s*end\s\s*function.*"
+" ... otherwise use this:
+" syn keyword ProgressFunction	procedure function
 
 syn keyword ProgressReserved	accum[ulate] active-window add alias all alter ambig[uous] analyz[e] and any apply as asc[ending] assign at attr[-space]
 syn keyword ProgressReserved	authorization auto-ret[urn] avail[able] back[ground] before-h[ide] begins bell between blank break btos by call can-do can-find
-syn keyword ProgressReserved	center[ed] check chr clear clipboard col colon color col[umn] column-lab[el] col[umns] compiler connected control count-of
+syn keyword ProgressReserved	center[ed] character check chr clear clipboard col colon color col[umn] column-lab[el] col[umns] compiler connected control count-of
 syn keyword ProgressReserved	cpstream create ctos current current-changed current-lang[uage] current-window current_date curs[or] database dataservers
-syn keyword ProgressReserved	dbcodepage dbcollation dbname dbrest[rictions] dbtaskid dbtype dbvers[ion] dde deblank debug-list debugger decimals declare
+syn keyword ProgressReserved	dbcodepage dbcollation dbname dbrest[rictions] dbtaskid dbtype dbvers[ion] dde deblank debug-list debugger decimal decimals declare
 syn keyword ProgressReserved	def default default-noxl[ate] default-window def[ine] delete delimiter desc[ending] dict[ionary] disable discon[nect] disp
 syn keyword ProgressReserved	disp[lay] distinct dos down drop editing enable encode entry error-stat[us] escape etime except exclusive
 syn keyword ProgressReserved	exclusive[-lock] exclusive-web-us[er] exists export false fetch field field[s] file-info[rmation] fill find find-case-sensitive
@@ -58,7 +70,7 @@ syn keyword ProgressReserved	find-global find-next-occurrence find-prev-occurren
 syn keyword ProgressReserved	fram[e] frame-col frame-db frame-down frame-field frame-file frame-inde[x] frame-line frame-name frame-row frame-val[ue]
 syn keyword ProgressReserved	from from-c[hars] from-p[ixels] gateway[s] get-byte get-codepage[s] get-coll[ations] get-key-val[ue] getbyte global go-on
 syn keyword ProgressReserved	go-pend[ing] grant graphic-e[dge] group having header help hide import in index indicator input input-o[utput] insert
-syn keyword ProgressReserved	into is is-attr[-space] join kblabel key-code key-func[tion] key-label keycode keyfunc[tion] keylabel keys keyword label
+syn keyword ProgressReserved	integer into is is-attr[-space] join kblabel key-code key-func[tion] key-label keycode keyfunc[tion] keylabel keys keyword label
 syn keyword ProgressReserved	last last-even[t] last-key last-of lastkey ldbname leave library like line-count[er] listi[ng] locked lookup machine-class
 syn keyword ProgressReserved	map member message message-lines mouse mpe new next next-prompt no no-attr[-space] no-error no-f[ill] no-help no-hide no-label[s]
 syn keyword ProgressReserved	no-lock no-map no-mes[sage] no-pause no-prefe[tch] no-undo no-val[idate] no-wait not null num-ali[ases] num-dbs num-entries
@@ -70,39 +82,51 @@ syn keyword ProgressReserved	release reposition retain retry return return-val[u
 syn keyword ProgressReserved	scroll sdbname search seek select self session set setuser[id] share[-lock] shared show-stat[s] skip some space status stream
 syn keyword ProgressReserved	stream-io string-xref system-dialog table term term[inal] text text-cursor text-seg[-growth] this-procedure time title
 syn keyword ProgressReserved	to today top-only trans trans[action] trigger triggers trim true underl[ine] undo unform[atted] union unique unix up update
-syn keyword ProgressReserved	use-index use-revvideo use-underline user user[id] using v6frame value values view view-as vms wait-for web-con[text]
+syn keyword ProgressReserved	use-index use-revvideo use-underline user user[id] using v6frame value values variable view view-as vms wait-for web-con[text]
 syn keyword ProgressReserved	window window-maxim[ized] window-minim[ized] window-normal with work-tab[le] workfile write xcode xref yes _cbit
-syn keyword ProgressReserved	_control _list _memory _msg _pcontrol _serial[-num] _trace
+syn keyword ProgressReserved	_control _list _memory _msg _pcontrol _serial[-num] _trace 
 
 " Strings. Handles embedded quotes.
 " Note that, for some reason, Progress doesn't use the backslash, "\"
 " as the escape character; it uses tilde, "~".
-syn region ProgressString	matchgroup=ProgressQuote	start=+"+ end=+"+	skip=+\~"+
-syn region ProgressString	matchgroup=ProgressQuote	start=+'+ end=+'+	skip=+\~'+
+syn region ProgressString	matchgroup=ProgressQuote	start=+"+ end=+"+	skip=+\~'\|\~\~+
+syn region ProgressString	matchgroup=ProgressQuote	start=+'+ end=+'+	skip=+\~'\|\~\~+
 
-syn match  ProgressIdentifier			"\<[a-zA-Z_][a-zA-Z0-9_]*\>()"
+syn match  ProgressIdentifier			"\<[a-zA-Z_%#]+\>()"
 
 " syn match  ProgressDelimiter			"()"
 
-" syn match  ProgressMatrixDelimiter	"[][]"
-
+syn match  ProgressMatrixDelimiter	"[][]"
 " If you prefer you can highlight the range
 "syn match  ProgressMatrixDelimiter		"[\d\+\.\.\d\+]"
 
-syn match  ProgressNumber				"\<\d\+\(u\=l\=\|lu\|f\)\>"
+syn match  ProgressNumber				"\<\-\=\d\+\(u\=l\=\|lu\|f\)\>"
 syn match  ProgressByte					"\$[0-9a-fA-F]\+"
 
-" If you don't like tabs:
-"syn match ProgressShowTab "\t"
-"syn match ProgressShowTabc "\t"
+" More values: Logicals, and Progress's unknown value, ?.
+syn match   ProgressNumber				"?"
+syn keyword ProgressNumber				true false yes no
 
-syn region ProgressComment		start="/\*"  end="\*/" contains=ProgressComment,ProgressTodo,ProgressDebug
-syn match ProgressInclude		"^[ 	]*[{].*\.i[}]"
+" If you don't like tabs:
+syn match ProgressShowTab "\t"
 
-syn match ProgressSubstitute	"^[ 	]*[{].*[^i][}]"
-syn match ProgressPreProc		"^[ 	]*&.*"
+" If you don't like white space on the end of lines:
+" syn match   ProgressSpaceError "\s\+$"
 
-syn match ProgressOperator		"[!;|)(:.><+*=-]"
+syn region ProgressComment		start="/\*"  end="\*/" contains=ProgressComment,ProgressTodo,ProgressDebug
+syn region ProgressInclude		start="^[ 	]*[{][^&]" end="[}]" contains=ProgressPreProc,ProgressOperator,ProgressString,ProgressComment
+syn region ProgressPreProc		start="&" end="\>" contained
+
+" This next line works reasonably well.
+" syn match ProgressOperator        "[!;|)(:.><+*=-]"
+"
+" Progress allows a '-' to be part of an identifier.  To be considered
+" the subtraction/negation operation operator it needs a non-word
+" character on either side.  Also valid are cases where the minus
+" operation appears at the beginning or end of a line.
+" This next line trips up on "no-undo" etc.
+" syn match ProgressOperator    "[!;|)(:.><+*=]\|\W-\W\|^-\W\|\W-$"
+syn match ProgressOperator      "[!;|)(:.><+*=]\|\s-\s\|^-\s\|\s-$"
 
 syn keyword ProgressOperator	<= <> >= abs[olute] accelerator across add-first add-last advise alert-box allow-replication ansi-only anywhere append appl-alert[-boxes] application as-cursor ask-overwrite
 syn keyword ProgressOperator	attach[ment] auto-end-key auto-endkey auto-go auto-ind[ent] auto-resize auto-z[ap] available-formats ave[rage] avg backward[s] base-key batch[-mode] bgc[olor] binary
@@ -114,7 +138,7 @@ syn keyword ProgressOperator	column-label-bgc[olor] column-label-dcolor column-l
 syn keyword ProgressOperator	connect constrained contents context context-pop[up] control-containe[r] c[ontrol-form] convert-to-offse[t] convert count cpcase cpcoll cpint[ernal] cplog
 syn keyword ProgressOperator	cpprint cprcodein cprcodeout cpterm crc-val[ue] c[reate-control] create-result-list-entry create-test-file current-column current-environm[ent] current-iteration
 syn keyword ProgressOperator	current-result-row current-row-modified current-value cursor-char cursor-line cursor-offset data-entry-retur[n] data-t[ype] date date-f[ormat] day db-references
-syn keyword ProgressOperator	dcolor dde-error dde-i[d] dde-item dde-name dde-topic debu[g] dec[imal] default-b[utton] default-extensio[n] defer-lob-fetch defined delete-char delete-current-row
+syn keyword ProgressOperator	dcolor dde-error dde-i[d] dde-item dde-name dde-topic debu[g] dec[imal] default-b[utton] default-extensio[n] defer-lob-fetch define defined delete-char delete-current-row
 syn keyword ProgressOperator	delete-line delete-selected-row delete-selected-rows deselect-focused-row deselect-rows deselect-selected-row d[esign-mode] dialog-box dialog-help dir disabled display-message
 syn keyword ProgressOperator	display-t[ype] double drag-enabled drop-down drop-down-list dump dynamic echo edge edge[-chars] edge-p[ixels] editor empty end-key endkey entered eq error error-col[umn]
 syn keyword ProgressOperator	error-row event-t[ype] event[s] exclusive-id execute exp expand extended extent external extract fetch-selected-row fgc[olor] file file-name file-off[set] file-type
@@ -174,38 +198,30 @@ if version >= 508 || !exists("did_progress_syntax_inits")
   endif
 
   " The default methods for highlighting. Can be overridden later.
-  HiLink ProgressByte			    Number
+  HiLink ProgressByte				Number
   HiLink ProgressCase				Repeat
-  HiLink ProgressComment			StatusLine
+  HiLink ProgressComment			Comment
   HiLink ProgressConditional		Conditional
   HiLink ProgressDebug				Debug
   HiLink ProgressDo					Repeat
   HiLink ProgressEndError			Error
   HiLink ProgressFor				Repeat
   HiLink ProgressFunction			Procedure
+  HiLink ProgressIdentifier			Identifier
   HiLink ProgressInclude			Include
-  HiLink ProgressLabel				Label
   HiLink ProgressMatrixDelimiter	Identifier
-  HiLink ProgressModifier			Type
   HiLink ProgressNumber				Number
-  HiLink ProgressOperator			Function
+  HiLink ProgressOperator			Operator
   HiLink ProgressPreProc			PreProc
   HiLink ProgressProcedure			Procedure
   HiLink ProgressQuote				Delimiter
   HiLink ProgressRepeat				Repeat
-  HiLink ProgressReserved			Identifier
+  HiLink ProgressReserved			Statement
+  HiLink ProgressSpaceError			Error
   HiLink ProgressString				String
-  HiLink ProgressStructure			Structure
-  HiLink ProgressSubstitute			PreProc
   HiLink ProgressTodo				Todo
   HiLink ProgressType				Statement
-  HiLink ProgressUnclassified		Statement
-
-  " Optional highlighting
-  " HiLink ProgressDelimiter		Identifier
-  " HiLink ProgressShowTab			Error
-  " HiLink ProgressShowTabc			Error
-  " HiLink ProgressIdentifier		Identifier
+  HiLink ProgressShowTab			Error
 
   delcommand HiLink
 endif
diff --git a/runtime/syntax/rexx.vim b/runtime/syntax/rexx.vim
index ef4b058b50ef0db11dfda9818760dc136ae527a4..179e453c93abdd0c587a730d5bba46ef0c00a96b 100644
--- a/runtime/syntax/rexx.vim
+++ b/runtime/syntax/rexx.vim
@@ -1,11 +1,15 @@
 " Vim syntax file
 " Language:	Rexx
 " Maintainer:	Thomas Geulig <geulig@nentec.de>
-" Last Change:	2001 May 2
-" URL:		http://mywebpage.netscape.com/sharpPeople/vim/syntax/rexx.vim
+" Last Change:  2005 Dez  9, added some <http://www.ooRexx.org>-coloring,
+"                            line comments, do *over*, messages, directives,
+"                            highlighting classes, methods, routines and requires
+"               Rony G. Flatscher <rony.flatscher@wu-wien.ac.at>
 "
-" Special Thanks to Dan Sharp <dwsharp@hotmail.com> for comments and additions
-" (and providing the webspace)
+" URL:		http://www.geulig.de/vim/rexx.vim
+"
+" Special Thanks to Dan Sharp <dwsharp@hotmail.com> and Rony G. Flatscher
+" <Rony.Flatscher@wu-wien.ac.at> for comments and additions
 
 " For version 5.x: Clear all syntax items
 " For version 6.x: Quit when a syntax file was already loaded
@@ -17,65 +21,126 @@ endif
 
 syn case ignore
 
+" add to valid identifier chars
+setlocal iskeyword+=.
+setlocal iskeyword+=!
+setlocal iskeyword+=?
+
+" ---rgf, position important: must be before comments etc. !
+syn match rexxOperator "[-=|\/\\\+\*\[\],;<>&\~]"
+
+syn match rexxIdentifier        "\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>"
+syn match rexxEnvironmentSymbol "\<\.\+\([a-zA-Z0-9._?!]\)*\>"
+
+
 " A Keyword is the first symbol in a clause.  A clause begins at the start
 " of a line or after a semicolon.  THEN, ELSE, OTHERWISE, and colons are always
 " followed by an implied semicolon.
-syn match rexxClause "\(^\|;\|:\|then \|else \|otherwise \)\s*\w\+" contains=ALL
+syn match rexxClause "\(^\|;\|:\|then \|else \|otherwise \)\s*\w\+" contains=ALLBUT,rexxParse2,rexxRaise2
+
 
 " Considered keywords when used together in a phrase and begin a clause
-syn match rexxKeyword contained "\<signal\( on \(error\|failure\|halt\|notready\|novalue\|syntax\|lostdigits\)\(\s\+name\)\=\)\=\>"
-syn match rexxKeyword contained "\<signal off \(error\|failure\|halt\|notready\|novalue\|syntax\|lostdigits\)\>"
-syn match rexxKeyword contained "\<call off \(error\|failure\|halt\|notready\)\>"
-syn match rexxKeyword contained "\<parse \(upper \)\=\(arg\|linein\|pull\|source\|var\|value\|version\)\>"
+syn match rexxParse "\<parse\s*\(\(upper\|lower\|caseless\)\s*\)\=\(arg\|linein\|pull\|source\|var\|\<value\>\|version\)\>"
+syn match rexxParse2 "\<with\>" contained containedin=rexxParse
+
+
 syn match rexxKeyword contained "\<numeric \(digits\|form \(scientific\|engineering\|value\)\|fuzz\)\>"
 syn match rexxKeyword contained "\<\(address\|trace\)\( value\)\=\>"
-syn match rexxKeyword contained "\<procedure\( expose\)\=\>"
-syn match rexxKeyword contained "\<do\( forever\)\=\>"
+syn match rexxKeyword contained "\<procedure\(\s*expose\)\=\>"
+syn match rexxKeyword contained "\<do\>\(\s*forever\)\=\>"
+syn match rexxKeyword contained "\<use\>\s*\<arg\>"
 
 " Another keyword phrase, separated to aid highlighting in rexxFunction
-syn match rexxKeyword2 contained "\<call\( on \(error\|failure\|halt\|notready\)\(\s\+name\)\=\)\=\>"
+syn match rexxKeyword contained "\<signal\(\s*\(on\|off\)\s*\(any\|error\|failure\|halt\|lostdigits\|nomethod\|nostring\|notready\|novalue\|syntax\|user\s*\k*\)\(\s\+name\)\=\)\=\>"
+syn match rexxKeyword2 contained "\<call\(\s*\(on\|off\)\s*\(any\|error\|failure\|halt\|notready\|user\s*\k*\)\(\s\+name\)\=\)\=\>"
+
 
 " Considered keywords when they begin a clause
-syn match rexxKeyword contained "\<\(arg\|drop\|end\|exit\|if\|interpret\|iterate\|leave\|nop\)\>"
-syn match rexxKeyword contained "\<\(options\|pull\|push\|queue\|return\|say\|select\|trace\)\>"
+syn match rexxKeyword contained "\<\(arg\|do\|drop\|end\|exit\|expose\|forward\|if\|interpret\|iterate\|leave\|nop\)\>"
+syn match rexxKeyword contained "\<\(options\|pull\|push\|queue\|raise\|reply\|return\|say\|select\|trace\)\>"
 
 " Conditional phrases
-syn match rexxConditional "\(^\s*\| \)\(to\|by\|for\|until\|while\|then\|when\|otherwise\|else\)\( \|\s*$\)" contains=ALLBUT,rexxConditional
-syn match rexxConditional contained "\<\(to\|by\|for\|until\|while\|then\|when\|else\|otherwise\)\>"
+syn match rexxConditional  "\(^\s*\| \)\(to\|by\|for\|until\|while\|then\|when\|otherwise\|else\|over\)\( \|\s*$\)"
+syn match rexxConditional contained "\<\(to\|by\|for\|until\|while\|then\|when\|otherwise\|else\|over\)\>"
+
+" must be after Conditional phrases!
+syn match rexxKeyword ".*\<\(then\|else\)\s*\<do\>"
 
-" Assignments -- a keyword followed by an equal sign becomes a variable
-syn match rexxAssign "\<\w\+\s*=\s*" contains=rexxSpecialVariable
+" Raise statement
+syn match rexxRaise "\(^\|;\|:\)\s\+\<raise\>\s*\<\(propagate\|error\|failure\|syntax\|user\)\>\="
+syn match rexxRaise2 "\<\(additional\|array\|description\|exit\|return\)\>" contained containedin=rexxRaise
+
+" Forward statement keywords
+syn match rexxForward  "\(^\|;\|:\)\<forward\>\s*"
+syn match rexxForward2 "\<\(arguments\|array\|continue\|message\|class\|to\)\>" contained containedin=rexxForward
 
 " Functions/Procedures
-syn match rexxFunction	"\<\h\w*\(/\*\s*\*/\)*("me=e-1 contains=rexxComment,rexxConditional,rexxKeyword
-syn match rexxFunction	"\<\(arg\|trace\)\(/\*\s*\*/\)*("me=e-1
-syn match rexxFunction	"\<call\( on \(error\|failure\|halt\|notready\)\(\s\+name\)\=\)\=\>\s\+\w\+\>" contains=rexxKeyword2
+syn match rexxFunction	"\<\w*\(/\*\s*\*/\)*("me=e-1 contains=rexxComment,rexxConditional,rexxKeyword,rexxIdentifier
+syn match rexxFunction 	"\<\<[a-zA-Z\!\?_]\([a-zA-Z0-9._?!]\)*\>("me=e-1
+syn match rexxFunction	"\<call\s\+\k\+\>"  contains=rexxKeyword2
+syn match rexxFunction "[()]"
 
 " String constants
-syn region rexxString	  start=+"+ skip=+\\\\\|\\'+ end=+"+
-syn region rexxString	  start=+'+ skip=+\\\\\|\\"+ end=+'+
-syn match  rexxCharacter  +"'[^\\]'"+
+syn region rexxString	  start=+"+ skip=+""+ end=+"\(x\|b\)\=+ oneline
+syn region rexxString	  start=+'+ skip=+''+ end=+'\(x\|b\)\=+ oneline
 
 " Catch errors caused by wrong parenthesis
-syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxUserLabel,rexxKeyword
+syn region rexxParen transparent start='(' end=')' contains=ALLBUT,rexxParenError,rexxTodo,rexxLabel,rexxKeyword
 syn match rexxParenError	 ")"
 syn match rexxInParen		"[\\[\\]{}]"
 
 " Comments
 syn region rexxComment		start="/\*" end="\*/" contains=rexxTodo,rexxComment
 syn match  rexxCommentError	"\*/"
+syn match  rexxLineComment       /--.*/
 
 syn keyword rexxTodo contained	TODO FIXME XXX
 
+
+" ooRexx messages
+syn region rexxMessageOperator start="\(\~\|\~\~\)" end="\(\S\|\s\)"me=e-1
+syn match rexxMessage "\(\~\|\~\~\)\s*\<\.*[a-zA-Z]\([a-zA-Z0-9._?!]\)*\>" contains=rexxMessageOperator
+
 " Highlight User Labels
-syn match rexxUserLabel		 "\<\I\i*\s*:"me=e-1
+syn match rexxLabel		 "^\s*\k*\s*:"me=e-1
+
+syn match rexxLineContinue ",\ze\s*\(--.*\|\/\*.*\)*$"
+" the following is necessary, otherwise three consecutive dashes will cause it to highlight the first one
+syn match rexxLineContinue "-\ze\(\s+--.*\|\s*\/\*.*\)*$"
 
 " Special Variables
-syn keyword rexxSpecialVariable  sigl rc result
-syn match   rexxCompoundVariable "\<\w\+\.\w*\>"
+syn keyword rexxSpecialVariable  sigl rc result self super
+
+" Constants
+syn keyword rexxConst .true .false .nil
+
+" ooRexx builtin classes, first define dot to be o.k. in keywords
+syn keyword rexxBuiltinClass .object .class .method .message
+syn keyword rexxBuiltinClass .monitor .alarm
+syn keyword rexxBuiltinClass .stem .stream .string
+syn keyword rexxBuiltinClass .mutablebuffer
+syn keyword rexxBuiltinClass .array .list .queue .directory .table .set
+syn keyword rexxBuiltinClass .relation .bag .supplier .regularExpressions
+
+" Windows-only classes
+syn keyword rexxBuiltinClass .OLEObject .MenuObject .WindowsClipboard .WindowsEventLog
+syn keyword rexxBuiltinClass .WindowsManager .WindowObject .WindowsProgramManager
+
+
+" ooRexx directives, ---rgf location important, otherwise directives in top of
+" file not matched!
+syn region rexxClass    start="::\s*class\s*"ms=e+1    end="\ze\(\s\|;\|$\)"
+syn region rexxMethod   start="::\s*method\s*"ms=e+1   end="\ze\(\s\|;\|$\)"
+syn region rexxRequires start="::\s*requires\s*"ms=e+1 end="\ze\(\s\|;\|$\)"
+syn region rexxRoutine  start="::\s*routine\s*"ms=e+1  end="\ze\(\s\|;\|$\)"
+
+syn region rexxDirective start="\(^\|;\)\s*::\s*\w\+"  end="\($\|;\)" contains=rexxString,rexxComment,rexxLineComment,rexxClass,rexxMethod,rexxRoutine,rexxRequires keepend
+
+
 
 if !exists("rexx_minlines")
-  let rexx_minlines = 10
+"  let rexx_minlines = 10
+  let rexx_minlines = 500
 endif
 exec "syn sync ccomment rexxComment minlines=" . rexx_minlines
 
@@ -90,7 +155,7 @@ if version >= 508 || !exists("did_rexx_syn_inits")
     command -nargs=+ HiLink hi def link <args>
   endif
 
-  HiLink rexxUserLabel		Function
+  HiLink rexxLabel		Function
   HiLink rexxCharacter		Character
   HiLink rexxParenError		rexxError
   HiLink rexxInParen		rexxError
@@ -105,6 +170,34 @@ if version >= 508 || !exists("did_rexx_syn_inits")
   HiLink rexxSpecialVariable	Special
   HiLink rexxConditional	rexxKeyword
 
+  HiLink rexxOperator		Operator
+  HiLink rexxMessageOperator	rexxOperator
+  HiLink rexxLineComment	RexxComment
+
+  HiLink rexxLineContinue	WildMenu
+
+  HiLink rexxDirective		rexxKeyword
+  HiLink rexxClass              Type
+  HiLink rexxMethod             rexxFunction
+  HiLink rexxRequires           Include
+  HiLink rexxRoutine            rexxFunction
+
+  HiLink rexxConst		Constant
+  HiLink rexxTypeSpecifier	Type
+  HiLink rexxBuiltinClass	rexxTypeSpecifier
+
+  HiLink rexxEnvironmentSymbol  rexxConst
+  HiLink rexxMessage		rexxFunction
+
+  HiLink rexxParse              rexxKeyword
+  HiLink rexxParse2             rexxParse
+
+  HiLink rexxRaise              rexxKeyword
+  HiLink rexxRaise2             rexxRaise
+
+  HiLink rexxForward            rexxKeyword
+  HiLink rexxForward2           rexxForward
+
   delcommand HiLink
 endif
 
diff --git a/runtime/syntax/xml.vim b/runtime/syntax/xml.vim
index 288ea54aa5784cb0a957e0113970f40391020dd3..8f8e155904d2e3a1485a9c51b812d475384feadb 100644
--- a/runtime/syntax/xml.vim
+++ b/runtime/syntax/xml.vim
@@ -58,8 +58,8 @@ syn match xmlError "[<&]"
 "
 " <tag foo.attribute = "value">
 "                      ^^^^^^^
-syn region  xmlString contained start=+"+ end=+"+ contains=xmlEntity display
-syn region  xmlString contained start=+'+ end=+'+ contains=xmlEntity display
+syn region  xmlString contained start=+"+ end=+"+ contains=xmlEntity,@Spell display
+syn region  xmlString contained start=+'+ end=+'+ contains=xmlEntity,@Spell display
 
 
 " punctuation (within attributes) e.g. <tag xml:foo.attribute ...>
@@ -183,7 +183,7 @@ if exists('g:xml_syntax_folding')
 	\ end=+</\z1\_\s\{-}>+
 	\ matchgroup=xmlEndTag end=+/>+
 	\ fold
-	\ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook
+	\ contains=xmlTag,xmlEndTag,xmlCdata,xmlRegion,xmlComment,xmlEntity,xmlProcessing,@xmlRegionHook,@Spell
 	\ keepend
 	\ extend
 
@@ -239,7 +239,7 @@ syn region  xmlCommentPart
     \ start=+--+
     \ end=+--+
     \ contained
-    \ contains=xmlTodo,@xmlCommentHook
+    \ contains=xmlTodo,@xmlCommentHook,@Spell
 
 
 " CData sections
@@ -249,7 +249,7 @@ syn region  xmlCommentPart
 syn region    xmlCdata
     \ start=+<!\[CDATA\[+
     \ end=+]]>+
-    \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook
+    \ contains=xmlCdataStart,xmlCdataEnd,@xmlCdataHook,@Spell
     \ keepend
     \ extend
 
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index 557cb6da46e7c55af7cac4172f62b6c814c86393..895b7bc98c1e1b2a525d0a438ab12eef7bf5f1e8 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -2,7 +2,7 @@
 # Makefile for Vim on OpenVMS
 #
 # Maintainer:   Zoltan Arpadffy <arpadffy@polarhome.com>
-# Last change:  2006 Mar 31
+# Last change:  2006 Apr 11
 #
 # This has script been tested on VMS 6.2 to 8.2 on DEC Alpha, VAX and IA64
 # with MMS and MMK
@@ -44,6 +44,7 @@ MODEL = BIG
 
 # GUI or terminal mode executable.
 # Comment out if you want just the character terminal mode only.
+# GUI with Motif
 GUI = YES
 
 # GUI with GTK
@@ -136,12 +137,24 @@ VIMRUN  = ""
 
 CONFIG_H = os_vms_conf.h
 
+# GTK or XPM but not both
 .IFDEF GTK
 .IFDEF GUI
+.ELSE
+GUI = YES
+.ENDIF
 .IFDEF XPM
+XPM = ""
+.ENDIF
+.ENDIF
+
+.IFDEF XPM
+.IFDEF GUI
 .ELSE
 GUI = YES
 .ENDIF
+.IFDEF GTK
+GTK = ""
 .ENDIF
 .ENDIF
 
diff --git a/src/dosinst.h b/src/dosinst.h
index 485e7cd71d4f8bd7326cebfde45e3e2686afd480..455d2a61ddaecc13b7f3179eff3cc6b3a1793a75 100644
--- a/src/dosinst.h
+++ b/src/dosinst.h
@@ -207,6 +207,14 @@ searchpath_save(char *name)
 }
 
 #ifdef WIN3264
+
+#ifndef CSIDL_COMMON_PROGRAMS
+# define CSIDL_COMMON_PROGRAMS 0x0017
+#endif
+#ifndef CSIDL_COMMON_DESKTOPDIRECTORY
+# define CSIDL_COMMON_DESKTOPDIRECTORY 0x0019
+#endif
+
 /*
  * Get the path to a requested Windows shell folder.
  *
@@ -234,22 +242,14 @@ get_shell_folder_path(
     if (strcmp(shell_folder_name, "desktop") == 0)
     {
 	pcsidl = &desktop_csidl;
-#ifdef CSIDL_COMMON_DESKTOPDIRECTORY
 	csidl = CSIDL_COMMON_DESKTOPDIRECTORY;
 	alt_csidl = CSIDL_DESKTOP;
-#else
-	csidl = CSIDL_DESKTOP;
-#endif
     }
     else if (strncmp(shell_folder_name, "Programs", 8) == 0)
     {
 	pcsidl = &programs_csidl;
-#ifdef CSIDL_COMMON_PROGRAMS
 	csidl = CSIDL_COMMON_PROGRAMS;
 	alt_csidl = CSIDL_PROGRAMS;
-#else
-	csidl = CSIDL_PROGRAMS;
-#endif
     }
     else
     {
diff --git a/src/edit.c b/src/edit.c
index 08a24d7e77cb7b0201a56044f5416d855cb7e7f6..f2a5cdacd7bb6def536ae9645cac0aa348f7a613 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -2969,6 +2969,9 @@ ins_compl_bs()
 	    ins_compl_set_original_text(compl_leader);
 	else
 	{
+#ifdef FEAT_SPELL
+	    spell_bad_len = 0;	/* need to redetect bad word */
+#endif
 	    /* Matches were cleared, need to search for them now. */
 	    if (ins_complete(Ctrl_N) == FAIL)
 		compl_cont_status = 0;
diff --git a/src/eval.c b/src/eval.c
index 1b75201f8108cd10d51941bac9d9fc19a92be9f1..45efab72cc050690e535eed476c87d4883ed90e5 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -16208,7 +16208,7 @@ var2fpos(varp, lnum, fnum)
 	    return NULL;
 	len = (long)STRLEN(ml_get(pos.lnum));
 	/* Accept a position up to the NUL after the line. */
-	if (pos.col <= 0 || (int)pos.col > len + 1)
+	if (pos.col == 0 || (int)pos.col > len + 1)
 	    return NULL;	/* invalid column number */
 	--pos.col;
 
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 9206e0288962562d975497a466bc6afec27dae0f..9ba3e81412b33bb76bb6d95c1540510fa57ed181 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -261,18 +261,23 @@ linelen(has_tab)
     return len;
 }
 
-/* Buffer for one line used during sorting.  It's allocated to contain the
- * longest line being sorted. */
-static char_u	*sortbuf;
+/* Buffer for two lines used during sorting.  They are allocated to
+ * contain the longest line being sorted. */
+static char_u	*sortbuf1;
+static char_u	*sortbuf2;
 
 static int	sort_ic;		/* ignore case */
 static int	sort_nr;		/* sort on number */
+static int	sort_rx;		/* sort on regex instead of skipping it */
+
+static int	sort_abort;		/* flag to indicate if sorting has been interrupted */
 
 /* Struct to store info to be sorted. */
 typedef struct
 {
     linenr_T	lnum;			/* line number */
-    long	col_nr;			/* column number or number */
+    long	start_col_nr;		/* starting column number or number */
+    long	end_col_nr;		/* ending column number */
 } sorti_T;
 
 static int
@@ -291,18 +296,35 @@ sort_compare(s1, s2)
 {
     sorti_T	l1 = *(sorti_T *)s1;
     sorti_T	l2 = *(sorti_T *)s2;
-    char_u	*s;
+    int		result = 0;
 
-    /* When sorting numbers "col_nr" is the number, not the column number. */
-    if (sort_nr)
-	return l1.col_nr - l2.col_nr;
+    /* If the user interrupts, there's no way to stop qsort() immediately, but
+     * if we return 0 every time, qsort will assume it's done sorting and exit */
+    if (sort_abort)
+	return 0;
+    fast_breakcheck();
+    if (got_int)
+	sort_abort = TRUE;
 
-    /* We need to copy one line into "sortbuf", because there is no guarantee
-     * that the first pointer becomes invalid when obtaining the second one. */
-    STRCPY(sortbuf, ml_get(l1.lnum) + l1.col_nr);
-    s = ml_get(l2.lnum) + l2.col_nr;
+    /* When sorting numbers "start_col_nr" is the number, not the column number. */
+    if (sort_nr)
+	result = l1.start_col_nr - l2.start_col_nr;
+    else
+    {
+	/* We need to copy one line into "sortbuf1", because there is no guarantee
+	 * that the first pointer becomes invalid when obtaining the second one. */
+	STRNCPY(sortbuf1, ml_get(l1.lnum) + l1.start_col_nr, l1.end_col_nr - l1.start_col_nr + 1);
+	sortbuf1[l1.end_col_nr - l1.start_col_nr] = 0;
+	STRNCPY(sortbuf2, ml_get(l2.lnum) + l2.start_col_nr, l2.end_col_nr - l2.start_col_nr + 1);
+	sortbuf2[l2.end_col_nr - l2.start_col_nr] = 0;
 
-    return sort_ic ? STRICMP(sortbuf, s) : STRCMP(sortbuf, s);
+	result = sort_ic ? STRICMP(sortbuf1, sortbuf2) : STRCMP(sortbuf1, sortbuf2);
+    }
+    /* If the two lines have the same value, preserve the original line order */
+    if (result == 0)
+	return (int) (l1.lnum - l2.lnum);
+    else
+	return result;
 }
 
 /*
@@ -321,21 +343,25 @@ ex_sort(eap)
     size_t	i;
     char_u	*p;
     char_u	*s;
+    char_u	*s2;
+    char_u	c;			/* temporary character storage */
     int		unique = FALSE;
     long	deleted;
-    colnr_T	col;
+    colnr_T	start_col;
+    colnr_T	end_col;
     int		sort_oct;		/* sort on octal number */
     int		sort_hex;		/* sort on hex number */
 
     if (u_save((linenr_T)(eap->line1 - 1), (linenr_T)(eap->line2 + 1)) == FAIL)
 	return;
-    sortbuf = NULL;
+    sortbuf1 = NULL;
+    sortbuf2 = NULL;
     regmatch.regprog = NULL;
     nrs = (sorti_T *)lalloc((long_u)(count * sizeof(sorti_T)), TRUE);
     if (nrs == NULL)
-	goto theend;
+	goto sortend;
 
-    sort_ic = sort_nr = sort_oct = sort_hex = 0;
+    sort_abort = sort_ic = sort_rx = sort_nr = sort_oct = sort_hex = 0;
 
     for (p = eap->arg; *p != NUL; ++p)
     {
@@ -343,6 +369,8 @@ ex_sort(eap)
 	    ;
 	else if (*p == 'i')
 	    sort_ic = TRUE;
+	else if (*p == 'r')
+	    sort_rx = TRUE;
 	else if (*p == 'n')
 	    sort_nr = 2;
 	else if (*p == 'o')
@@ -364,19 +392,19 @@ ex_sort(eap)
 	    if (*s != *p)
 	    {
 		EMSG(_(e_invalpat));
-		goto theend;
+		goto sortend;
 	    }
 	    *s = NUL;
 	    regmatch.regprog = vim_regcomp(p + 1, RE_MAGIC);
 	    if (regmatch.regprog == NULL)
-		goto theend;
+		goto sortend;
 	    p = s;		/* continue after the regexp */
 	    regmatch.rm_ic = p_ic;
 	}
 	else
 	{
 	    EMSG2(_(e_invarg2), p);
-	    goto theend;
+	    goto sortend;
 	}
     }
 
@@ -384,7 +412,7 @@ ex_sort(eap)
     if (sort_nr + sort_oct + sort_hex > 2)
     {
 	EMSG(_(e_invarg));
-	goto theend;
+	goto sortend;
     }
 
     /* From here on "sort_nr" is used as a flag for any number sorting. */
@@ -393,9 +421,9 @@ ex_sort(eap)
     /*
      * Make an array with all line numbers.  This avoids having to copy all
      * the lines into allocated memory.
-     * When sorting on strings "col_nr" is de offset in the line, for numbers
-     * sorting it's the number to sort on.  This means the pattern matching
-     * and number conversion only has to be done once per line.
+     * When sorting on strings "start_col_nr" is the offset in the line, for
+     * numbers sorting it's the number to sort on.  This means the pattern
+     * matching and number conversion only has to be done once per line.
      * Also get the longest line length for allocating "sortbuf".
      */
     for (lnum = eap->line1; lnum <= eap->line2; ++lnum)
@@ -405,57 +433,83 @@ ex_sort(eap)
 	if (maxlen < len)
 	    maxlen = len;
 
+	start_col = 0;
+	end_col = len;
 	if (regmatch.regprog != NULL && vim_regexec(&regmatch, s, 0))
-	    col = regmatch.endp[0] - s;
+	{
+	    if (sort_rx)
+	    {
+		start_col = regmatch.startp[0] - s;
+		end_col = regmatch.endp[0] - s;
+	    }
+	    else
+		start_col = regmatch.endp[0] - s;
+	}
 	else
-	    col = 0;
+	    if (regmatch.regprog != NULL)
+		end_col = 0;
 
 	if (sort_nr)
 	{
+	    /* Make sure vim_str2nr doesn't read any digits past the end
+	     * of the match, by temporarily terminating the string there */
+	    s2 = s + end_col;
+	    c = *s2;
+	    (*s2) = 0;
 	    /* Sorting on number: Store the number itself. */
 	    if (sort_hex)
-		s = skiptohex(s + col);
+		s = skiptohex(s + start_col);
 	    else
-		s = skiptodigit(s + col);
+		s = skiptodigit(s + start_col);
 	    vim_str2nr(s, NULL, NULL, sort_oct, sort_hex,
-					&nrs[lnum - eap->line1].col_nr, NULL);
+					&nrs[lnum - eap->line1].start_col_nr, NULL);
+	    (*s2) = c;
 	}
 	else
+	{
 	    /* Store the column to sort at. */
-	    nrs[lnum - eap->line1].col_nr = col;
+	    nrs[lnum - eap->line1].start_col_nr = start_col;
+	    nrs[lnum - eap->line1].end_col_nr = end_col;
+	}
 
 	nrs[lnum - eap->line1].lnum = lnum;
 
 	if (regmatch.regprog != NULL)
 	    fast_breakcheck();
 	if (got_int)
-	    goto theend;
+	    goto sortend;
     }
 
     /* Allocate a buffer that can hold the longest line. */
-    sortbuf = alloc((unsigned)maxlen + 1);
-    if (sortbuf == NULL)
-	goto theend;
+    sortbuf1 = alloc((unsigned)maxlen + 1);
+    if (sortbuf1 == NULL)
+	goto sortend;
+    sortbuf2 = alloc((unsigned)maxlen + 1);
+    if (sortbuf2 == NULL)
+	goto sortend;
 
     /* Sort the array of line numbers.  Note: can't be interrupted! */
     qsort((void *)nrs, count, sizeof(sorti_T), sort_compare);
 
+    if (sort_abort)
+	goto sortend;
+
     /* Insert the lines in the sorted order below the last one. */
     lnum = eap->line2;
     for (i = 0; i < count; ++i)
     {
 	s = ml_get(nrs[eap->forceit ? count - i - 1 : i].lnum);
 	if (!unique || i == 0
-		|| (sort_ic ? STRICMP(s, sortbuf) : STRCMP(s, sortbuf)) != 0)
+		|| (sort_ic ? STRICMP(s, sortbuf1) : STRCMP(s, sortbuf1)) != 0)
 	{
 	    if (ml_append(lnum++, s, (colnr_T)0, FALSE) == FAIL)
 		break;
 	    if (unique)
-		STRCPY(sortbuf, s);
+		STRCPY(sortbuf1, s);
 	}
 	fast_breakcheck();
 	if (got_int)
-	    goto theend;
+	    goto sortend;
     }
 
     /* delete the original lines if appending worked */
@@ -476,9 +530,10 @@ ex_sort(eap)
     curwin->w_cursor.lnum = eap->line1;
     beginline(BL_WHITE | BL_FIX);
 
-theend:
+sortend:
     vim_free(nrs);
-    vim_free(sortbuf);
+    vim_free(sortbuf1);
+    vim_free(sortbuf2);
     vim_free(regmatch.regprog);
     if (got_int)
 	EMSG(_(e_interr));
diff --git a/src/option.c b/src/option.c
index 0a4d9c7dd95bcafc6eabeb0c4d9354477dc38ae9..d24b2cd9acd50aee92e57579fd662b55941e733a 100644
--- a/src/option.c
+++ b/src/option.c
@@ -10252,7 +10252,7 @@ vimrc_found(fname, envname)
     char_u	*envname;
 {
     int		opt_idx;
-    int		dofree;
+    int		dofree = FALSE;
     char_u	*p;
 
     if (!option_was_set((char_u *)"cp"))
diff --git a/src/os_mac_rsrc/doc-txt.icns b/src/os_mac_rsrc/doc-txt.icns
index 124a7303a1ed9693327921610e30718a02040ee0..2219e2ce99a31bcd9c4c7b9e0b3c8bd3033b6d36 100644
Binary files a/src/os_mac_rsrc/doc-txt.icns and b/src/os_mac_rsrc/doc-txt.icns differ
diff --git a/src/screen.c b/src/screen.c
index b82bd983146981d50a4b69c01074870a702677e1..d371ed9fe837a32d2d6d8ead9fc22822504309c3 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -231,7 +231,15 @@ redraw_win_later(wp, type)
 redraw_later_clear()
 {
     redraw_all_later(CLEAR);
-    screen_attr = HL_BOLD | HL_UNDERLINE;
+#ifdef FEAT_GUI
+    if (gui.in_use)
+	/* Use a code that will reset gui.highlight_mask in
+	 * gui_stop_highlight(). */
+	screen_attr = HL_ALL + 1;
+    else
+#endif
+	/* Use attributes that is very unlikely to appear in text. */
+	screen_attr = HL_BOLD | HL_UNDERLINE | HL_INVERSE;
 }
 
 /*
diff --git a/src/testdir/test57.in b/src/testdir/test57.in
index 7e70169ce27d2e1a46e241fe1a99d4836191500f..d74af5791218e3f3452965166d90efa0d4e80d08 100644
--- a/src/testdir/test57.in
+++ b/src/testdir/test57.in
@@ -3,50 +3,494 @@ Tests for :sort command.     vim: set ft=vim :
 STARTTEST
 :so small.vim
 :"
-:/^t1:/+1,/^t2/-1sort
-:/^t2:/+1,/^t3/-1sort u
-:/^t3:/+1,/^t4/-1sort u /[^:]*:/
-:/^t4:/+1,/^t5/-1sort n
-:/^t5:/+1,/^t6/-1sort n -[^:]*:-
-:/^t6:/+1,/^t7/-1sort o
-:/^t7:/+1,/^t8/-1sort x ,.*/,
-:/^t8:/+1,/^t9/-1sort n o
-:/^t1:/,$wq! test.out
+:/^t01:/+1,/^t02/-1sort
+:/^t02:/+1,/^t03/-1sort n
+:/^t03:/+1,/^t04/-1sort x
+:/^t04:/+1,/^t05/-1sort u
+:/^t05:/+1,/^t06/-1sort!
+:/^t06:/+1,/^t07/-1sort! n        
+:/^t07:/+1,/^t08/-1sort! u
+:/^t08:/+1,/^t09/-1sort o         
+:/^t09:/+1,/^t10/-1sort! x        
+:/^t10:/+1,/^t11/-1sort/./        
+:/^t11:/+1,/^t12/-1sort/../       
+:/^t12:/+1,/^t13/-1sort/../u
+:/^t13:/+1,/^t14/-1sort/./n
+:/^t14:/+1,/^t15/-1sort/./r
+:/^t15:/+1,/^t16/-1sort/../r
+:/^t16:/+1,/^t17/-1sort/./rn
+:/^t17:/+1,/^t18/-1sort/\d/
+:/^t18:/+1,/^t19/-1sort/\d/r
+:/^t19:/+1,/^t20/-1sort/\d/n
+:/^t20:/+1,/^t21/-1sort/\d/rn
+:/^t21:/+1,/^t22/-1sort/\d\d/
+:/^t22:/+1,/^t23/-1sort/\d\d/n
+:/^t23:/+1,/^t24/-1sort/\d\d/x
+:/^t24:/+1,/^t25/-1sort/\d\d/r
+:/^t25:/+1,/^t26/-1sort/\d\d/rn
+:/^t26:/+1,/^t27/-1sort/\d\d/rx
+:/^t27:/+1,/^t28/-1sort no
+:/^t01:/,$wq! test.out
 ENDTEST
 
-t1: alphabetical
-two test
-One test
-one test
-Two test
-t2: alpha, unique
-One test
-one test
-Two test
-one test
-Two test 
-t3: alpha, unique, skip pattern
-one: xay
-two: aaa
-another: tuvy
-t4: number
-asdf 83 asd
-one 333   
-xce   9
-t5: number and skip
-asdf 3 a: sd 11
-one 33:4   99
-:9 
-t6: octal
-2389
-111
-asdf 0014
-t7: hex and skip
-sf/0x1d3
-0x44/1a1
-asd/ad 1413
-t8: wrong arguments
-ccc
-bbb
-aaa
-t8:
+t01: alphebetical
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t02: numeric
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t03: hexadecimal
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t04: alpha, unique
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t05: alpha, reverse
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t06: numeric, reverse
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t07: unique, reverse
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t08: octal
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t09: reverse, hexadecimal
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t10: alpha, skip first character
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t11: alpha, skip first 2 characters
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t12: alpha, unique, skip first 2 characters
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t13: numeric, skip first character
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t14: alpha, sort on first character
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t15: alpha, sort on first 2 characters
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t16: numeric, sort on first character
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t17: alpha, skip past first digit
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t18: alpha, sort on first digit
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t19: numeric, skip past first digit
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t20: numeric, sort on first digit
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t21: alpha, skip past first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t22: numeric, skip past first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t23: hexadecimal, skip past first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t24: alpha, sort on first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t25: numeric, sort on first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t26: hexadecimal, sort on first 2 digits
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t27: wrong arguments
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t28: done
+
diff --git a/src/testdir/test57.ok b/src/testdir/test57.ok
index 69b98625df20bc2b60e38db882624d009daa7040..1777133424d5a9c1808fc746cb746893aa70a3ce 100644
--- a/src/testdir/test57.ok
+++ b/src/testdir/test57.ok
@@ -1,35 +1,455 @@
-t1: alphabetical
-One test
-Two test
-one test
-two test
-t2: alpha, unique
-One test
-Two test
-Two test 
-one test
-t3: alpha, unique, skip pattern
-two: aaa
-another: tuvy
-one: xay
-t4: number
-xce   9
-asdf 83 asd
-one 333   
-t5: number and skip
-one 33:4   99
-:9 
-asdf 3 a: sd 11
-t6: octal
-asdf 0014
-2389
-111
-t7: hex and skip
-asd/ad 1413
-0x44/1a1
-sf/0x1d3
-t8: wrong arguments
-ccc
-bbb
-aaa
-t8:
+t01: alphebetical
+
+
+ 123b
+a
+a122
+a123
+a321
+ab
+abc
+b123
+b321
+b321
+b321b
+b322b
+c123d
+c321d
+t02: numeric
+abc
+ab
+a
+
+
+a122
+a123
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b321
+b321b
+b322b
+t03: hexadecimal
+
+
+a
+ab
+abc
+ 123b
+a122
+a123
+a321
+b123
+b321
+b321
+b321b
+b322b
+c123d
+c321d
+t04: alpha, unique
+
+ 123b
+a
+a122
+a123
+a321
+ab
+abc
+b123
+b321
+b321b
+b322b
+c123d
+c321d
+t05: alpha, reverse
+c321d
+c123d
+b322b
+b321b
+b321
+b321
+b123
+abc
+ab
+a321
+a123
+a122
+a
+ 123b
+
+
+t06: numeric, reverse
+b322b
+b321b
+b321
+c321d
+b321
+a321
+ 123b
+c123d
+b123
+a123
+a122
+
+
+a
+ab
+abc
+t07: unique, reverse
+c321d
+c123d
+b322b
+b321b
+b321
+b123
+abc
+ab
+a321
+a123
+a122
+a
+ 123b
+
+t08: octal
+abc
+ab
+a
+
+
+a122
+a123
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b321
+b321b
+b322b
+t09: reverse, hexadecimal
+c321d
+c123d
+b322b
+b321b
+b321
+b321
+b123
+a321
+a123
+a122
+ 123b
+abc
+ab
+a
+
+
+t10: alpha, skip first character
+a
+
+
+a122
+a123
+b123
+ 123b
+c123d
+a321
+b321
+b321
+b321b
+c321d
+b322b
+ab
+abc
+t11: alpha, skip first 2 characters
+ab
+a
+
+
+a321
+b321
+b321
+b321b
+c321d
+a122
+b322b
+a123
+b123
+ 123b
+c123d
+abc
+t12: alpha, unique, skip first 2 characters
+ab
+a
+
+a321
+b321
+b321b
+c321d
+a122
+b322b
+a123
+b123
+ 123b
+c123d
+abc
+t13: numeric, skip first character
+abc
+ab
+a
+
+
+a122
+a123
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b321
+b321b
+b322b
+t14: alpha, sort on first character
+
+
+ 123b
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+b322b
+b321
+b321b
+c123d
+c321d
+t15: alpha, sort on first 2 characters
+a
+
+
+ 123b
+a123
+a122
+a321
+abc
+ab
+b123
+b321
+b322b
+b321
+b321b
+c123d
+c321d
+t16: numeric, sort on first character
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t17: alpha, skip past first digit
+abc
+ab
+a
+
+
+a321
+b321
+b321
+b321b
+c321d
+a122
+b322b
+a123
+b123
+ 123b
+c123d
+t18: alpha, sort on first digit
+abc
+ab
+a
+
+
+a123
+a122
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b322b
+b321
+b321b
+t19: numeric, skip past first digit
+abc
+ab
+a
+
+
+a321
+b321
+c321d
+b321
+b321b
+a122
+b322b
+a123
+b123
+c123d
+ 123b
+t20: numeric, sort on first digit
+abc
+ab
+a
+
+
+a123
+a122
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b322b
+b321
+b321b
+t21: alpha, skip past first 2 digits
+abc
+ab
+a
+
+
+a321
+b321
+b321
+b321b
+c321d
+a122
+b322b
+a123
+b123
+ 123b
+c123d
+t22: numeric, skip past first 2 digits
+abc
+ab
+a
+
+
+a321
+b321
+c321d
+b321
+b321b
+a122
+b322b
+a123
+b123
+c123d
+ 123b
+t23: hexadecimal, skip past first 2 digits
+abc
+ab
+a
+
+
+a321
+b321
+b321
+a122
+a123
+b123
+b321b
+c321d
+b322b
+ 123b
+c123d
+t24: alpha, sort on first 2 digits
+abc
+ab
+a
+
+
+a123
+a122
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b322b
+b321
+b321b
+t25: numeric, sort on first 2 digits
+abc
+ab
+a
+
+
+a123
+a122
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b322b
+b321
+b321b
+t26: hexadecimal, sort on first 2 digits
+abc
+ab
+a
+
+
+a123
+a122
+b123
+c123d
+ 123b
+a321
+b321
+c321d
+b322b
+b321
+b321b
+t27: wrong arguments
+abc
+ab
+a
+a321
+a123
+a122
+b321
+b123
+c123d
+ 123b
+c321d
+b322b
+b321
+b321b
+
+
+t28: done
+
diff --git a/src/version.h b/src/version.h
index 9358164f34d9f1104caf98985721f3b2527c38c7..4b7c05ae503fbfb3cf5688ca84a0207bae96aa34 100644
--- a/src/version.h
+++ b/src/version.h
@@ -35,6 +35,6 @@
  */
 #define VIM_VERSION_NODOT	"vim70d"
 #define VIM_VERSION_SHORT	"7.0d"
-#define VIM_VERSION_MEDIUM	"7.0d BETA"
-#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0d BETA (2006 Apr 10)"
-#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0d BETA (2006 Apr 10, compiled "
+#define VIM_VERSION_MEDIUM	"7.0d01 BETA"
+#define VIM_VERSION_LONG	"VIM - Vi IMproved 7.0d01 BETA (2006 Apr 11)"
+#define VIM_VERSION_LONG_DATE	"VIM - Vi IMproved 7.0d01 BETA (2006 Apr 11, compiled "
diff --git a/src/window.c b/src/window.c
index b401fc1eba0df18e246f265ddf11339058b5a871..5ee8172e3fc286495c0aa7fe80cbbe3ae9ba1fc3 100644
--- a/src/window.c
+++ b/src/window.c
@@ -91,6 +91,9 @@ static void win_new_height __ARGS((win_T *, int));
 #endif
 
 #if defined(FEAT_WINDOWS) || defined(PROTO)
+
+static char *m_onlyone = N_("Already only one window");
+
 /*
  * all CTRL-W window commands are handled here, called from normal_cmd().
  */
@@ -330,6 +333,31 @@ newwindow:
 		break;
 #endif
 
+/* move window to new tab page */
+    case 'T':
+		if (firstwin == lastwin)
+		    MSG(_(m_onlyone));
+		else
+		{
+		    tabpage_T	*oldtab = curtab;
+		    tabpage_T	*newtab;
+		    win_T	*wp = curwin;
+
+		    /* First create a new tab with the window, then go back to
+		     * the old tab and close the window there. */
+		    if (win_new_tabpage((int)Prenum) == OK
+						     && valid_tabpage(oldtab))
+		    {
+			newtab = curtab;
+			goto_tabpage_tp(oldtab);
+			if (curwin == wp)
+			    win_close(curwin, FALSE);
+			if (valid_tabpage(newtab))
+			    goto_tabpage_tp(newtab);
+		    }
+		}
+		break;
+
 /* cursor to top-left window */
     case 't':
     case Ctrl_T:
@@ -1102,6 +1130,7 @@ win_init(newp, oldp)
     newp->w_pcmark = oldp->w_pcmark;
     newp->w_prev_pcmark = oldp->w_prev_pcmark;
     newp->w_alt_fnum = oldp->w_alt_fnum;
+    newp->w_wrow = oldp->w_wrow;
     newp->w_fraction = oldp->w_fraction;
     newp->w_prev_fraction_row = oldp->w_prev_fraction_row;
 #ifdef FEAT_JUMPLIST
@@ -2938,7 +2967,7 @@ close_others(message, forceit)
 		    && !autocmd_busy
 #endif
 				    )
-	    MSG(_("Already only one window"));
+	    MSG(_(m_onlyone));
 	return;
     }
 
@@ -5153,6 +5182,8 @@ win_new_height(wp, height)
      * Will equalize heights soon to fix it. */
     if (height < 0)
 	height = 0;
+    if (wp->w_height == height)
+	return;	    /* nothing to do */
 
     if (wp->w_wrow != wp->w_prev_fraction_row && wp->w_height > 0)
 	wp->w_fraction = ((long)wp->w_wrow * FRACTION_MULT