diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py
index 8a8c0ee..72f1397 100644
--- a/Lib/_abcoll.py
+++ b/Lib/_abcoll.py
@@ -9,6 +9,7 @@
 """
 
 from abc import ABCMeta, abstractmethod
+import sys
 
 __all__ = ["Hashable", "Iterable", "Iterator",
            "Sized", "Container", "Callable",
diff --git a/Lib/decimal.py b/Lib/decimal.py
index e1d69fd..180b177 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -5423,20 +5423,20 @@
 # other meaning for \d than the numbers [0-9].
 
 import re
-_parser = re.compile(r"""     # A numeric string consists of:
+_parser = re.compile(r"""        # A numeric string consists of:
 #    \s*
-    (?P<sign>[-+])?           # an optional sign, followed by either...
+    (?P<sign>[-+])?              # an optional sign, followed by either...
     (
-        (?=\d|\.\d)           # ...a number (with at least one digit)
-        (?P<int>\d*)          # consisting of a (possibly empty) integer part
-        (\.(?P<frac>\d*))?    # followed by an optional fractional part
-        (E(?P<exp>[-+]?\d+))? # followed by an optional exponent, or...
+        (?=[0-9]|\.[0-9])        # ...a number (with at least one digit)
+        (?P<int>[0-9]*)          # having a (possibly empty) integer part
+        (\.(?P<frac>[0-9]*))?    # followed by an optional fractional part
+        (E(?P<exp>[-+]?[0-9]+))? # followed by an optional exponent, or...
     |
-        Inf(inity)?           # ...an infinity, or...
+        Inf(inity)?              # ...an infinity, or...
     |
-        (?P<signal>s)?        # ...an (optionally signaling)
-        NaN                   # NaN
-        (?P<diag>\d*)         # with (possibly empty) diagnostic information.
+        (?P<signal>s)?           # ...an (optionally signaling)
+        NaN                      # NaN
+        (?P<diag>[0-9]*)         # with (possibly empty) diagnostic info.
     )
 #    \s*
     \Z
diff --git a/Lib/fractions.py b/Lib/fractions.py
index d3fd920..329a16f 100755
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -201,7 +201,7 @@
 
     def __repr__(self):
         """repr(self)"""
-        return ('Fraction(%r, %r)' % (self._numerator, self._denominator))
+        return ('Fraction(%s, %s)' % (self._numerator, self._denominator))
 
     def __str__(self):
         """str(self)"""
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 645a7ba..4123506 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -152,8 +152,7 @@
             h.setLevel(logging._levelNames[level])
         if len(fmt):
             h.setFormatter(formatters[fmt])
-        #temporary hack for FileHandler and MemoryHandler.
-        if klass == logging.handlers.MemoryHandler:
+        if issubclass(klass, logging.handlers.MemoryHandler):
             if "target" in opts:
                 target = cp.get(sectname,"target")
             else:
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index 2c559bd..cd9490e 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -159,8 +159,9 @@
 def visiblename(name, all=None):
     """Decide whether to show documentation on a variable."""
     # Certain special names are redundant.
-    if name in ('__builtins__', '__doc__', '__file__', '__path__',
-                '__module__', '__name__', '__slots__'): return 0
+    _hidden_names = ('__builtins__', '__doc__', '__file__', '__path__',
+                     '__module__', '__name__', '__slots__', '__package__')
+    if name in _hidden_names: return 0
     # Private names are hidden, but special names are displayed.
     if name.startswith('__') and name.endswith('__'): return 1
     if all is not None:
diff --git a/Lib/rlcompleter.py b/Lib/rlcompleter.py
index 10a53dc..2739fed 100644
--- a/Lib/rlcompleter.py
+++ b/Lib/rlcompleter.py
@@ -86,6 +86,11 @@
         except IndexError:
             return None
 
+    def _callable_postfix(self, val, word):
+        if callable(val):
+            word = word + "("
+        return word
+
     def global_matches(self, text):
         """Compute matches when text is a simple name.
 
@@ -96,12 +101,13 @@
         import keyword
         matches = []
         n = len(text)
-        for list in [keyword.kwlist,
-                     builtins.__dict__,
-                     self.namespace]:
-            for word in list:
-                if word[:n] == text and word != "__builtins__":
-                    matches.append(word)
+        for word in keyword.kwlist:
+            if word[:n] == text:
+                matches.append(word)
+        for nspace in [builtins.__dict__, self.namespace]:
+            for word, val in nspace.items():
+                if word[:n] == text and word != "builtins":
+                    matches.append(self._callable_postfix(val, word))
         return matches
 
     def attr_matches(self, text):
@@ -133,7 +139,9 @@
         n = len(attr)
         for word in words:
             if word[:n] == attr and word != "__builtins__":
-                matches.append("%s.%s" % (expr, word))
+                val = getattr(object, word)
+                word = self._callable_postfix(val, "%s.%s" % (expr, word))
+                matches.append(word)
         return matches
 
 def get_class_members(klass):
diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py
index ae796ba..d43159a 100644
--- a/Lib/test/test_audioop.py
+++ b/Lib/test/test_audioop.py
@@ -1,288 +1,171 @@
-# Test audioop.
 import audioop
-from test.support import verbose
+import unittest
+from test.support import run_unittest
+
 
 def gendata1():
     return b'\0\1\2'
 
 def gendata2():
-    if verbose:
-        print('getsample')
     if audioop.getsample(b'\0\1', 2, 0) == 1:
         return b'\0\0\0\1\0\2'
     else:
         return b'\0\0\1\0\2\0'
 
 def gendata4():
-    if verbose:
-        print('getsample')
     if audioop.getsample(b'\0\0\0\1', 4, 0) == 1:
         return b'\0\0\0\0\0\0\0\1\0\0\0\2'
     else:
         return b'\0\0\0\0\1\0\0\0\2\0\0\0'
 
-def testmax(data):
-    if verbose:
-        print('max')
-    if audioop.max(data[0], 1) != 2 or \
-              audioop.max(data[1], 2) != 2 or \
-              audioop.max(data[2], 4) != 2:
-        return 0
-    return 1
+data = [gendata1(), gendata2(), gendata4()]
 
-def testminmax(data):
-    if verbose:
-        print('minmax')
-    if audioop.minmax(data[0], 1) != (0, 2) or \
-              audioop.minmax(data[1], 2) != (0, 2) or \
-              audioop.minmax(data[2], 4) != (0, 2):
-        return 0
-    return 1
 
-def testmaxpp(data):
-    if verbose:
-        print('maxpp')
-    if audioop.maxpp(data[0], 1) != 0 or \
-              audioop.maxpp(data[1], 2) != 0 or \
-              audioop.maxpp(data[2], 4) != 0:
-        return 0
-    return 1
+class TestAudioop(unittest.TestCase):
 
-def testavg(data):
-    if verbose:
-        print('avg')
-    if audioop.avg(data[0], 1) != 1 or \
-              audioop.avg(data[1], 2) != 1 or \
-              audioop.avg(data[2], 4) != 1:
-        return 0
-    return 1
+    def test_max(self):
+        self.assertEqual(audioop.max(data[0], 1), 2)
+        self.assertEqual(audioop.max(data[1], 2), 2)
+        self.assertEqual(audioop.max(data[2], 4), 2)
 
-def testavgpp(data):
-    if verbose:
-        print('avgpp')
-    if audioop.avgpp(data[0], 1) != 0 or \
-              audioop.avgpp(data[1], 2) != 0 or \
-              audioop.avgpp(data[2], 4) != 0:
-        return 0
-    return 1
+    def test_minmax(self):
+        self.assertEqual(audioop.minmax(data[0], 1), (0, 2))
+        self.assertEqual(audioop.minmax(data[1], 2), (0, 2))
+        self.assertEqual(audioop.minmax(data[2], 4), (0, 2))
 
-def testrms(data):
-    if audioop.rms(data[0], 1) != 1 or \
-              audioop.rms(data[1], 2) != 1 or \
-              audioop.rms(data[2], 4) != 1:
-        return 0
-    return 1
+    def test_maxpp(self):
+        self.assertEqual(audioop.maxpp(data[0], 1), 0)
+        self.assertEqual(audioop.maxpp(data[1], 2), 0)
+        self.assertEqual(audioop.maxpp(data[2], 4), 0)
 
-def testcross(data):
-    if verbose:
-        print('cross')
-    if audioop.cross(data[0], 1) != 0 or \
-              audioop.cross(data[1], 2) != 0 or \
-              audioop.cross(data[2], 4) != 0:
-        return 0
-    return 1
+    def test_avg(self):
+        self.assertEqual(audioop.avg(data[0], 1), 1)
+        self.assertEqual(audioop.avg(data[1], 2), 1)
+        self.assertEqual(audioop.avg(data[2], 4), 1)
 
-def testadd(data):
-    if verbose:
-        print('add')
-    data2 = []
-    for d in data:
-        str = bytearray(len(d))
-        for i,b in enumerate(d):
-            str[i] = 2*b
-        data2.append(str)
-    if audioop.add(data[0], data[0], 1) != data2[0] or \
-              audioop.add(data[1], data[1], 2) != data2[1] or \
-              audioop.add(data[2], data[2], 4) != data2[2]:
-        return 0
-    return 1
+    def test_avgpp(self):
+        self.assertEqual(audioop.avgpp(data[0], 1), 0)
+        self.assertEqual(audioop.avgpp(data[1], 2), 0)
+        self.assertEqual(audioop.avgpp(data[2], 4), 0)
 
-def testbias(data):
-    if verbose:
-        print('bias')
-    # Note: this test assumes that avg() works
-    d1 = audioop.bias(data[0], 1, 100)
-    d2 = audioop.bias(data[1], 2, 100)
-    d4 = audioop.bias(data[2], 4, 100)
-    if audioop.avg(d1, 1) != 101 or \
-              audioop.avg(d2, 2) != 101 or \
-              audioop.avg(d4, 4) != 101:
-        return 0
-    return 1
+    def test_rms(self):
+        self.assertEqual(audioop.rms(data[0], 1), 1)
+        self.assertEqual(audioop.rms(data[1], 2), 1)
+        self.assertEqual(audioop.rms(data[2], 4), 1)
 
-def testlin2lin(data):
-    if verbose:
-        print('lin2lin')
-    # too simple: we test only the size
-    for d1 in data:
-        for d2 in data:
-            got = len(d1)//3
-            wtd = len(d2)//3
-            if len(audioop.lin2lin(d1, got, wtd)) != len(d2):
-                return 0
-    return 1
+    def test_cross(self):
+        self.assertEqual(audioop.cross(data[0], 1), 0)
+        self.assertEqual(audioop.cross(data[1], 2), 0)
+        self.assertEqual(audioop.cross(data[2], 4), 0)
 
-def testadpcm2lin(data):
-    # Very cursory test
-    if audioop.adpcm2lin(b'\0\0', 1, None) != (b'\0\0\0\0', (0,0)):
-        return 0
-    return 1
+    def test_add(self):
+        data2 = []
+        for d in data:
+            str = bytearray(len(d))
+            for i,b in enumerate(d):
+                str[i] = 2*b
+            data2.append(str)
+        self.assertEqual(audioop.add(data[0], data[0], 1), data2[0])
+        self.assertEqual(audioop.add(data[1], data[1], 2), data2[1])
+        self.assertEqual(audioop.add(data[2], data[2], 4), data2[2])
 
-def testlin2adpcm(data):
-    if verbose:
-        print('lin2adpcm')
-    # Very cursory test
-    if audioop.lin2adpcm(b'\0\0\0\0', 1, None) != (b'\0\0', (0,0)):
-        return 0
-    return 1
+    def test_bias(self):
+        # Note: this test assumes that avg() works
+        d1 = audioop.bias(data[0], 1, 100)
+        d2 = audioop.bias(data[1], 2, 100)
+        d4 = audioop.bias(data[2], 4, 100)
+        self.assertEqual(audioop.avg(d1, 1), 101)
+        self.assertEqual(audioop.avg(d2, 2), 101)
+        self.assertEqual(audioop.avg(d4, 4), 101)
 
-def testlin2alaw(data):
-    if verbose:
-        print('lin2alaw')
-    if audioop.lin2alaw(data[0], 1) != b'\xd5\xc5\xf5' or \
-              audioop.lin2alaw(data[1], 2) != b'\xd5\xd5\xd5' or \
-              audioop.lin2alaw(data[2], 4) != b'\xd5\xd5\xd5':
-        return 0
-    return 1
+    def test_lin2lin(self):
+        # too simple: we test only the size
+        for d1 in data:
+            for d2 in data:
+                got = len(d1)//3
+                wtd = len(d2)//3
+                self.assertEqual(len(audioop.lin2lin(d1, got, wtd)), len(d2))
 
-def testalaw2lin(data):
-    if verbose:
-        print('alaw2lin')
-    # Cursory
-    d = audioop.lin2alaw(data[0], 1)
-    if audioop.alaw2lin(d, 1) != data[0]:
-        return 0
-    return 1
+    def test_adpcm2lin(self):
+        # Very cursory test
+        self.assertEqual(audioop.adpcm2lin(b'\0\0', 1, None), (b'\0\0\0\0', (0,0)))
 
-def testlin2ulaw(data):
-    if verbose:
-        print('lin2ulaw')
-    if audioop.lin2ulaw(data[0], 1) != b'\xff\xe7\xdb' or \
-              audioop.lin2ulaw(data[1], 2) != b'\xff\xff\xff' or \
-              audioop.lin2ulaw(data[2], 4) != b'\xff\xff\xff':
-        return 0
-    return 1
+    def test_lin2adpcm(self):
+        # Very cursory test
+        self.assertEqual(audioop.lin2adpcm(b'\0\0\0\0', 1, None), (b'\0\0', (0,0)))
 
-def testulaw2lin(data):
-    if verbose:
-        print('ulaw2lin')
-    # Cursory
-    d = audioop.lin2ulaw(data[0], 1)
-    if audioop.ulaw2lin(d, 1) != data[0]:
-        return 0
-    return 1
+    def test_lin2alaw(self):
+        self.assertEqual(audioop.lin2alaw(data[0], 1), b'\xd5\xc5\xf5')
+        self.assertEqual(audioop.lin2alaw(data[1], 2), b'\xd5\xd5\xd5')
+        self.assertEqual(audioop.lin2alaw(data[2], 4), b'\xd5\xd5\xd5')
 
-def testmul(data):
-    if verbose:
-        print('mul')
-    data2 = []
-    for d in data:
-        str = bytearray(len(d))
-        for i,b in enumerate(d):
-            str[i] = 2*b
-        data2.append(str)
-    if audioop.mul(data[0], 1, 2) != data2[0] or \
-              audioop.mul(data[1],2, 2) != data2[1] or \
-              audioop.mul(data[2], 4, 2) != data2[2]:
-        return 0
-    return 1
+    def test_alaw2lin(self):
+        # Cursory
+        d = audioop.lin2alaw(data[0], 1)
+        self.assertEqual(audioop.alaw2lin(d, 1), data[0])
 
-def testratecv(data):
-    if verbose:
-        print('ratecv')
-    state = None
-    d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
-    d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
-    if d1 + d2 != b'\000\000\001\001\002\001\000\000\001\001\002':
-        return 0
-    return 1
+    def test_lin2ulaw(self):
+        self.assertEqual(audioop.lin2ulaw(data[0], 1), b'\xff\xe7\xdb')
+        self.assertEqual(audioop.lin2ulaw(data[1], 2), b'\xff\xff\xff')
+        self.assertEqual(audioop.lin2ulaw(data[2], 4), b'\xff\xff\xff')
 
-def testreverse(data):
-    if verbose:
-        print('reverse')
-    if audioop.reverse(data[0], 1) != b'\2\1\0':
-        return 0
-    return 1
+    def test_ulaw2lin(self):
+        # Cursory
+        d = audioop.lin2ulaw(data[0], 1)
+        self.assertEqual(audioop.ulaw2lin(d, 1), data[0])
 
-def testtomono(data):
-    if verbose:
-        print('tomono')
-    data2 = bytearray()
-    for d in data[0]:
-        data2.append(d)
-        data2.append(d)
-    if audioop.tomono(data2, 1, 0.5, 0.5) != data[0]:
-        return 0
-    return 1
+    def test_mul(self):
+        data2 = []
+        for d in data:
+            str = bytearray(len(d))
+            for i,b in enumerate(d):
+                str[i] = 2*b
+            data2.append(str)
+        self.assertEqual(audioop.mul(data[0], 1, 2), data2[0])
+        self.assertEqual(audioop.mul(data[1],2, 2), data2[1])
+        self.assertEqual(audioop.mul(data[2], 4, 2), data2[2])
 
-def testtostereo(data):
-    if verbose:
-        print('tostereo')
-    data2 = bytearray()
-    for d in data[0]:
-        data2.append(d)
-        data2.append(d)
-    if audioop.tostereo(data[0], 1, 1, 1) != data2:
-        return 0
-    return 1
+    def test_ratecv(self):
+        state = None
+        d1, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+        d2, state = audioop.ratecv(data[0], 1, 1, 8000, 16000, state)
+        self.assertEqual(d1 + d2, b'\000\000\001\001\002\001\000\000\001\001\002')
 
-def testfindfactor(data):
-    if verbose:
-        print('findfactor')
-    if audioop.findfactor(data[1], data[1]) != 1.0:
-        return 0
-    return 1
+    def test_reverse(self):
+        self.assertEqual(audioop.reverse(data[0], 1), b'\2\1\0')
 
-def testfindfit(data):
-    if verbose:
-        print('findfit')
-    if audioop.findfit(data[1], data[1]) != (0, 1.0):
-        return 0
-    return 1
+    def test_tomono(self):
+        data2 = bytearray()
+        for d in data[0]:
+            data2.append(d)
+            data2.append(d)
+        self.assertEqual(audioop.tomono(data2, 1, 0.5, 0.5), data[0])
 
-def testfindmax(data):
-    if verbose:
-        print('findmax')
-    if audioop.findmax(data[1], 1) != 2:
-        return 0
-    return 1
+    def test_tostereo(self):
+        data2 = bytearray()
+        for d in data[0]:
+            data2.append(d)
+            data2.append(d)
+        self.assertEqual(audioop.tostereo(data[0], 1, 1, 1), data2)
 
-def testgetsample(data):
-    if verbose:
-        print('getsample')
-    for i in range(3):
-        if audioop.getsample(data[0], 1, i) != i or \
-                  audioop.getsample(data[1], 2, i) != i or \
-                  audioop.getsample(data[2], 4, i) != i:
-            return 0
-    return 1
+    def test_findfactor(self):
+        self.assertEqual(audioop.findfactor(data[1], data[1]), 1.0)
 
-def testone(name, data):
-    try:
-        func = eval('test'+name)
-    except NameError:
-        print('No test found for audioop.'+name+'()')
-        return
-    try:
-        rv = func(data)
-    except Exception as e:
-        print('Test FAILED for audioop.'+name+'() (with %s)' % repr(e))
-        return
-    if not rv:
-        print('Test FAILED for audioop.'+name+'()')
+    def test_findfit(self):
+        self.assertEqual(audioop.findfit(data[1], data[1]), (0, 1.0))
+
+    def test_findmax(self):
+        self.assertEqual(audioop.findmax(data[1], 1), 2)
+
+    def test_getsample(self):
+        for i in range(3):
+            self.assertEqual(audioop.getsample(data[0], 1, i), i)
+            self.assertEqual(audioop.getsample(data[1], 2, i), i)
+            self.assertEqual(audioop.getsample(data[2], 4, i), i)
+
 
 def test_main():
-    data = [gendata1(), gendata2(), gendata4()]
-    names = dir(audioop)
-    # We know there is a routine 'add'
-    routines = []
-    for n in names:
-        if type(eval('audioop.'+n)) == type(audioop.add):
-            routines.append(n)
-    for n in routines:
-        testone(n, data)
-
-
+    run_unittest(TestAudioop)
 
 if __name__ == '__main__':
     test_main()
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 9289afe..ec0aa80 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -296,6 +296,21 @@
             self.failUnless(isinstance(sample(), Set))
             self.failUnless(issubclass(sample, Set))
 
+    def test_hash_Set(self):
+        class OneTwoThreeSet(Set):
+            def __init__(self):
+                self.contents = [1, 2, 3]
+            def __contains__(self, x):
+                return x in self.contents
+            def __len__(self):
+                return len(self.contents)
+            def __iter__(self):
+                return iter(self.contents)
+            def __hash__(self):
+                return self._hash()
+        a, b = OneTwoThreeSet(), OneTwoThreeSet()
+        self.failUnless(hash(a) == hash(b))
+
     def test_MutableSet(self):
         self.failUnless(isinstance(set(), MutableSet))
         self.failUnless(issubclass(set, MutableSet))
diff --git a/Lib/test/test_decimal.py b/Lib/test/test_decimal.py
index 617f4d9..d0de64d 100644
--- a/Lib/test/test_decimal.py
+++ b/Lib/test/test_decimal.py
@@ -426,6 +426,9 @@
         self.assertEqual(str(Decimal('1.3E4 \n')), '1.3E+4')
         self.assertEqual(str(Decimal('  -7.89')), '-7.89')
 
+        #but alternate unicode digits should not
+        self.assertEqual(str(Decimal('\uff11')), 'NaN')
+
     def test_explicit_from_tuples(self):
 
         #zero
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index 97e91ce..3c8da77 100644
--- a/Lib/test/test_fractions.py
+++ b/Lib/test/test_fractions.py
@@ -364,6 +364,10 @@
 
     def testStringification(self):
         self.assertEquals("Fraction(7, 3)", repr(F(7, 3)))
+        self.assertEquals("Fraction(6283185307, 2000000000)",
+                          repr(F('3.1415926535')))
+        self.assertEquals("Fraction(-1, 100000000000000000000)",
+                          repr(F(1, -10**20)))
         self.assertEquals("7/3", str(F(7, 3)))
         self.assertEquals("7", str(F(7, 1)))
 
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index 5522c07..5966060 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -960,7 +960,6 @@
 def sqr(x, wait=0.0):
     time.sleep(wait)
     return x*x
-"""
 class _TestPool(BaseTestCase):
 
     def test_apply(self):
@@ -1030,7 +1029,6 @@
         join = TimingWrapper(self.pool.join)
         join()
         self.assertTrue(join.elapsed < 0.2)
-"""
 #
 # Test that manager has expected number of shared objects left
 #
@@ -1333,7 +1331,6 @@
 
         self.assertRaises(ValueError, a.send_bytes, msg, 4, -1)
 
-"""
 class _TestListenerClient(BaseTestCase):
 
     ALLOWED_TYPES = ('processes', 'threads')
@@ -1353,7 +1350,6 @@
             self.assertEqual(conn.recv(), 'hello')
             p.join()
             l.close()
-"""
 #
 # Test of sending connection and socket objects between processes
 #
@@ -1769,28 +1765,28 @@
 
     multiprocessing.get_logger().setLevel(LOG_LEVEL)
 
-    #ProcessesMixin.pool = multiprocessing.Pool(4)
-    #ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
-    #ManagerMixin.manager.__init__()
-    #ManagerMixin.manager.start()
-    #ManagerMixin.pool = ManagerMixin.manager.Pool(4)
+    ProcessesMixin.pool = multiprocessing.Pool(4)
+    ThreadsMixin.pool = multiprocessing.dummy.Pool(4)
+    ManagerMixin.manager.__init__()
+    ManagerMixin.manager.start()
+    ManagerMixin.pool = ManagerMixin.manager.Pool(4)
 
     testcases = (
-        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) #+
-        #sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
-        #sorted(testcases_manager.values(), key=lambda tc:tc.__name__)
+        sorted(testcases_processes.values(), key=lambda tc:tc.__name__) +
+        sorted(testcases_threads.values(), key=lambda tc:tc.__name__) +
+        sorted(testcases_manager.values(), key=lambda tc:tc.__name__)
         )
 
     loadTestsFromTestCase = unittest.defaultTestLoader.loadTestsFromTestCase
     suite = unittest.TestSuite(loadTestsFromTestCase(tc) for tc in testcases)
     run(suite)
 
