diff --git a/Lib/distutils/unixccompiler.py b/Lib/distutils/unixccompiler.py
index 87ce921..d65ab32 100644
--- a/Lib/distutils/unixccompiler.py
+++ b/Lib/distutils/unixccompiler.py
@@ -75,8 +75,7 @@
     if 'ARCHFLAGS' in os.environ and not stripArch:
         # User specified different -arch flags in the environ,
         # see also distutils.sysconfig
-        compiler_so = compiler_so + ' ' + os.environ['ARCHFLAGS']
-
+        compiler_so = compiler_so + os.environ['ARCHFLAGS'].split()
 
     if stripSysroot:
         try:
diff --git a/Lib/imghdr.py b/Lib/imghdr.py
index 38732e6..c00c816 100644
--- a/Lib/imghdr.py
+++ b/Lib/imghdr.py
@@ -8,7 +8,7 @@
 
 def what(file, h=None):
     if h is None:
-        if type(file) == type(''):
+        if isinstance(file, str):
             f = open(file, 'rb')
             h = f.read(32)
         else:
diff --git a/Lib/logging/config.py b/Lib/logging/config.py
index 4123506..a9a4e62 100644
--- a/Lib/logging/config.py
+++ b/Lib/logging/config.py
@@ -143,7 +143,10 @@
             fmt = cp.get(sectname, "formatter")
         else:
             fmt = ""
-        klass = eval(klass, vars(logging))
+        try:
+            klass = eval(klass, vars(logging))
+        except (AttributeError, NameError):
+            klass = _resolve(klass)
         args = cp.get(sectname, "args")
         args = eval(args, vars(logging))
         h = klass(*args)
diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index cd9490e..09e1d25 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -1342,7 +1342,7 @@
     (fd, filename) = tempfile.mkstemp()
     os.close(fd)
     try:
-        if hasattr(os, 'system') and os.system('more %s' % filename) == 0:
+        if hasattr(os, 'system') and os.system('more "%s"' % filename) == 0:
             return lambda text: pipepager(text, 'more')
         else:
             return ttypager
@@ -1370,7 +1370,7 @@
     file.write(text)
     file.close()
     try:
-        os.system(cmd + ' ' + filename)
+        os.system(cmd + ' "' + filename + '"')
     finally:
         os.unlink(filename)
 
diff --git a/Lib/sqlite3/test/regression.py b/Lib/sqlite3/test/regression.py
index 5e89a6c..433cae2 100644
--- a/Lib/sqlite3/test/regression.py
+++ b/Lib/sqlite3/test/regression.py
@@ -146,7 +146,8 @@
         # decoding errors disappeared. This verifies they're back again.
         failure = None
         try:
-            self.con.execute("select 'xxx' || ? || 'yyy' colname", (bytes(bytearray([250])),)).fetchone()
+            self.con.execute("select 'xxx' || ? || 'yyy' colname",
+                             (bytes(bytearray([250])),)).fetchone()
             failure = "should have raised an OperationalError with detailed description"
         except sqlite.OperationalError as e:
             msg = e.args[0]
@@ -155,6 +156,20 @@
         if failure:
             self.fail(failure)
 
+    def CheckRegisterAdapter(self):
+        """
+        See issue 3312.
+        """
+        self.assertRaises(TypeError, sqlite.register_adapter, {}, None)
+
+    def CheckSetIsolationLevel(self):
+        """
+        See issue 3312.
+        """
+        con = sqlite.connect(":memory:")
+        setattr(con, "isolation_level", "\xe9")
+
+
 def suite():
     regression_suite = unittest.makeSuite(RegressionTests, "Check")
     return unittest.TestSuite((regression_suite,))
diff --git a/Lib/test/pystone.py b/Lib/test/pystone.py
index bbf43cc..614551f 100755
--- a/Lib/test/pystone.py
+++ b/Lib/test/pystone.py
@@ -128,7 +128,11 @@
         IntLoc1 = Proc2(IntLoc1)
 
     benchtime = clock() - starttime - nulltime
