Move Doc/tools/sphinxext content to Doc/tools, there is no need for the nested subdirectory anymore.
diff --git a/Doc/Makefile b/Doc/Makefile
index fee7fc7..5b5f68a 100644
--- a/Doc/Makefile
+++ b/Doc/Makefile
@@ -8,7 +8,7 @@
 SPHINXBUILD  = sphinx-build
 PAPER        =
 SOURCES      =
-DISTVERSION  = $(shell $(PYTHON) tools/sphinxext/patchlevel.py)
+DISTVERSION  = $(shell $(PYTHON) tools/patchlevel.py)
 
 ALLSPHINXOPTS = -b $(BUILDER) -d build/doctrees -D latex_paper_size=$(PAPER) \
                 $(SPHINXOPTS) . build/$(BUILDER) $(SOURCES)
@@ -79,7 +79,7 @@
 	@$(MAKE) build BUILDER=$(BUILDER) || { \
 	echo "Suspicious check complete; look for any errors in the above output" \
 	     "or in build/$(BUILDER)/suspicious.csv.  If all issues are false" \
-	     "positives, append that file to tools/sphinxext/susp-ignored.csv."; \
+	     "positives, append that file to tools/susp-ignored.csv."; \
 	false; }
 
 coverage: BUILDER = coverage
diff --git a/Doc/README.txt b/Doc/README.txt
index 6df12ab..952b320 100644
--- a/Doc/README.txt
+++ b/Doc/README.txt
@@ -79,8 +79,7 @@
 
  * "pydoc-topics", which builds a Python module containing a dictionary with
    plain text documentation for the labels defined in
-   `tools/sphinxext/pyspecific.py` -- pydoc needs these to show topic and
-   keyword help.
+   `tools/pyspecific.py` -- pydoc needs these to show topic and keyword help.
 
  * "suspicious", which checks the parsed markup for text that looks like
    malformed and thus unconverted reST.
diff --git a/Doc/conf.py b/Doc/conf.py
index e1c0637..7546c51 100644
--- a/Doc/conf.py
+++ b/Doc/conf.py
@@ -7,14 +7,14 @@
 # that aren't pickleable (module imports are okay, they're removed automatically).
 
 import sys, os, time
-sys.path.append(os.path.abspath('tools/sphinxext'))
+sys.path.append(os.path.abspath('tools'))
 
 # General configuration
 # ---------------------
 
 extensions = ['sphinx.ext.coverage', 'sphinx.ext.doctest',
               'pyspecific', 'c_annotations']
-templates_path = ['tools/sphinxext']
+templates_path = ['tools']
 
 # General substitutions.
 project = 'Python'
@@ -96,7 +96,7 @@
 html_use_opensearch = 'http://docs.python.org/' + version
 
 # Additional static files.
-html_static_path = ['tools/sphinxext/static']
+html_static_path = ['tools/static']
 
 # Output file base name for HTML help builder.
 htmlhelp_basename = 'python' + release.replace('.', '')
diff --git a/Doc/make.bat b/Doc/make.bat
index b26826e..c8f6082 100644
--- a/Doc/make.bat
+++ b/Doc/make.bat
@@ -12,7 +12,7 @@
 if NOT DEFINED ProgramFiles(x86) set _PRGMFLS=%ProgramFiles%
 if "%HTMLHELP%" EQU "" set HTMLHELP=%_PRGMFLS%\HTML Help Workshop\hhc.exe
 
