diff --git a/Lib/test/test_rlcompleter.py b/Lib/test/test_rlcompleter.py
new file mode 100644
index 0000000..29e6a1b
--- /dev/null
+++ b/Lib/test/test_rlcompleter.py
@@ -0,0 +1,73 @@
+from test import support
+import unittest
+import builtins
+import rlcompleter
+
+class CompleteMe:
+    """ Trivial class used in testing rlcompleter.Completer. """
+    spam = 1
+
+
+class TestRlcompleter(unittest.TestCase):
+    def setUp(self):
+        self.stdcompleter = rlcompleter.Completer()
+        self.completer = rlcompleter.Completer(dict(spam=int,
+                                                    egg=str,
+                                                    CompleteMe=CompleteMe))
+
+        # forces stdcompleter to bind builtins namespace
+        self.stdcompleter.complete('', 0)
+
+    def test_namespace(self):
+        class A(dict):
+            pass
+        class B(list):
+            pass
+
+        self.assertTrue(self.stdcompleter.use_main_ns)
+        self.assertFalse(self.completer.use_main_ns)
+        self.assertFalse(rlcompleter.Completer(A()).use_main_ns)
+        self.assertRaises(TypeError, rlcompleter.Completer, B((1,)))
+
+    def test_global_matches(self):
+        # test with builtins namespace
+        self.assertEqual(self.stdcompleter.global_matches('di'),
+                         [x+'(' for x in dir(builtins) if x.startswith('di')])
+        self.assertEqual(self.stdcompleter.global_matches('st'),
+                         [x+'(' for x in dir(builtins) if x.startswith('st')])
+        self.assertEqual(self.stdcompleter.global_matches('akaksajadhak'), [])
+
+        # test with a customized namespace
+        self.assertEqual(self.completer.global_matches('CompleteM'),
+                         ['CompleteMe('])
+        self.assertEqual(self.completer.global_matches('eg'),
+                         ['egg('])
+        # XXX: see issue5256
+        self.assertEqual(self.completer.global_matches('CompleteM'),
+                         ['CompleteMe('])
+
+    def test_attr_matches(self):
+        # test with builtins namespace
+        self.assertEqual(self.stdcompleter.attr_matches('str.s'),
+                         ['str.{}('.format(x) for x in dir(str)
+                          if x.startswith('s')])
+        self.assertEqual(self.stdcompleter.attr_matches('tuple.foospamegg'), [])
+
+        # test with a customized namespace
+        self.assertEqual(self.completer.attr_matches('CompleteMe.sp'),
+                         ['CompleteMe.spam'])
+        self.assertEqual(self.completer.attr_matches('Completeme.egg'), [])
+
+        CompleteMe.me = CompleteMe
+        self.assertEqual(self.completer.attr_matches('CompleteMe.me.me.sp'),
+                         ['CompleteMe.me.me.spam'])
+        self.assertEqual(self.completer.attr_matches('egg.s'),
+                         ['egg.{}('.format(x) for x in dir(str)
+                          if x.startswith('s')])
+
+def test_main():
+    support.run_unittest(TestRlcompleter)
+
+
+if __name__ == '__main__':
+    test_main()
diff --git a/Lib/test/test_sundry.py b/Lib/test/test_sundry.py
index 5d48a89..919fb84 100644
--- a/Lib/test/test_sundry.py
+++ b/Lib/test/test_sundry.py
@@ -59,7 +59,6 @@
             import pdb
             import pstats
             import py_compile
-            import rlcompleter
             import sched
             import sndhdr
             import symbol
