diff --git a/Doc/library/venv.rst b/Doc/library/venv.rst
index 5c1e9ad..e5c91e4 100644
--- a/Doc/library/venv.rst
+++ b/Doc/library/venv.rst
@@ -15,28 +15,26 @@
 
 --------------
 
-The :mod:`venv` module provides support for creating lightweight
-"virtual environments" with their own site directories, optionally
-isolated from system site directories.  Each virtual environment has
-its own Python binary (allowing creation of environments with various
-Python versions) and can have its own independent set of installed
-Python packages in its site directories.
+The :mod:`venv` module provides support for creating lightweight "virtual
+environments" with their own site directories, optionally isolated from system
+site directories.  Each virtual environment has its own Python binary (allowing
+creation of environments with various Python versions) and can have its own
+independent set of installed Python packages in its site directories.
+
 
 Creating virtual environments
 -----------------------------
 
-Creation of virtual environments is simplest executing the ``pyvenv``
-script::
+Creation of virtual environments is simplest executing the ``pyvenv`` script::
 
     pyvenv /path/to/new/virtual/environment
 
 Running this command creates the target directory (creating any parent
-directories that don't exist already) and places a ``pyvenv.cfg`` file
-in it with a ``home`` key pointing to the Python installation the
-command was run from.  It also creates a ``bin`` (or ``Scripts`` on
-Windows) subdirectory containing a copy of the ``python`` binary (or
-binaries, in the case of Windows).
-It also creates an (initially empty) ``lib/pythonX.Y/site-packages``
+directories that don't exist already) and places a ``pyvenv.cfg`` file in it
+with a ``home`` key pointing to the Python installation the command was run
+from.  It also creates a ``bin`` (or ``Scripts`` on Windows) subdirectory
+containing a copy of the ``python`` binary (or binaries, in the case of
+Windows).  It also creates an (initially empty) ``lib/pythonX.Y/site-packages``
 subdirectory (on Windows, this is ``Lib\site-packages``).
 
 .. highlight:: none
@@ -71,119 +69,131 @@
       --upgrade              Upgrade the environment directory to use this version
                              of Python, assuming Python has been upgraded in-place.
 
-If the target directory already exists an error will be raised, unless
-the ``--clear`` or ``--upgrade`` option was provided.
+If the target directory already exists an error will be raised, unless the
+``--clear`` or ``--upgrade`` option was provided.
 
 The created ``pyvenv.cfg`` file also includes the
-``include-system-site-packages`` key, set to ``true`` if ``venv`` is
-run with the ``--system-site-packages`` option, ``false`` otherwise.
+``include-system-site-packages`` key, set to ``true`` if ``venv`` is run with
+the ``--system-site-packages`` option, ``false`` otherwise.
 
-Multiple paths can be given to ``pyvenv``, in which case an identical
-virtualenv will be created, according to the given options, at each
-provided path.
+Multiple paths can be given to ``pyvenv``, in which case an identical virtualenv
+will be created, according to the given options, at each provided path.
 
 
 API
 ---
 
-The high-level method described above makes use of a simple API which provides
-mechanisms for third-party virtual environment creators to customize
-environment creation according to their needs.
-
-The :class:`EnvBuilder` class accepts the following keyword arguments on
-instantiation:
-
-   * ``system_site_packages`` - A Boolean value indicating that the
-     system Python site-packages should be available to the
-     environment (defaults to ``False``).
-
-   * ``clear`` - A Boolean value which, if True, will delete any
-     existing target directory instead of raising an exception
-     (defaults to ``False``).
-
-   * ``symlinks`` - A Boolean value indicating whether to attempt
-     to symlink the Python binary (and any necessary DLLs or other
-     binaries, e.g. ``pythonw.exe``), rather than copying. Defaults to
-     ``True`` on Linux and Unix systems, but ``False`` on Windows and
-     Mac OS X.
-
-The returned env-builder is an object which has a method, ``create``,
-which takes as required argument the path (absolute or relative to the current
-directory) of the target directory which is to contain the virtual environment.
-The ``create`` method will either create the environment in the specified
-directory, or raise an appropriate exception.
-
-Creators of third-party virtual environment tools will be free to use
-the provided ``EnvBuilder`` class as a base class.
-
 .. highlight:: python
 
-The ``venv`` module will also provide a module-level function as a
-convenience::
+The high-level method described above makes use of a simple API which provides
+mechanisms for third-party virtual environment creators to customize environment
+creation according to their needs, the :class:`EnvBuilder` class.
 
-    def create(env_dir,
-               system_site_packages=False, clear=False, symlinks=False):
-        builder = EnvBuilder(
-            system_site_packages=system_site_packages,
-            clear=clear,
-            symlinks=symlinks)
-        builder.create(env_dir)
+.. class:: EnvBuilder(system_site_packages=False, clear=False, symlinks=False, upgrade=False)
 
-The ``create`` method of the ``EnvBuilder`` class illustrates the
-hooks available for subclass customization::
+    The :class:`EnvBuilder` class accepts the following keyword arguments on
+    instantiation:
 
-    def create(self, env_dir):
-        """
-        Create a virtualized Python environment in a directory.
-        env_dir is the target directory to create an environment in.
-        """
-        env_dir = os.path.abspath(env_dir)
-        context = self.create_directories(env_dir)
-        self.create_configuration(context)
-        self.setup_python(context)
-        self.setup_scripts(context)
-        self.post_setup(context)
+    * ``system_site_packages`` -- a Boolean value indicating that the system Python
+      site-packages should be available to the environment (defaults to ``False``).
 
-Each of the methods ``create_directories``, ``create_configuration``,
-``setup_python``, ``setup_scripts`` and ``post_setup`` can be
-overridden.  The functions of these methods are:
+    * ``clear`` -- a Boolean value which, if True, will delete any existing target
+      directory instead of raising an exception (defaults to ``False``).
 
-   * ``create_directories`` - creates the environment directory and
-     all necessary directories, and returns a context object. This is
-     just a holder for attributes (such as paths), for use by the
-     other methods.
+    * ``symlinks`` -- a Boolean value indicating whether to attempt to symlink the
+      Python binary (and any necessary DLLs or other binaries,
+      e.g. ``pythonw.exe``), rather than copying. Defaults to ``True`` on Linux and
+      Unix systems, but ``False`` on Windows and Mac OS X.
 
-   * ``create_configuration`` - creates the ``pyvenv.cfg``
-     configuration file in the environment.
+    .. XXX it also takes "upgrade"!
 
-   * ``setup_python`` - creates a copy of the Python executable (and,
-     under Windows, DLLs) in the environment.
 
-   * ``setup_scripts`` - Installs activation scripts appropriate to the
-     platform into the virtual environment.
+    Creators of third-party virtual environment tools will be free to use the
+    provided ``EnvBuilder`` class as a base class.
 
-   * ``post_setup`` - A placeholder method which can be overridden
-     in third party implementations to pre-install packages in the
-     virtual environment or perform other post-creation steps.
+    The returned env-builder is an object which has a method, ``create``:
 
-In addition, ``EnvBuilder`` provides an ``install_scripts`` utility
-method that can be called from ``setup_scripts`` or ``post_setup`` in
-subclasses to assist in installing custom scripts into the virtual
-environment. The method accepts as arguments the context object (see
-above) and a path to a directory. The directory should contain
-subdirectories "common", "posix", "nt", each containing scripts
-destined for the bin directory in the environment. The contents of
-"common" and the directory corresponding to ``os.name`` are copied
-after some text replacement of placeholders:
+    .. method:: create(env_dir)
 
-* ``__VENV_DIR__`` is replaced with the absolute path of the
-  environment directory.
+        This method takes as required argument the path (absolute or relative to
+        the current directory) of the target directory which is to contain the
+        virtual environment.  The ``create`` method will either create the
+        environment in the specified directory, or raise an appropriate
+        exception.
 
-* ``__VENV_NAME__`` is replaced with the environment name (final path
-  segment of environment directory).
+        The ``create`` method of the ``EnvBuilder`` class illustrates the hooks
+        available for subclass customization::
 
-* ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
-  (either ``bin`` or ``Scripts``).
+            def create(self, env_dir):
+                """
+                Create a virtualized Python environment in a directory.
+                env_dir is the target directory to create an environment in.
+                """
+                env_dir = os.path.abspath(env_dir)
+                context = self.create_directories(env_dir)
+                self.create_configuration(context)
+                self.setup_python(context)
+                self.setup_scripts(context)
+                self.post_setup(context)
 
-* ``__VENV_PYTHON__`` is replaced with the absolute path of the
-  environment's executable.
+        Each of the methods :meth:`create_directories`,
+        :meth:`create_configuration`, :meth:`setup_python`,
+        :meth:`setup_scripts` and :meth:`post_setup` can be overridden.
+
+    .. method:: create_directories(env_dir)
+
+        Creates the environment directory and all necessary directories, and
+        returns a context object.  This is just a holder for attributes (such as
+        paths), for use by the other methods.
+
+    .. method:: create_configuration(context)
+
+        Creates the ``pyvenv.cfg`` configuration file in the environment.
+
+    .. method:: setup_python(context)
+
+        Creates a copy of the Python executable (and, under Windows, DLLs) in
+        the environment.
+
+    .. method:: setup_scripts(context)
+
+        Installs activation scripts appropriate to the platform into the virtual
+        environment.
+
+    .. method:: post_setup(context)
+
+        A placeholder method which can be overridden in third party
+        implementations to pre-install packages in the virtual environment or
+        perform other post-creation steps.
+
+    In addition, :class:`EnvBuilder` provides this utility method that can be
+    called from :meth:`setup_scripts` or :meth:`post_setup` in subclasses to
+    assist in installing custom scripts into the virtual environment.
+
+    .. method:: install_scripts(context, path)
+
+        *path* is the path to a directory that should contain subdirectories
+        "common", "posix", "nt", each containing scripts destined for the bin
+        directory in the environment.  The contents of "common" and the
+        directory corresponding to :data:`os.name` are copied after some text
+        replacement of placeholders:
+
+        * ``__VENV_DIR__`` is replaced with the absolute path of the environment
+          directory.
+
+        * ``__VENV_NAME__`` is replaced with the environment name (final path
+          segment of environment directory).
+
+        * ``__VENV_BIN_NAME__`` is replaced with the name of the bin directory
+          (either ``bin`` or ``Scripts``).
+
+        * ``__VENV_PYTHON__`` is replaced with the absolute path of the
+          environment's executable.
+
+
+There is also a module-level convenience function:
+
+.. function:: create(env_dir, system_site_packages=False, clear=False, symlinks=False)
+
+    Create an :class:`EnvBuilder` with the given keyword arguments, and call its
+    :meth:`~EnvBuilder.create` method with the *env_dir* argument.
