diff --git a/7.1.212 b/7.1.212
new file mode 100644
index 0000000..a9aa7f5
--- /dev/null
+++ b/7.1.212
@@ -0,0 +1,47 @@
+To: vim-dev@vim.org
+Subject: Patch 7.1.212
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.212
+Problem:    Accessing a byte before a line.
+Solution:   Check that the column is 1 or more. (Dominuque Pelle)
+Files:	    src/edit.c
+
+
+*** ../vim-7.1.211/src/edit.c	Sun Jan  6 20:05:36 2008
+--- src/edit.c	Mon Jan  7 22:31:36 2008
+***************
+*** 8452,8457 ****
+--- 8452,8458 ----
+  	if (	   mode == BACKSPACE_CHAR
+  		&& ((p_sta && in_indent)
+  		    || (curbuf->b_p_sts != 0
++ 			&& curwin->w_cursor.col > 0
+  			&& (*(ml_get_cursor() - 1) == TAB
+  			    || (*(ml_get_cursor() - 1) == ' '
+  				&& (!*inserted_space_p
+*** ../vim-7.1.211/src/version.c	Sun Jan  6 20:05:36 2008
+--- src/version.c	Wed Jan  9 10:11:49 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+  {   /* Add new patch number below this line */
++ /**/
++     212,
+  /**/
+
+-- 
+CRONE:  Who sent you?
+ARTHUR: The Knights Who Say Ni!
+CRONE:  Aaaagh!  (she looks around in rear) No!  We have no shrubberies here.
+                 "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\        download, build and distribute -- http://www.A-A-P.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
diff --git a/7.1.213 b/7.1.213
new file mode 100644
index 0000000..aee3248
--- /dev/null
+++ b/7.1.213
@@ -0,0 +1,57 @@
+To: vim-dev@vim.org
+Subject: Patch 7.1.213
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.213
+Problem:    A ":tabedit" command that results in the "swap file exists" dialog
+	    and selecting "abort" doesn't close the new tab. (Al Budden)
+Solution:   Pass "old_curwin" to do_exedit().
+Files:	    src/ex_docmd.c
+
+
+*** ../vim-7.1.212/src/ex_docmd.c	Sun Jan  6 20:05:36 2008
+--- src/ex_docmd.c	Wed Jan  9 20:11:13 2008
+***************
+*** 7126,7132 ****
+  			 : eap->addr_count == 0 ? 0
+  					       : (int)eap->line2 + 1) != FAIL)
+  	{
+! 	    do_exedit(eap, NULL);
+  
+  	    /* set the alternate buffer for the window we came from */
+  	    if (curwin != old_curwin
+--- 7127,7133 ----
+  			 : eap->addr_count == 0 ? 0
+  					       : (int)eap->line2 + 1) != FAIL)
+  	{
+! 	    do_exedit(eap, old_curwin);
+  
+  	    /* set the alternate buffer for the window we came from */
+  	    if (curwin != old_curwin
+*** ../vim-7.1.212/src/version.c	Wed Jan  9 10:13:24 2008
+--- src/version.c	Wed Jan  9 20:29:09 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+  {   /* Add new patch number below this line */
++ /**/
++     213,
+  /**/
+
+-- 
+Q: What do you call a fish without an eye?
+A: fsh!
+Q: What do you call a deer with no eyes?
+A: no eye deer.
+Q: What do you call a deer with no eyes and no legs?
+A: still no eye deer.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\        download, build and distribute -- http://www.A-A-P.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
diff --git a/7.1.214 b/7.1.214
new file mode 100644
index 0000000..8378667
--- /dev/null
+++ b/7.1.214
@@ -0,0 +1,266 @@
+To: vim-dev@vim.org
+Subject: Patch 7.1.214
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=ISO-8859-1
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.1.214
+Problem:    ":1s/g\n\zs1//" deletes characters from the first line. (A Politz)
+Solution:   Start replacing in the line where the match starts.
+Files:	    src/ex_cmds.c
+
+
+*** ../vim-7.1.213/src/ex_cmds.c	Fri Jan  4 14:52:14 2008
+--- src/ex_cmds.c	Wed Jan  9 22:32:26 2008
+***************
+*** 4200,4206 ****
+      linenr_T	old_line_count = curbuf->b_ml.ml_line_count;
+      linenr_T	line2;
+      long	nmatch;			/* number of lines in match */
+-     linenr_T	sub_firstlnum;		/* nr of first sub line */
+      char_u	*sub_firstline;		/* allocated copy of first sub line */
+      int		endcolumn = FALSE;	/* cursor in last column when done */
+      pos_T	old_cursor = curwin->w_cursor;
+--- 4200,4205 ----
+***************
+*** 4447,4453 ****
+  #endif
+  		); ++lnum)
+      {
+- 	sub_firstlnum = lnum;
+  	nmatch = vim_regexec_multi(&regmatch, curwin, curbuf, lnum, (colnr_T)0);
+  	if (nmatch)
+  	{
+--- 4446,4451 ----
+***************
+*** 4463,4468 ****
+--- 4461,4467 ----
+  	    long	nmatch_tl = 0;	/* nr of lines matched below lnum */
+  	    int		do_again;	/* do it again after joining lines */
+  	    int		skip_match = FALSE;
++ 	    linenr_T	sub_firstlnum;	/* nr of first sub line */
+  
+  	    /*
+  	     * The new text is build up step by step, to avoid too much
+***************
+*** 4482,4489 ****
+  	     *			far.
+  	     * new_end		The new text, where to append new text.
+  	     *
+! 	     * lnum		The line number where we were looking for the
+! 	     *			first match in the old line.
+  	     * sub_firstlnum	The line number in the buffer where to look
+  	     *			for a match.  Can be different from "lnum"
+  	     *			when the pattern or substitute string contains
+--- 4481,4490 ----
+  	     *			far.
+  	     * new_end		The new text, where to append new text.
+  	     *
+! 	     * lnum		The line number where we found the start of
+! 	     *			the match.  Can be below the line we searched
+! 	     *			when there is a \n before a \zs in the
+! 	     *			pattern.
+  	     * sub_firstlnum	The line number in the buffer where to look
+  	     *			for a match.  Can be different from "lnum"
+  	     *			when the pattern or substitute string contains
+***************
+*** 4507,4518 ****
+  	     * updating the screen or handling a multi-line match.  The "old_"
+  	     * pointers point into this copy.
+  	     */
+! 	    sub_firstline = vim_strsave(ml_get(sub_firstlnum));
+! 	    if (sub_firstline == NULL)
+! 	    {
+! 		vim_free(new_start);
+! 		goto outofmem;
+! 	    }
+  	    copycol = 0;
+  	    matchcol = 0;
+  
+--- 4508,4514 ----
+  	     * updating the screen or handling a multi-line match.  The "old_"
+  	     * pointers point into this copy.
+  	     */
+! 	    sub_firstlnum = lnum;
+  	    copycol = 0;
+  	    matchcol = 0;
+  
+***************
+*** 4533,4538 ****
+--- 4529,4556 ----
+  	     */
+  	    for (;;)
+  	    {
++ 		/* Advance "lnum" to the line where the match starts.  The
++ 		 * match does not start in the first line when there is a line
++ 		 * break before \zs. */
++ 		if (regmatch.startpos[0].lnum > 0)
++ 		{
++ 		    lnum += regmatch.startpos[0].lnum;
++ 		    sub_firstlnum += regmatch.startpos[0].lnum;
++ 		    nmatch -= regmatch.startpos[0].lnum;
++ 		    vim_free(sub_firstline);
++ 		    sub_firstline = NULL;
++ 		}
++ 
++ 		if (sub_firstline == NULL)
++ 		{
++ 		    sub_firstline = vim_strsave(ml_get(sub_firstlnum));
++ 		    if (sub_firstline == NULL)
++ 		    {
++ 			vim_free(new_start);
++ 			goto outofmem;
++ 		    }
++ 		}
++ 
+  		/* Save the line number of the last change for the final
+  		 * cursor position (just like Vi). */
+  		curwin->w_cursor.lnum = lnum;
+***************
+*** 4638,4644 ****
+  			    temp = RedrawingDisabled;
+  			    RedrawingDisabled = 0;
+  
+! 			    search_match_lines = regmatch.endpos[0].lnum;
+  			    search_match_endcol = regmatch.endpos[0].col;
+  			    highlight_match = TRUE;
+  
+--- 4656,4663 ----
+  			    temp = RedrawingDisabled;
+  			    RedrawingDisabled = 0;
+  
+! 			    search_match_lines = regmatch.endpos[0].lnum
+! 						  - regmatch.startpos[0].lnum;
+  			    search_match_endcol = regmatch.endpos[0].col;
+  			    highlight_match = TRUE;
+  
+***************
+*** 4749,4755 ****
+  		 * 3. substitute the string.
+  		 */
+  		/* get length of substitution part */
+! 		sublen = vim_regsub_multi(&regmatch, sub_firstlnum,
+  				    sub, sub_firstline, FALSE, p_magic, TRUE);
+  
+  		/* When the match included the "$" of the last line it may
+--- 4768,4775 ----
+  		 * 3. substitute the string.
+  		 */
+  		/* get length of substitution part */
+! 		sublen = vim_regsub_multi(&regmatch,
+! 				    sub_firstlnum - regmatch.startpos[0].lnum,
+  				    sub, sub_firstline, FALSE, p_magic, TRUE);
+  
+  		/* When the match included the "$" of the last line it may
+***************
+*** 4819,4825 ****
+  		mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
+  		new_end += i;
+  
+! 		(void)vim_regsub_multi(&regmatch, sub_firstlnum,
+  					   sub, new_end, TRUE, p_magic, TRUE);
+  		sub_nsubs++;
+  		did_sub = TRUE;
+--- 4839,4846 ----
+  		mch_memmove(new_end, sub_firstline + copycol, (size_t)i);
+  		new_end += i;
+  
+! 		(void)vim_regsub_multi(&regmatch,
+! 				    sub_firstlnum - regmatch.startpos[0].lnum,
+  					   sub, new_end, TRUE, p_magic, TRUE);
+  		sub_nsubs++;
+  		did_sub = TRUE;
+***************
+*** 4908,4917 ****
+  skip:
+  		/* We already know that we did the last subst when we are at
+  		 * the end of the line, except that a pattern like
+! 		 * "bar\|\nfoo" may match at the NUL. */
+  		lastone = (skip_match
+  			|| got_int
+  			|| got_quit
+  			|| !(do_all || do_again)
+  			|| (sub_firstline[matchcol] == NUL && nmatch <= 1
+  					 && !re_multiline(regmatch.regprog)));
+--- 4929,4941 ----
+  skip:
+  		/* We already know that we did the last subst when we are at
+  		 * the end of the line, except that a pattern like
+! 		 * "bar\|\nfoo" may match at the NUL.  "lnum" can be below
+! 		 * "line2" when there is a \zs in the pattern after a line
+! 		 * break. */
+  		lastone = (skip_match
+  			|| got_int
+  			|| got_quit
++ 			|| lnum > line2
+  			|| !(do_all || do_again)
+  			|| (sub_firstline[matchcol] == NUL && nmatch <= 1
+  					 && !re_multiline(regmatch.regprog)));
+***************
+*** 4926,4937 ****
+  		 * When asking the user we like to show the already replaced
+  		 * text, but don't do it when "\<@=" or "\<@!" is used, it
+  		 * changes what matches.
+  		 */
+  		if (lastone
+  			|| (do_ask && !re_lookbehind(regmatch.regprog))
+  			|| nmatch_tl > 0
+  			|| (nmatch = vim_regexec_multi(&regmatch, curwin,
+! 				       curbuf, sub_firstlnum, matchcol)) == 0)
+  		{
+  		    if (new_start != NULL)
+  		    {
+--- 4950,4964 ----
+  		 * When asking the user we like to show the already replaced
+  		 * text, but don't do it when "\<@=" or "\<@!" is used, it
+  		 * changes what matches.
++ 		 * When the match starts below where we start searching also
++ 		 * need to replace the line first (using \zs after \n).
+  		 */
+  		if (lastone
+  			|| (do_ask && !re_lookbehind(regmatch.regprog))
+  			|| nmatch_tl > 0
+  			|| (nmatch = vim_regexec_multi(&regmatch, curwin,
+! 				       curbuf, sub_firstlnum, matchcol)) == 0
+! 			|| regmatch.startpos[0].lnum > 0)
+  		{
+  		    if (new_start != NULL)
+  		    {
+***************
+*** 5001,5007 ****
+--- 5028,5041 ----
+  		     * 5. break if there isn't another match in this line
+  		     */
+  		    if (nmatch <= 0)
++ 		    {
++ 			/* If the match found didn't start where we were
++ 			 * searching, do the next search in the line where we
++ 			 * found the match. */
++ 			if (nmatch == -1)
++ 			    lnum -= regmatch.startpos[0].lnum;
+  			break;
++ 		    }
+  		}
+  
+  		line_breakcheck();
+*** ../vim-7.1.213/src/version.c	Wed Jan  9 20:29:51 2008
+--- src/version.c	Wed Jan  9 22:37:47 2008
+***************
+*** 668,669 ****
+--- 668,671 ----
+  {   /* Add new patch number below this line */
++ /**/
++     214,
+  /**/
+
+-- 
+Q: What's orange and sounds like a parrot?
+A: A carrot
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\        download, build and distribute -- http://www.A-A-P.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///
diff --git a/README.patches b/README.patches
index 9032033..fc5825a 100644
--- a/README.patches
+++ b/README.patches
@@ -242,3 +242,6 @@ Individual patches for Vim 7.1:
   2249  7.1.209  GTK GUI: when using the netrw plugin ":gui" causes a hang
   1923  7.1.210  listing mapping for 0xdb fails when 'encoding' is utf-8
  25525  7.1.211  matchparen plugin may take so long it looks like Vim hangs
+  1491  7.1.212  accessing a byte before a line
+  1750  7.1.213  aborting ":tabedit" from the ATTENTION dialog leaves tab open
+  8399  7.1.214  ":1s/g\n\zs1//" deletes characters from the first line
diff --git a/vim.spec b/vim.spec
index d8fa5ab..164608e 100644
--- a/vim.spec
+++ b/vim.spec
@@ -15,7 +15,7 @@
 #used for pre-releases:
 %define beta %{nil}
 %define vimdir vim71%{?beta}
-%define patchlevel 211
+%define patchlevel 214
 
 Summary: The VIM editor
 URL:     http://www.vim.org/
@@ -262,6 +262,9 @@ Patch208: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.208
 Patch209: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.209
 Patch210: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.210
 Patch211: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.211
+Patch212: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.212
+Patch213: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.213
+Patch214: ftp://ftp.vim.org/pub/vim/patches/7.1/7.1.214
 
 Patch3000: vim-7.0-syntax.patch
 Patch3002: vim-7.1-nowarnings.patch
@@ -605,6 +608,9 @@ perl -pi -e "s,bin/nawk,bin/awk,g" runtime/tools/mve.awk
 %patch209 -p0 
 %patch210 -p0 
 %patch211 -p0 
+%patch212 -p0 
+%patch213 -p0 
+%patch214 -p0 
 
 
 # install spell files
@@ -991,6 +997,9 @@ rm -rf $RPM_BUILD_ROOT
 %{_datadir}/icons/hicolor/*/apps/*
 
 %changelog
+* Thu Jan 10 2008 Karsten Hopp <karsten@redhat.com> 7.1.214-1
+- patchlevel 214
+
 * Mon Jan 07 2008 Karsten Hopp <karsten@redhat.com> 7.1.211-1
 - patchlevel 211