-    return benchtime, (loops / benchtime)
+    if benchtime == 0.0:
+        loopsPerBenchtime = 0.0
+    else:
+        loopsPerBenchtime = (loops / benchtime)
+    return benchtime, loopsPerBenchtime
 
 def Proc1(PtrParIn):
     PtrParIn.PtrComp = NextRecord = PtrGlb.copy()
diff --git a/Lib/test/test_audioop.py b/Lib/test/test_audioop.py
index 689b0de..1cd80a1 100644
--- a/Lib/test/test_audioop.py
+++ b/Lib/test/test_audioop.py
@@ -163,7 +163,7 @@
             self.assertEqual(audioop.getsample(data[1], 2, i), i)
             self.assertEqual(audioop.getsample(data[2], 4, i), i)
 
-    def test_negavitelen(self):
+    def test_negativelen(self):
         # from issue 3306, previously it segfaulted
         self.assertRaises(audioop.error,
             audioop.findmax, ''.join(chr(x) for x in range(256)), -2392392)
diff --git a/Lib/test/test_itertools.py b/Lib/test/test_itertools.py
index 3957f41..ee50e2a 100644
--- a/Lib/test/test_itertools.py
+++ b/Lib/test/test_itertools.py
@@ -1204,52 +1204,32 @@
 [22]
 [25, 26, 27, 28]
 
->>> def take(n, seq):
-...     return list(islice(seq, n))
+>>> def take(n, iterable):
+...     "Return first n items of the iterable as a list"
+...     return list(islice(iterable, n))
 
->>> def enumerate(iterable):
-...     return zip(count(), iterable)
+>>> def enumerate(iterable, start=0):
+...     return zip(count(start), iterable)
 
->>> def tabulate(function):
+>>> def tabulate(function, start=0):
 ...     "Return function(0), function(1), ..."
-...     return map(function, count())
-
->>> def iteritems(mapping):
-...     return zip(mapping.keys(), mapping.values())
+...     return map(function, count(start))
 
 >>> def nth(iterable, n):
-...     "Returns the nth item"
+...     "Returns the nth item or empty list"
 ...     return list(islice(iterable, n, n+1))
 
->>> def all(seq, pred=None):
-...     "Returns True if pred(x) is true for every element in the iterable"
-...     for elem in filterfalse(pred, seq):
-...         return False
-...     return True
+>>> def quantify(iterable, pred=bool):
+...     "Count how many times the predicate is true"
+...     return sum(map(pred, iterable))
 
->>> def any(seq, pred=None):
-...     "Returns True if pred(x) is true for at least one element in the iterable"
-...     for elem in filter(pred, seq):
-...         return True
-...     return False
-
->>> def no(seq, pred=None):
-...     "Returns True if pred(x) is false for every element in the iterable"
-...     for elem in filter(pred, seq):
-...         return False
-...     return True
-
->>> def quantify(seq, pred=None):
-...     "Count how many times the predicate is true in the sequence"
-...     return sum(map(pred, seq))
-
->>> def padnone(seq):
+>>> def padnone(iterable):
 ...     "Returns the sequence elements and then returns None indefinitely"
-...     return chain(seq, repeat(None))
+...     return chain(iterable, repeat(None))
 
->>> def ncycles(seq, n):
-...     "Returns the sequence elements n times"
-...     return chain(*repeat(seq, n))
+>>> def ncycles(iterable, n):
+...     "Returns the seqeuence elements n times"
+...     return chain(*repeat(iterable, n))
 
 >>> def dotproduct(vec1, vec2):
 ...     return sum(map(operator.mul, vec1, vec2))
@@ -1302,9 +1282,24 @@
 
 >>> def compress(data, selectors):
 ...     "compress('abcdef', [1,0,1,0,1,1]) --> a c e f"
