diff --git a/Doc/library/dircache.rst b/Doc/library/dircache.rst
deleted file mode 100644
index 28aa667..0000000
--- a/Doc/library/dircache.rst
+++ /dev/null
@@ -1,56 +0,0 @@
-
-:mod:`dircache` --- Cached directory listings
-=============================================
-
-.. module:: dircache
-   :synopsis: Return directory listing, with cache mechanism.
-.. sectionauthor:: Moshe Zadka <moshez@zadka.site.co.il>
-
-
-The :mod:`dircache` module defines a function for reading directory listing
-using a cache, and cache invalidation using the *mtime* of the directory.
-Additionally, it defines a function to annotate directories by appending a
-slash.
-
-The :mod:`dircache` module defines the following functions:
-
-
-.. function:: reset()
-
-   Resets the directory cache.
-
-
-.. function:: listdir(path)
-
-   Return a directory listing of *path*, as gotten from :func:`os.listdir`. Note
-   that unless *path* changes, further call to :func:`listdir` will not re-read the
-   directory structure.
-
-   Note that the list returned should be regarded as read-only. (Perhaps a future
-   version should change it to return a tuple?)
-
-
-.. function:: opendir(path)
-
-   Same as :func:`listdir`. Defined for backwards compatibility.
-
-
-.. function:: annotate(head, list)
-
-   Assume *list* is a list of paths relative to *head*, and append, in place, a
-   ``'/'`` to each path which points to a directory.
-
-::
-
-   >>> import dircache
-   >>> a = dircache.listdir('/')
-   >>> a = a[:] # Copy the return value so we can change 'a'
-   >>> a
-   ['bin', 'boot', 'cdrom', 'dev', 'etc', 'floppy', 'home', 'initrd', 'lib', 'lost+
-   found', 'mnt', 'proc', 'root', 'sbin', 'tmp', 'usr', 'var', 'vmlinuz']
-   >>> dircache.annotate('/', a)
-   >>> a
-   ['bin/', 'boot/', 'cdrom/', 'dev/', 'etc/', 'floppy/', 'home/', 'initrd/', 'lib/
-   ', 'lost+found/', 'mnt/', 'proc/', 'root/', 'sbin/', 'tmp/', 'usr/', 'var/', 'vm
-   linuz']
-
diff --git a/Doc/library/filesys.rst b/Doc/library/filesys.rst
index e5b5e44..c3d9df0 100644
--- a/Doc/library/filesys.rst
+++ b/Doc/library/filesys.rst
@@ -23,7 +23,6 @@
    fnmatch.rst
    linecache.rst
    shutil.rst
-   dircache.rst
    macpath.rst
 
 
diff --git a/Lib/dircache.py b/Lib/dircache.py
deleted file mode 100644
index 78ec7fe..0000000
--- a/Lib/dircache.py
+++ /dev/null
@@ -1,38 +0,0 @@
-"""Read and cache directory listings.
-
-The listdir() routine returns a sorted list of the files in a directory,
-using a cache to avoid reading the directory more often than necessary.
-The annotate() routine appends slashes to directories."""
-
-import os
-
-__all__ = ["listdir", "opendir", "annotate", "reset"]
-
-cache = {}
-
-def reset():
-    """Reset the cache completely."""
-    global cache
-    cache = {}
-
-def listdir(path):
-    """List directory contents, using cache."""
-    try:
-        cached_mtime, list = cache[path]
-        del cache[path]
-    except KeyError:
-        cached_mtime, list = -1, []
-    mtime = os.stat(path).st_mtime
-    if mtime != cached_mtime:
-        list = os.listdir(path)
-        list.sort()
-    cache[path] = mtime, list
-    return list
-
-opendir = listdir # XXX backward compatibility
-
-def annotate(head, list):
-    """Add '/' suffixes to directories."""
-    for i in range(len(list)):
-        if os.path.isdir(os.path.join(head, list[i])):
-            list[i] = list[i] + '/'
diff --git a/Lib/test/regrtest.py b/Lib/test/regrtest.py
index 675cea3..bbc81bc 100755
--- a/Lib/test/regrtest.py
+++ b/Lib/test/regrtest.py
@@ -725,7 +725,7 @@
 
 def dash_R_cleanup(fs, ps, pic, abcs):
     import gc, copy_reg
-    import _strptime, linecache, dircache
+    import _strptime, linecache
     import urlparse, urllib, urllib2, mimetypes, doctest
     import struct, filecmp, _abcoll
     from distutils.dir_util import _path_created
@@ -762,7 +762,6 @@
     urlparse.clear_cache()
     urllib.urlcleanup()
     urllib2.install_opener(None)
-    dircache.reset()
     linecache.clearcache()
     mimetypes._default_mime_types()
     filecmp._cache.clear()
diff --git a/Lib/test/test_dircache.py b/Lib/test/test_dircache.py
deleted file mode 100644
index 68f6fc2..0000000
--- a/Lib/test/test_dircache.py
+++ /dev/null
@@ -1,73 +0,0 @@
-"""
-  Test cases for the dircache module
-  Nick Mathewson
-"""
-
-import unittest
-from test.test_support import run_unittest, TESTFN
-import dircache, os, time, sys, tempfile
-
-
-class DircacheTests(unittest.TestCase):
-    def setUp(self):
-        self.tempdir = tempfile.mkdtemp()
-
-    def tearDown(self):
-        for fname in os.listdir(self.tempdir):
-            self.delTemp(fname)
-        os.rmdir(self.tempdir)
-
-    def writeTemp(self, fname):
-        f = open(os.path.join(self.tempdir, fname), 'w')
-        f.close()
-
-    def mkdirTemp(self, fname):
-        os.mkdir(os.path.join(self.tempdir, fname))
-
-    def delTemp(self, fname):
-        fname = os.path.join(self.tempdir, fname)
-        if os.path.isdir(fname):
-            os.rmdir(fname)
-        else:
-            os.unlink(fname)
-
-    def test_listdir(self):
-        ## SUCCESSFUL CASES
-        entries = dircache.listdir(self.tempdir)
-        self.assertEquals(entries, [])
-
-        # Check that cache is actually caching, not just passing through.
-        self.assert_(dircache.listdir(self.tempdir) is entries)
-
-        # Directories aren't "files" on Windows, and directory mtime has
-        # nothing to do with when files under a directory get created.
-        # That is, this test can't possibly work under Windows -- dircache
-        # is only good for capturing a one-shot snapshot there.
-
-        if sys.platform[:3] not in ('win', 'os2'):
-            # Sadly, dircache has the same granularity as stat.mtime, and so
-            # can't notice any changes that occurred within 1 sec of the last
-            # time it examined a directory.
-            time.sleep(1)
-            self.writeTemp("test1")
-            entries = dircache.listdir(self.tempdir)
-            self.assertEquals(entries, ['test1'])
-            self.assert_(dircache.listdir(self.tempdir) is entries)
-
-        ## UNSUCCESSFUL CASES
-        self.assertRaises(OSError, dircache.listdir, self.tempdir+"_nonexistent")
-
-    def test_annotate(self):
-        self.writeTemp("test2")
-        self.mkdirTemp("A")
-        lst = ['A', 'test2', 'test_nonexistent']
-        dircache.annotate(self.tempdir, lst)
-        self.assertEquals(lst, ['A/', 'test2', 'test_nonexistent'])
-
-
-def test_main():
-    run_unittest(DircacheTests)
-
-
-if __name__ == "__main__":
-    test_main()
diff --git a/Misc/NEWS b/Misc/NEWS
index b5023e5..9c6feeb 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -21,6 +21,8 @@
 Library
 -------
 
+- The dircache module has been removed.
+
 - The Canvas module has been removed.
 
 - The Decimal module gained the magic methods __round__, __ceil__,