-    #ThreadsMixin.pool.terminate()
-    #ProcessesMixin.pool.terminate()
-    #ManagerMixin.pool.terminate()
-    #ManagerMixin.manager.shutdown()
+    ThreadsMixin.pool.terminate()
+    ProcessesMixin.pool.terminate()
+    ManagerMixin.pool.terminate()
+    ManagerMixin.manager.shutdown()
 
-    #del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
+    del ProcessesMixin.pool, ThreadsMixin.pool, ManagerMixin.pool
 
 def main():
     test_main(unittest.TextTestRunner(verbosity=2).run)
diff --git a/Lib/test/test_pydoc.py b/Lib/test/test_pydoc.py
index 8b30e26..95a11af 100644
--- a/Lib/test/test_pydoc.py
+++ b/Lib/test/test_pydoc.py
@@ -66,7 +66,6 @@
 DATA
     __author__ = 'Benjamin Peterson'
     __credits__ = 'Nobody'
-    __package__ = None
     __version__ = '1.2.3.4'
 
 VERSION
@@ -163,7 +162,6 @@
 <tr><td bgcolor="#55aa55"><tt>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</tt></td><td>&nbsp;</td>
 <td width="100%%"><strong>__author__</strong> = 'Benjamin Peterson'<br>
 <strong>__credits__</strong> = 'Nobody'<br>
-<strong>__package__</strong> = None<br>
 <strong>__version__</strong> = '1.2.3.4'</td></tr></table><p>
 <table width="100%%" cellspacing=0 cellpadding=2 border=0 summary="section">
 <tr bgcolor="#7799ee">