-...     for d, s in zip(data, selectors):
-...         if s:
-...             yield d
+...     decorated = zip(data, selectors)
+...     filtered =  filter(operator.itemgetter(1), decorated)
+...     return map(operator.itemgetter(0), filtered)
+
+>>> def combinations_with_replacement(iterable, r):
+...     "combinations_with_replacement('ABC', 3) --> AA AB AC BB BC CC"
+...     pool = tuple(iterable)
+...     n = len(pool)
+...     indices = [0] * r
+...     yield tuple(pool[i] for i in indices)
+...     while 1:
+...         for i in reversed(range(r)):
+...             if indices[i] != n - 1:
+...                 break
+...         else:
+...             return
+...         indices[i:] = [indices[i] + 1] * (r - i)
+...         yield tuple(pool[i] for i in indices)
 
 This is not part of the examples but it tests to make sure the definitions
 perform as purported.
@@ -1321,24 +1316,6 @@
 >>> nth('abcde', 3)
 ['d']
 
->>> all([2, 4, 6, 8], lambda x: x%2==0)
-True
-
->>> all([2, 3, 6, 8], lambda x: x%2==0)
-False
-
->>> any([2, 4, 6, 8], lambda x: x%2==0)
-True
-
->>> any([1, 3, 5, 9], lambda x: x%2==0,)
-False
-
->>> no([1, 3, 5, 9], lambda x: x%2==0)
-True
-
->>> no([1, 2, 5, 9], lambda x: x%2==0)
-False
-
 >>> quantify(range(99), lambda x: x%2==0)
 50
 
@@ -1383,6 +1360,9 @@
 >>> list(compress('abcdef', [1,0,1,0,1,1]))
 ['a', 'c', 'e', 'f']
 
+>>> list(combinations_with_replacement('abc', 2))
+[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'b'), ('b', 'c'), ('c', 'c')]
+
 """
 
 __test__ = {'libreftest' : libreftest}
diff --git a/Lib/test/test_locale.py b/Lib/test/test_locale.py
index 6d13058..b1ff14a 100644
--- a/Lib/test/test_locale.py
+++ b/Lib/test/test_locale.py
@@ -1,4 +1,4 @@
-from test.support import verbose, TestSkipped
+from test.support import verbose, TestSkipped, TestFailed
 import locale
 import sys
 
@@ -78,3 +78,12 @@
 
 finally:
     locale.setlocale(locale.LC_NUMERIC, oldlocale)
+
+if hasattr(locale, "strcoll"):
+    # test crasher from bug #3303
+    try:
+        locale.strcoll("a", None)
+    except TypeError:
+        pass
+    else:
+        raise TestFailed("TypeError not raised")
diff --git a/Lib/test/test_logging.py b/Lib/test/test_logging.py
index 888ac72..55502d6 100644
--- a/Lib/test/test_logging.py
+++ b/Lib/test/test_logging.py
@@ -584,6 +584,9 @@
     datefmt=
     """
 
+    # config5 specifies a custom handler class to be loaded
+    config5 = config1.replace('class=StreamHandler', 'class=logging.StreamHandler')
+
     def apply_config(self, conf):
         try:
             fn = tempfile.mktemp(".ini")
@@ -609,10 +612,10 @@
             # Original logger output is empty.
             self.assert_log_lines([])
 
-    def test_config1_ok(self):
+    def test_config1_ok(self, config=config1):
         # A config file defining a sub-parser as well.
         with captured_stdout() as output:
-            self.apply_config(self.config1)
+            self.apply_config(config)
             logger = logging.getLogger("compiler.parser")
             # Both will output a message
             logger.info(self.next_message())
@@ -647,6 +650,8 @@
             # Original logger output is empty
             self.assert_log_lines([])
 
+    def test_config5_ok(self):
+        self.test_config1_ok(config=self.config5)
 
 class LogRecordStreamHandler(StreamRequestHandler):
 
diff --git a/Lib/test/test_multibytecodec.py b/Lib/test/test_multibytecodec.py
index 0eb422e..7962d5e 100644
--- a/Lib/test/test_multibytecodec.py
+++ b/Lib/test/test_multibytecodec.py
@@ -8,6 +8,7 @@
 from test import test_multibytecodec_support
 from test.support import TESTFN
 import unittest, io, codecs, sys, os
