diff --git a/7.3.1112 b/7.3.1112
new file mode 100644
index 0000000..015d3f8
--- /dev/null
+++ b/7.3.1112
@@ -0,0 +1,311 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.3.1112
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.3.1112
+Problem:    New regexp engine: \%V not supported.
+Solution:   Implement \%V.  Add tests.
+Files:	    src/regexp.c, src/regexp_nfa.c, src/testdir/test64.in,
+	    src/testdir/test64.ok
+
+
+*** ../vim-7.3.1111/src/regexp.c	2013-06-03 19:41:01.000000000 +0200
+--- src/regexp.c	2013-06-04 18:28:12.000000000 +0200
+***************
+*** 4165,4170 ****
+--- 4165,4249 ----
+  }
+  
+  #endif
++ #ifdef FEAT_VISUAL
++ static int reg_match_visual __ARGS((void));
++ 
++ /*
++  * Return TRUE if the current reginput position matches the Visual area.
++  */
++     static int
++ reg_match_visual()
++ {
++     pos_T	top, bot;
++     linenr_T    lnum;
++     colnr_T	col;
++     win_T	*wp = reg_win == NULL ? curwin : reg_win;
++     int		mode;
++     colnr_T	start, end;
++     colnr_T	start2, end2;
++     colnr_T	cols;
++ 
++     /* Check if the buffer is the current buffer. */
++     if (reg_buf != curbuf || VIsual.lnum == 0)
++ 	return FALSE;
++ 
++     if (VIsual_active)
++     {
++ 	if (lt(VIsual, wp->w_cursor))
++ 	{
++ 	    top = VIsual;
++ 	    bot = wp->w_cursor;
++ 	}
++ 	else
++ 	{
++ 	    top = wp->w_cursor;
++ 	    bot = VIsual;
++ 	}
++ 	mode = VIsual_mode;
++     }
++     else
++     {
++ 	if (lt(curbuf->b_visual.vi_start, curbuf->b_visual.vi_end))
++ 	{
++ 	    top = curbuf->b_visual.vi_start;
++ 	    bot = curbuf->b_visual.vi_end;
++ 	}
++ 	else
++ 	{
++ 	    top = curbuf->b_visual.vi_end;
++ 	    bot = curbuf->b_visual.vi_start;
++ 	}
++ 	mode = curbuf->b_visual.vi_mode;
++     }
++     lnum = reglnum + reg_firstlnum;
++     if (lnum < top.lnum || lnum > bot.lnum)
++ 	return FALSE;
++ 
++     if (mode == 'v')
++     {
++ 	col = (colnr_T)(reginput - regline);
++ 	if ((lnum == top.lnum && col < top.col)
++ 		|| (lnum == bot.lnum && col >= bot.col + (*p_sel != 'e')))
++ 	    return FALSE;
++     }
++     else if (mode == Ctrl_V)
++     {
++ 	getvvcol(wp, &top, &start, NULL, &end);
++ 	getvvcol(wp, &bot, &start2, NULL, &end2);
++ 	if (start2 < start)
++ 	    start = start2;
++ 	if (end2 > end)
++ 	    end = end2;
++ 	if (top.col == MAXCOL || bot.col == MAXCOL)
++ 	    end = MAXCOL;
++ 	cols = win_linetabsize(wp, regline, (colnr_T)(reginput - regline));
++ 	if (cols < start || cols > end - (*p_sel == 'e'))
++ 	    return FALSE;
++     }
++     return TRUE;
++ }
++ #endif
++ 
+  #define ADVANCE_REGINPUT() mb_ptr_adv(reginput)
+  
+  /*
+***************
+*** 4347,4426 ****
+  
+  	  case RE_VISUAL:
+  #ifdef FEAT_VISUAL
+! 	    /* Check if the buffer is the current buffer. and whether the
+! 	     * position is inside the Visual area. */
+! 	    if (reg_buf != curbuf || VIsual.lnum == 0)
+! 		status = RA_NOMATCH;
+! 	    else
+! 	    {
+! 		pos_T	    top, bot;
+! 		linenr_T    lnum;
+! 		colnr_T	    col;
+! 		win_T	    *wp = reg_win == NULL ? curwin : reg_win;
+! 		int	    mode;
+! 
+! 		if (VIsual_active)
+! 		{
+! 		    if (lt(VIsual, wp->w_cursor))
+! 		    {
+! 			top = VIsual;
+! 			bot = wp->w_cursor;
+! 		    }
+! 		    else
+! 		    {
+! 			top = wp->w_cursor;
+! 			bot = VIsual;
+! 		    }
+! 		    mode = VIsual_mode;
+! 		}
+! 		else
+! 		{
+! 		    if (lt(curbuf->b_visual.vi_start, curbuf->b_visual.vi_end))
+! 		    {
+! 			top = curbuf->b_visual.vi_start;
+! 			bot = curbuf->b_visual.vi_end;
+! 		    }
+! 		    else
+! 		    {
+! 			top = curbuf->b_visual.vi_end;
+! 			bot = curbuf->b_visual.vi_start;
+! 		    }
+! 		    mode = curbuf->b_visual.vi_mode;
+! 		}
+! 		lnum = reglnum + reg_firstlnum;
+! 		col = (colnr_T)(reginput - regline);
+! 		if (lnum < top.lnum || lnum > bot.lnum)
+! 		    status = RA_NOMATCH;
+! 		else if (mode == 'v')
+! 		{
+! 		    if ((lnum == top.lnum && col < top.col)
+! 			    || (lnum == bot.lnum
+! 					 && col >= bot.col + (*p_sel != 'e')))
+! 			status = RA_NOMATCH;
+! 		}
+! 		else if (mode == Ctrl_V)
+! 		{
+! 		    colnr_T	    start, end;
+! 		    colnr_T	    start2, end2;
+! 		    colnr_T	    cols;
+! 
+! 		    getvvcol(wp, &top, &start, NULL, &end);
+! 		    getvvcol(wp, &bot, &start2, NULL, &end2);
+! 		    if (start2 < start)
+! 			start = start2;
+! 		    if (end2 > end)
+! 			end = end2;
+! 		    if (top.col == MAXCOL || bot.col == MAXCOL)
+! 			end = MAXCOL;
+! 		    cols = win_linetabsize(wp,
+! 				      regline, (colnr_T)(reginput - regline));
+! 		    if (cols < start || cols > end - (*p_sel == 'e'))
+! 			status = RA_NOMATCH;
+! 		}
+! 	    }
+! #else
+! 	    status = RA_NOMATCH;
+  #endif
+  	    break;
+  
+  	  case RE_LNUM:
+--- 4426,4434 ----
+  
+  	  case RE_VISUAL:
+  #ifdef FEAT_VISUAL
+! 	    if (!reg_match_visual())
+  #endif
++ 		status = RA_NOMATCH;
+  	    break;
+  
+  	  case RE_LNUM:
+*** ../vim-7.3.1111/src/regexp_nfa.c	2013-06-04 17:47:00.000000000 +0200
+--- src/regexp_nfa.c	2013-06-04 18:22:04.000000000 +0200
+***************
+*** 178,183 ****
+--- 178,184 ----
+      NFA_VCOL,		/*	Match cursor virtual column */
+      NFA_VCOL_GT,	/*	Match > cursor virtual column */
+      NFA_VCOL_LT,	/*	Match < cursor virtual column */
++     NFA_VISUAL,		/*	Match Visual area */
+  
+      NFA_FIRST_NL = NFA_ANY + ADD_NL,
+      NFA_LAST_NL = NFA_NUPPER + ADD_NL,
+***************
+*** 960,967 ****
+  		    break;
+  
+  		case 'V':
+! 		    /* TODO: not supported yet */
+! 		    return FAIL;
+  		    break;
+  
+  		case '[':
+--- 961,967 ----
+  		    break;
+  
+  		case 'V':
+! 		    EMIT(NFA_VISUAL);
+  		    break;
+  
+  		case '[':
+***************
+*** 4731,4736 ****
+--- 4731,4743 ----
+  		if (result)
+  		    addstate_here(thislist, t->state->out, &t->subs,
+  							    t->pim, &listidx);
++ 		break;
++ 
++ 	    case NFA_VISUAL:
++ 		result = reg_match_visual();
++ 		if (result)
++ 		    addstate_here(thislist, t->state->out, &t->subs,
++ 							    t->pim, &listidx);
+  		break;
+  
+  	    default:	/* regular character */
+*** ../vim-7.3.1111/src/testdir/test64.in	2013-06-02 16:07:05.000000000 +0200
+--- src/testdir/test64.in	2013-06-04 18:07:59.000000000 +0200
+***************
+*** 458,463 ****
+--- 458,471 ----
+  :.yank
+  Gop:"
+  :"
++ :" Check matching Visual area
++ /^Visual:
++ jfxvfx:s/\%Ve/E/g
++ jV:s/\%Va/A/g
++ jfxfxj:s/\%Vo/O/g
++ :/^Visual/+1,/^Visual/+4yank
++ Gop:"
++ :"
+  :" Check patterns matching cursor position.
+  :func! Postest()
+   new
+***************
+*** 520,523 ****
+--- 528,537 ----
+  asdfasd<yy
+  xxstart3
+  
++ Visual:
++ thexe the thexethe
++ andaxand andaxand
++ oooxofor foroxooo
++ oooxofor foroxooo
++ 
+  Results of test64:
+*** ../vim-7.3.1111/src/testdir/test64.ok	2013-06-02 16:07:05.000000000 +0200
+--- src/testdir/test64.ok	2013-06-04 18:08:08.000000000 +0200
+***************
+*** 857,862 ****
+--- 857,867 ----
+  ghi
+  
+  xxstart3
++ 
++ thexE thE thExethe
++ AndAxAnd AndAxAnd
++ oooxOfOr fOrOxooo
++ oooxOfOr fOrOxooo
+  -0-
+  ffo
+  bob
+*** ../vim-7.3.1111/src/version.c	2013-06-04 17:47:00.000000000 +0200
+--- src/version.c	2013-06-04 18:26:28.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+  {   /* Add new patch number below this line */
++ /**/
++     1112,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+87. Everyone you know asks why your phone line is always busy ...and
+    you tell them to send an e-mail.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\  an exciting new programming language -- http://www.Zimbu.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///