-if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/sphinxext/patchlevel.py`) do set DISTVERSION=%%v
+if "%DISTVERSION%" EQU "" for /f "usebackq" %%v in (`%PYTHON% tools/patchlevel.py`) do set DISTVERSION=%%v
 
 if "%BUILDDIR%" EQU "" set BUILDDIR=build
 
diff --git a/Doc/tools/sphinxext/c_annotations.py b/Doc/tools/c_annotations.py
similarity index 100%
rename from Doc/tools/sphinxext/c_annotations.py
rename to Doc/tools/c_annotations.py
diff --git a/Doc/tools/sphinxext/download.html b/Doc/tools/download.html
similarity index 100%
rename from Doc/tools/sphinxext/download.html
rename to Doc/tools/download.html
diff --git a/Doc/tools/sphinxext/indexcontent.html b/Doc/tools/indexcontent.html
similarity index 100%
rename from Doc/tools/sphinxext/indexcontent.html
rename to Doc/tools/indexcontent.html
diff --git a/Doc/tools/sphinxext/indexsidebar.html b/Doc/tools/indexsidebar.html
similarity index 100%
rename from Doc/tools/sphinxext/indexsidebar.html
rename to Doc/tools/indexsidebar.html
diff --git a/Doc/tools/sphinxext/layout.html b/Doc/tools/layout.html
similarity index 100%
rename from Doc/tools/sphinxext/layout.html
rename to Doc/tools/layout.html
diff --git a/Doc/tools/sphinxext/opensearch.xml b/Doc/tools/opensearch.xml
similarity index 100%
rename from Doc/tools/sphinxext/opensearch.xml
rename to Doc/tools/opensearch.xml
diff --git a/Doc/tools/sphinxext/patchlevel.py b/Doc/tools/patchlevel.py
similarity index 100%
rename from Doc/tools/sphinxext/patchlevel.py
rename to Doc/tools/patchlevel.py
diff --git a/Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css b/Doc/tools/pydoctheme/static/pydoctheme.css
similarity index 100%
rename from Doc/tools/sphinxext/pydoctheme/static/pydoctheme.css
rename to Doc/tools/pydoctheme/static/pydoctheme.css
diff --git a/Doc/tools/sphinxext/pydoctheme/theme.conf b/Doc/tools/pydoctheme/theme.conf
similarity index 100%
rename from Doc/tools/sphinxext/pydoctheme/theme.conf
rename to Doc/tools/pydoctheme/theme.conf
diff --git a/Doc/tools/sphinxext/pyspecific.py b/Doc/tools/pyspecific.py
similarity index 100%
rename from Doc/tools/sphinxext/pyspecific.py
rename to Doc/tools/pyspecific.py
diff --git a/Doc/tools/roman.py b/Doc/tools/roman.py
deleted file mode 100644
index 89ef617..0000000
--- a/Doc/tools/roman.py
+++ /dev/null
@@ -1,80 +0,0 @@
-"""Convert to and from Roman numerals"""
-
-__author__ = "Mark Pilgrim (f8dy@diveintopython.org)"
-__version__ = "1.4"
-__date__ = "8 August 2001"
-__copyright__ = """Copyright (c) 2001 Mark Pilgrim
-
-This program is part of "Dive Into Python", a free Python tutorial for
-experienced programmers.  Visit http://diveintopython.org/ for the
-latest version.
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the Python 2.1.1 license, available at
-http://www.python.org/2.1.1/license.html
-"""
-
-import re
-
-#Define exceptions
-class RomanError(Exception): pass
-class OutOfRangeError(RomanError): pass
-class NotIntegerError(RomanError): pass
-class InvalidRomanNumeralError(RomanError): pass
-
-#Define digit mapping
-romanNumeralMap = (('M',  1000),
-                   ('CM', 900),
-                   ('D',  500),
-                   ('CD', 400),
-                   ('C',  100),
-                   ('XC', 90),
-                   ('L',  50),
-                   ('XL', 40),
-                   ('X',  10),
-                   ('IX', 9),
-                   ('V',  5),
-                   ('IV', 4),
-                   ('I',  1))
-
-def toRoman(n):
-    """convert integer to Roman numeral"""
-    if not (0 < n < 5000):
-        raise OutOfRangeError("number out of range (must be 1..4999)")
-    if int(n) != n:
-        raise NotIntegerError("decimals can not be converted")
-
-    result = ""
-    for numeral, integer in romanNumeralMap:
-        while n >= integer:
-            result += numeral
-            n -= integer
-    return result
-
-#Define pattern to detect valid Roman numerals
-romanNumeralPattern = re.compile("""
-    ^                   # beginning of string
-    M{0,4}              # thousands - 0 to 4 M's
-    (CM|CD|D?C{0,3})    # hundreds - 900 (CM), 400 (CD), 0-300 (0 to 3 C's),
-                        #            or 500-800 (D, followed by 0 to 3 C's)
-    (XC|XL|L?X{0,3})    # tens - 90 (XC), 40 (XL), 0-30 (0 to 3 X's),
-                        #        or 50-80 (L, followed by 0 to 3 X's)
-    (IX|IV|V?I{0,3})    # ones - 9 (IX), 4 (IV), 0-3 (0 to 3 I's),
-                        #        or 5-8 (V, followed by 0 to 3 I's)
-    $                   # end of string
-    """ ,re.VERBOSE)
-
-def fromRoman(s):
-    """convert Roman numeral to integer"""
-    if not s:
-        raise InvalidRomanNumeralError('Input can not be blank')
-    if not romanNumeralPattern.search(s):
-        raise InvalidRomanNumeralError('Invalid Roman numeral: %s' % s)
-
-    result = 0
-    index = 0
-    for numeral, integer in romanNumeralMap:
-        while s[index:index+len(numeral)] == numeral:
-            result += integer
-            index += len(numeral)
-    return result
diff --git a/Doc/tools/sphinxext/static/basic.css b/Doc/tools/static/basic.css
similarity index 100%
rename from Doc/tools/sphinxext/static/basic.css
rename to Doc/tools/static/basic.css
diff --git a/Doc/tools/sphinxext/static/copybutton.js b/Doc/tools/static/copybutton.js
similarity index 100%
rename from Doc/tools/sphinxext/static/copybutton.js
rename to Doc/tools/static/copybutton.js
diff --git a/Doc/tools/sphinxext/static/py.png b/Doc/tools/static/py.png
similarity index 100%
rename from Doc/tools/sphinxext/static/py.png
rename to Doc/tools/static/py.png
Binary files differ
diff --git a/Doc/tools/sphinxext/static/sidebar.js b/Doc/tools/static/sidebar.js
similarity index 100%
rename from Doc/tools/sphinxext/static/sidebar.js
rename to Doc/tools/static/sidebar.js
diff --git a/Doc/tools/sphinxext/static/version_switch.js b/Doc/tools/static/version_switch.js
similarity index 100%
rename from Doc/tools/sphinxext/static/version_switch.js
rename to Doc/tools/static/version_switch.js
diff --git a/Doc/tools/sphinxext/susp-ignored.csv b/Doc/tools/susp-ignored.csv
similarity index 100%
rename from Doc/tools/sphinxext/susp-ignored.csv
rename to Doc/tools/susp-ignored.csv
diff --git a/Doc/tools/sphinxext/suspicious.py b/Doc/tools/suspicious.py
similarity index 100%
rename from Doc/tools/sphinxext/suspicious.py
rename to Doc/tools/suspicious.py
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 5393426..0b56f25 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -1638,7 +1638,7 @@
     # in pydoc_data/topics.py.
     #
     # CAUTION: if you change one of these dictionaries, be sure to adapt the
-    #          list of needed labels in Doc/tools/sphinxext/pyspecific.py and
+    #          list of needed labels in Doc/tools/pyspecific.py and
     #          regenerate the pydoc_data/topics.py file by running
     #              make pydoc-topics
     #          in Doc/ and copying the output file into the Lib/ directory.