+import _multibytecodec
 
 ALL_CJKENCODINGS = [
 # _codecs_cn
@@ -53,6 +54,14 @@
         finally:
             support.unlink(TESTFN)
 
+    def test_init_segfault(self):
+        # bug #3305: this used to segfault
+        self.assertRaises(AttributeError,
+                          _multibytecodec.MultibyteStreamReader, None)
+        self.assertRaises(AttributeError,
+                          _multibytecodec.MultibyteStreamWriter, None)
+
+
 class Test_IncrementalEncoder(unittest.TestCase):
 
     def test_stateless(self):
diff --git a/Lib/test/test_multiprocessing.py b/Lib/test/test_multiprocessing.py
index 5f5c588..2841424 100644
--- a/Lib/test/test_multiprocessing.py
+++ b/Lib/test/test_multiprocessing.py
@@ -1038,7 +1038,7 @@
         gc.collect()                       # do garbage collection
         refs = self.manager._number_of_objects()
         if refs != EXPECTED_NUMBER:
-            print(self.manager._debugInfo())
+            print(self.manager._debug_info())
 
         self.assertEqual(refs, EXPECTED_NUMBER)
 
diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py
index 04c49fa..da62a4f 100644
--- a/Lib/test/test_random.py
+++ b/Lib/test/test_random.py
@@ -5,7 +5,7 @@
 import time
 import pickle
 import warnings
-from math import log, exp, sqrt, pi
+from math import log, exp, sqrt, pi, sum as msum
 from test import support
 
 class TestBasicOps(unittest.TestCase):
@@ -389,11 +389,9 @@
 
 def gamma(z, cof=_gammacoeff, g=7):
     z -= 1.0
-    sum = cof[0]
-    for i in range(1,len(cof)):
-        sum += cof[i] / (z+i)
+    s = msum([cof[0]] + [cof[i] / (z+i) for i in range(1,len(cof))])
     z += 0.5
-    return (z+g)**z / exp(z+g) * sqrt(2*pi) * sum
+    return (z+g)**z / exp(z+g) * sqrt(2.0*pi) * s
 
 class TestDistributions(unittest.TestCase):
     def test_zeroinputs(self):
diff --git a/Lib/test/test_robotparser.py b/Lib/test/test_robotparser.py
index f02f986..2101918 100644
--- a/Lib/test/test_robotparser.py
+++ b/Lib/test/test_robotparser.py
@@ -139,7 +139,8 @@
 class NetworkTestCase(unittest.TestCase):
 
     def testPasswordProtectedSite(self):
-        support.requires('network')
+        if not support.is_resource_enabled('network'):
+            return
         # whole site is password-protected.
         url = 'http://mueblesmoraleda.com'
         parser = urllib.robotparser.RobotFileParser()
@@ -148,7 +149,8 @@
         self.assertEqual(parser.can_fetch("*", url+"/robots.txt"), False)
 
     def testPythonOrg(self):
-        support.requires('network')
+        if not support.is_resource_enabled('network'):
+            return
         parser = urllib.robotparser.RobotFileParser(
             "http://www.python.org/robots.txt")
         parser.read()
@@ -160,5 +162,5 @@
     support.run_unittest(tests)
 
 if __name__=='__main__':
-    support.Verbose = 1
+    support.verbose = 1
     test_main()
diff --git a/Lib/test/test_scope.py b/Lib/test/test_scope.py
index a3f1d4a..65d87cf 100644
--- a/Lib/test/test_scope.py
+++ b/Lib/test/test_scope.py
@@ -495,6 +495,24 @@
         self.assert_("x" not in varnames)
         self.assert_("y" in varnames)
 
+    def testLocalsClass_WithTrace(self):
+        # Issue23728: after the trace function returns, the locals()
+        # dictionary is used to update all variables, this used to
+        # include free variables. But in class statements, free
+        # variables are not inserted...
+        import sys
+        sys.settrace(lambda a,b,c:None)
+        try:
+            x = 12
+
+            class C:
+                def f(self):
+                    return x
+
+            self.assertEquals(x, 12) # Used to raise UnboundLocalError
+        finally:
+            sys.settrace(None)
+
     def testBoundAndFree(self):
         # var is bound and free in class
 
