diff --git a/7.3.911 b/7.3.911
new file mode 100644
index 0000000..9143cee
--- /dev/null
+++ b/7.3.911
@@ -0,0 +1,343 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.3.911
+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.911
+Problem:    Python: Access to Vim variables is not so easy.
+Solution:   Define vim.vars and vim.vvars. (ZyX)
+Files:	    runtime/doc/if_pyth.txt, src/eval.c, src/globals.h,
+	    src/if_py_both.h, src/if_python3.c, src/if_python.c,
+	    src/testdir/test86.in, src/testdir/test86.ok,
+	    src/testdir/test87.in, src/testdir/test87.ok
+
+
+*** ../vim-7.3.910/runtime/doc/if_pyth.txt	2012-09-21 14:00:05.000000000 +0200
+--- runtime/doc/if_pyth.txt	2013-04-24 13:54:23.000000000 +0200
+***************
+*** 54,61 ****
+  	EOF
+  	endfunction
+  <
+! Note: Python is very sensitive to the indenting.  Also make sure the "class"
+! line and "EOF" do not have any indent.
+  
+  							*:pyfile* *:pyf*
+  :[range]pyf[ile] {file}
+--- 54,61 ----
+  	EOF
+  	endfunction
+  <
+! Note: Python is very sensitive to the indenting.  Make sure the "class" line
+! and "EOF" do not have any indent.
+  
+  							*:pyfile* *:pyf*
+  :[range]pyf[ile] {file}
+***************
+*** 165,171 ****
+  	     Value           Meaning ~
+  	     zero            Variable is not locked
+  	     vim.VAR_LOCKED  Variable is locked, but can be unlocked
+! 	     vim.VAR_FIXED   Variable is locked and can’t be unlocked
+  	   integer constants. If variable is not fixed, you can do 
+  	   `var.locked=True` to lock it and `var.locked=False` to unlock. 
+  	   There is no recursive locking like |:lockvar|! does. There is also 
+--- 165,171 ----
+  	     Value           Meaning ~
+  	     zero            Variable is not locked
+  	     vim.VAR_LOCKED  Variable is locked, but can be unlocked
+! 	     vim.VAR_FIXED   Variable is locked and can't be unlocked
+  	   integer constants. If variable is not fixed, you can do 
+  	   `var.locked=True` to lock it and `var.locked=False` to unlock. 
+  	   There is no recursive locking like |:lockvar|! does. There is also 
+***************
+*** 237,242 ****
+--- 237,247 ----
+  	"current range".  A range is a bit like a buffer, but with all access
+  	restricted to a subset of lines.  See |python-range| for more details.
+  
++ vim.vars						*python-vars*
++ vim.vvars						*python-vvars*
++ 	Dictionary-like objects holding dictionaries with global (|g:|) and 
++ 	vim (|v:|) variables respectively. Identical to `vim.bindeval("g:")`, 
++ 	but faster.
+  
+  Output from Python					*python-output*
+  	Vim displays all Python code output in the Vim message area.  Normal
+***************
+*** 307,312 ****
+--- 312,318 ----
+  	:py n = len(b)			# number of lines
+  	:py (row,col) = b.mark('a')	# named mark
+  	:py r = b.range(1,5)		# a sub-range of the buffer
++ 	:py b.vars["foo"] = "bar"	# assign b:foo variable
+  
+  ==============================================================================
+  4. Range objects					*python-range*
+***************
+*** 354,359 ****
+--- 360,368 ----
+  				This is a tuple, (row,col).
+  	height (read-write)	The window height, in rows
+  	width (read-write)	The window width, in columns
++ 	vars (read-only)	The window |w:| variables. Attribute is 
++ 				unassignable, but you can change window 
++ 				variables this way
+  The height attribute is writable only if the screen is split horizontally.
+  The width attribute is writable only if the screen is split vertically.
+  
+***************
+*** 385,391 ****
+  
+  							*:py3* *:python3*
+  The |:py3| and |:python3| commands work similar to |:python|.  A simple check
+! if the `:py3` command is wrong: >
+  	:py3 print("Hello")
+  <							*:py3file*
+  The |:py3file| command works similar to |:pyfile|.
+--- 394,400 ----
+  
+  							*:py3* *:python3*
+  The |:py3| and |:python3| commands work similar to |:python|.  A simple check
+! if the `:py3` command is working: >
+  	:py3 print("Hello")
+  <							*:py3file*
+  The |:py3file| command works similar to |:pyfile|.
+*** ../vim-7.3.910/src/eval.c	2013-04-15 18:25:55.000000000 +0200
+--- src/eval.c	2013-04-24 14:02:45.000000000 +0200
+***************
+*** 113,124 ****
+  static char *e_nofunc = N_("E130: Unknown function: %s");
+  static char *e_illvar = N_("E461: Illegal variable name: %s");
+  
+! /*
+!  * All user-defined global variables are stored in dictionary "globvardict".
+!  * "globvars_var" is the variable that is used for "g:".
+!  */
+! static dict_T		globvardict;
+! static dictitem_T	globvars_var;
+  #define globvarht globvardict.dv_hashtab
+  
+  /*
+--- 113,119 ----
+  static char *e_nofunc = N_("E130: Unknown function: %s");
+  static char *e_illvar = N_("E461: Illegal variable name: %s");
+  
+! static dictitem_T	globvars_var;		/* variable used for g: */
+  #define globvarht globvardict.dv_hashtab
+  
+  /*
+***************
+*** 370,381 ****
+  #define vv_list		vv_di.di_tv.vval.v_list
+  #define vv_tv		vv_di.di_tv
+  
+! /*
+!  * The v: variables are stored in dictionary "vimvardict".
+!  * "vimvars_var" is the variable that is used for the "l:" scope.
+!  */
+! static dict_T		vimvardict;
+! static dictitem_T	vimvars_var;
+  #define vimvarht  vimvardict.dv_hashtab
+  
+  static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
+--- 365,371 ----
+  #define vv_list		vv_di.di_tv.vval.v_list
+  #define vv_tv		vv_di.di_tv
+  
+! static dictitem_T	vimvars_var;		/* variable used for v: */
+  #define vimvarht  vimvardict.dv_hashtab
+  
+  static void prepare_vimvar __ARGS((int idx, typval_T *save_tv));
+*** ../vim-7.3.910/src/globals.h	2013-03-19 13:33:18.000000000 +0100
+--- src/globals.h	2013-04-24 13:57:51.000000000 +0200
+***************
+*** 180,185 ****
+--- 180,187 ----
+  EXTERN int	emsg_severe INIT(= FALSE);   /* use message of next of several
+  					       emsg() calls for throw */
+  EXTERN int	did_endif INIT(= FALSE);    /* just had ":endif" */
++ EXTERN dict_T	vimvardict;		    /* Dictionary with v: variables */
++ EXTERN dict_T	globvardict;		    /* Dictionary with g: variables */
+  #endif
+  EXTERN int	did_emsg;		    /* set by emsg() when the message
+  					       is displayed or thrown */
+*** ../vim-7.3.910/src/if_py_both.h	2013-04-24 13:47:36.000000000 +0200
+--- src/if_py_both.h	2013-04-24 13:54:23.000000000 +0200
+***************
+*** 1532,1539 ****
+      else if (strcmp(name, "width") == 0)
+  	return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
+  #endif
+      else if (strcmp(name,"__members__") == 0)
+! 	return Py_BuildValue("[sss]", "buffer", "cursor", "height");
+      else
+  	return NULL;
+  }
+--- 1532,1541 ----
+      else if (strcmp(name, "width") == 0)
+  	return Py_BuildValue("l", (long)(W_WIDTH(this->win)));
+  #endif
++     else if (strcmp(name, "vars") == 0)
++ 	return DictionaryNew(this->win->w_vars);
+      else if (strcmp(name,"__members__") == 0)
+! 	return Py_BuildValue("[ssss]", "buffer", "cursor", "height", "vars");
+      else
+  	return NULL;
+  }
+***************
+*** 2495,2502 ****
+  	return Py_BuildValue("s", this->buf->b_ffname);
+      else if (strcmp(name, "number") == 0)
+  	return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
+      else if (strcmp(name,"__members__") == 0)
+! 	return Py_BuildValue("[ss]", "name", "number");
+      else
+  	return NULL;
+  }
+--- 2497,2506 ----
+  	return Py_BuildValue("s", this->buf->b_ffname);
+      else if (strcmp(name, "number") == 0)
+  	return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
++     else if (strcmp(name, "vars") == 0)
++ 	return DictionaryNew(this->buf->b_vars);
+      else if (strcmp(name,"__members__") == 0)
+! 	return Py_BuildValue("[sss]", "name", "number", "vars");
+      else
+  	return NULL;
+  }
+*** ../vim-7.3.910/src/if_python3.c	2013-04-24 13:39:11.000000000 +0200
+--- src/if_python3.c	2013-04-24 13:54:23.000000000 +0200
+***************
+*** 1647,1652 ****
+--- 1647,1655 ----
+      Py_INCREF((PyObject *)(void *)&TheWindowList);
+      PyModule_AddObject(mod, "windows", (PyObject *)(void *)&TheWindowList);
+  
++     PyModule_AddObject(mod, "vars", DictionaryNew(&globvardict));
++     PyModule_AddObject(mod, "vvars", DictionaryNew(&vimvardict));
++ 
+  #define ADD_INT_CONSTANT(name, value) \
+      tmp = PyLong_FromLong(value); \
+      Py_INCREF(tmp); \
+*** ../vim-7.3.910/src/if_python.c	2013-04-24 13:47:36.000000000 +0200
+--- src/if_python.c	2013-04-24 13:54:33.000000000 +0200
+***************
+*** 1330,1335 ****
+--- 1330,1336 ----
+  {
+      PyObject *mod;
+      PyObject *dict;
++     PyObject *tmp;
+      /* The special value is removed from sys.path in Python_Init(). */
+      static char *(argv[2]) = {"/must>not&exist/foo", NULL};
+  
+***************
+*** 1353,1358 ****
+--- 1354,1365 ----
+      PyDict_SetItemString(dict, "buffers", (PyObject *)(void *)&TheBufferList);
+      PyDict_SetItemString(dict, "current", (PyObject *)(void *)&TheCurrent);
+      PyDict_SetItemString(dict, "windows", (PyObject *)(void *)&TheWindowList);
++     tmp = DictionaryNew(&globvardict);
++     PyDict_SetItemString(dict, "vars",    tmp);
++     Py_DECREF(tmp);
++     tmp = DictionaryNew(&vimvardict);
++     PyDict_SetItemString(dict, "vvars",   tmp);
++     Py_DECREF(tmp);
+      PyDict_SetItemString(dict, "VAR_LOCKED",    PyInt_FromLong(VAR_LOCKED));
+      PyDict_SetItemString(dict, "VAR_FIXED",     PyInt_FromLong(VAR_FIXED));
+      PyDict_SetItemString(dict, "VAR_SCOPE",     PyInt_FromLong(VAR_SCOPE));
+*** ../vim-7.3.910/src/testdir/test86.in	2013-04-05 19:32:30.000000000 +0200
+--- src/testdir/test86.in	2013-04-24 13:54:33.000000000 +0200
+***************
+*** 346,351 ****
+--- 346,364 ----
+  :$put =string(pyeval('l'))
+  :py l = ll[-10:10]
+  :$put =string(pyeval('l'))
++ :"
++ :" Vars
++ :let g:foo = 'bac'
++ :let w:abc = 'def'
++ :let b:baz = 'bar'
++ :try
++ :  throw "Abc"
++ :catch
++ :  put =pyeval('vim.vvars[''exception'']')
++ :endtry
++ :put =pyeval('vim.vars[''foo'']')
++ :put =pyeval('vim.current.window.vars[''abc'']')
++ :put =pyeval('vim.current.buffer.vars[''baz'']')
+  :endfun
+  :"
+  :call Test()
+*** ../vim-7.3.910/src/testdir/test86.ok	2013-04-24 13:04:21.000000000 +0200
+--- src/testdir/test86.ok	2013-04-24 13:54:33.000000000 +0200
+***************
+*** 76,78 ****
+--- 76,82 ----
+  [0, 1, 2, 3, 4, 5]
+  [0, 1, 2, 3, 4, 5]
+  [0, 1, 2, 3, 4, 5]
++ Abc
++ bac
++ def
++ bar
+*** ../vim-7.3.910/src/testdir/test87.in	2013-02-13 14:17:00.000000000 +0100
+--- src/testdir/test87.in	2013-04-24 13:54:33.000000000 +0200
+***************
+*** 315,320 ****
+--- 315,333 ----
+  :py3 trace_main()
+  :py3 sys.settrace(None)
+  :$put =string(l)
++ :"
++ :" Vars
++ :let g:foo = 'bac'
++ :let w:abc = 'def'
++ :let b:baz = 'bar'
++ :try
++ :  throw "Abc"
++ :catch
++ :  put =py3eval('vim.vvars[''exception'']')
++ :endtry
++ :put =py3eval('vim.vars[''foo'']')
++ :put =py3eval('vim.current.window.vars[''abc'']')
++ :put =py3eval('vim.current.buffer.vars[''baz'']')
+  :endfun
+  :"
+  :call Test()
+*** ../vim-7.3.910/src/testdir/test87.ok	2013-04-24 13:04:21.000000000 +0200
+--- src/testdir/test87.ok	2013-04-24 13:54:33.000000000 +0200
+***************
+*** 65,67 ****
+--- 65,71 ----
+  vim:	Vim(let):E861:
+  [1]
+  [1, 10, 11, 10, 11, 10, 11, 10, 11, 10, 11, 10, 1]
++ Abc
++ bac
++ def
++ bar
+*** ../vim-7.3.910/src/version.c	2013-04-24 13:47:36.000000000 +0200
+--- src/version.c	2013-04-24 13:54:00.000000000 +0200
+***************
+*** 730,731 ****
+--- 730,733 ----
+  {   /* Add new patch number below this line */
++ /**/
++     911,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+222. You send more than 20 personal e-mails a day.
+
+ /// 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    ///