diff --git a/Lib/decimal.py b/Lib/decimal.py
index b25f6e6..54e8cb4 100644
--- a/Lib/decimal.py
+++ b/Lib/decimal.py
@@ -184,7 +184,6 @@
     number of zero digits are appended to the coefficient ("fold-down").
     """
 
-
 class InvalidOperation(DecimalException):
     """An invalid operation was performed.
 
@@ -210,14 +209,10 @@
     """
     def handle(self, context, *args):
         if args:
-            if args[0] == 1:  # sNaN, must drop 's' but keep diagnostics
-                ans = _dec_from_triple(args[1]._sign, args[1]._int, 'n', True)
-                return ans._fix_nan(context)
-            elif args[0] == 2:
-                return _dec_from_triple(args[1], args[2], 'n', True)
+            ans = _dec_from_triple(args[0]._sign, args[0]._int, 'n', True)
+            return ans._fix_nan(context)
         return NaN
 
-
 class ConversionSyntax(InvalidOperation):
     """Trying to convert badly formed string.
 
@@ -277,7 +272,6 @@
     The inexact signal may be tested (or trapped) to determine if a given
     operation (or sequence of operations) was inexact.
     """
-    pass
 
 class InvalidContext(InvalidOperation):
     """Invalid context.  Unknown rounding, for example.
@@ -304,7 +298,6 @@
     The rounded signal may be tested (or trapped) to determine if a given
     operation (or sequence of operations) caused a loss of precision.
     """
-    pass
 
 class Subnormal(DecimalException):
     """Exponent < Emin before rounding.
@@ -316,7 +309,6 @@
     The subnormal signal may be tested (or trapped) to determine if a given
     or operation (or sequence of operations) yielded a subnormal result.
     """
-    pass
 
 class Overflow(Inexact, Rounded):
     """Numerical overflow.
@@ -338,7 +330,7 @@
     the result is the same as for round-down if the sign of the intermediate
     result is 0, or is [1,inf] otherwise.  In all cases, Inexact and Rounded
     will also be raised.
-   """
+    """
 
     def handle(self, context, sign, *args):
         if context.rounding in (ROUND_HALF_UP, ROUND_HALF_EVEN,
@@ -662,7 +654,7 @@
         """Returns whether the number is not actually one.
 
         0 if a number
-        1 if NaN  (it could be a normal quiet NaN or a phantom one)
+        1 if NaN
         2 if sNaN
         """
         if self._is_special:
@@ -708,10 +700,10 @@
 
             if self_is_nan == 2:
                 return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, self)
+                                        self)
             if other_is_nan == 2:
                 return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, other)
+                                        other)
             if self_is_nan:
                 return self._fix_nan(context)
 
@@ -922,7 +914,7 @@
 
         if not self:
             # -Decimal('0') is Decimal('0'), not Decimal('-0')
-            ans = self.copy_sign(Dec_0)
+            ans = self.copy_abs()
         else:
             ans = self.copy_negate()
 
@@ -942,7 +934,7 @@
 
         if not self:
             # + (-0) = 0
-            ans = self.copy_sign(Dec_0)
+            ans = self.copy_abs()
         else:
             ans = Decimal(self)
 
@@ -1465,9 +1457,6 @@
         context - context used.
         """
 
-        if context is None:
-            context = getcontext()
-
         if self._is_special:
             if self._isnan():
                 # decapitate payload if necessary
@@ -1631,11 +1620,9 @@
             if context is None:
                 context = getcontext()
             if self._exp == 'N':
-                return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, self)
+                return context._raise_error(InvalidOperation, 'sNaN', self)
             if other._exp == 'N':
-                return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, other)
+                return context._raise_error(InvalidOperation, 'sNaN', other)
             if self._exp == 'n':
                 product = self
             elif other._exp == 'n':
@@ -1678,13 +1665,13 @@
         if self_is_nan or other_is_nan or modulo_is_nan:
             if self_is_nan == 2:
                 return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, self)
+                                        self)
             if other_is_nan == 2:
                 return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, other)
+                                        other)
             if modulo_is_nan == 2:
                 return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, modulo)
+                                        modulo)
             if self_is_nan:
                 return self._fix_nan(context)
             if other_is_nan:
@@ -2555,16 +2542,16 @@
         other_is_nan = other._isnan()
         if self_is_nan == 2:
             return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, self)
+                                        self)
         if other_is_nan == 2:
             return context._raise_error(InvalidOperation, 'sNaN',
-                                        1, other)
+                                        other)
         if self_is_nan:
             return context._raise_error(InvalidOperation, 'NaN in compare_signal',
-                                        1, self)
+                                        self)
         if other_is_nan:
             return context._raise_error(InvalidOperation, 'NaN in compare_signal',
-                                        1, other)
+                                        other)
         return self.compare(other, context=context)
 
     def compare_total(self, other):
@@ -3208,8 +3195,8 @@
         """Returns an indication of the class of self.
 
         The class is one of the following strings:
-          -sNaN
-          -NaN
+          sNaN
+          NaN
           -Infinity
           -Normal
           -Subnormal
@@ -5173,8 +5160,6 @@
 Dec_0 = Decimal(0)
 Dec_p1 = Decimal(1)
 Dec_n1 = Decimal(-1)
-Dec_p2 = Decimal(2)
-Dec_n2 = Decimal(-2)
 
 # Infsign[sign] is infinity w/ that sign
 Infsign = (Inf, negInf)
diff --git a/Lib/re.py b/Lib/re.py
index 4c5622b..1e0c468 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -224,6 +224,8 @@
         return p
     pattern, flags = key
     if isinstance(pattern, _pattern_type):
+        if flags:
+            raise ValueError('Cannot process flags argument with a compiled pattern')
         return pattern
     if not sre_compile.isstring(pattern):
         raise TypeError("first argument must be string or compiled pattern")
diff --git a/Lib/test/test_re.py b/Lib/test/test_re.py
index f935e1d..88fecbf 100644
--- a/Lib/test/test_re.py
+++ b/Lib/test/test_re.py
@@ -111,6 +111,14 @@
 #                self.assertEqual(z, y)
 #                self.assertEqual(type(z), type(y))
 
+    def test_bug_1661(self):
+        # Verify that flags do not get silently ignored with compiled patterns
+        pattern = re.compile('.')
+        self.assertRaises(ValueError, re.match, pattern, 'A', re.I)
+        self.assertRaises(ValueError, re.search, pattern, 'A', re.I)
+        self.assertRaises(ValueError, re.findall, pattern, 'A', re.I)
+        self.assertRaises(ValueError, re.compile, pattern, re.I)
+
     def test_sub_template_numeric_escape(self):
         # bug 776311 and friends
         self.assertEqual(re.sub('x', r'\0', 'x'), '\0')
diff --git a/Lib/test/test_richcmp.py b/Lib/test/test_richcmp.py
index efe6923..3f97ece 100644
--- a/Lib/test/test_richcmp.py
+++ b/Lib/test/test_richcmp.py
@@ -85,6 +85,35 @@
             raise ValueError("Cannot compare vectors of different length")
         return other
 
+
+class SimpleOrder(object):
+    """
+    A simple class that defines order but not full comparison.
+    """
+
+    def __init__(self, value):
+        self.value = value
+
+    def __lt__(self, other):
+        if not isinstance(other, SimpleOrder):
+            return True
+        return self.value < other.value
+
+    def __gt__(self, other):
+        if not isinstance(other, SimpleOrder):
+            return False
+        return self.value > other.value
+
+
+class DumbEqualityWithoutHash(object):
+    """
+    A class that define __eq__, but no __hash__: it shouldn't be hashable.
+    """
+
+    def __eq__(self, other):
+        return False
+
+
 opmap = {
     "lt": (lambda a,b: a< b, operator.lt, operator.__lt__),
     "le": (lambda a,b: a<=b, operator.le, operator.__le__),
@@ -330,8 +359,39 @@
         for op in opmap["lt"]:
             self.assertIs(op(x, y), True)
 
+
+class HashableTest(unittest.TestCase):
+    """
+    Test hashability of classes with rich operators defined.
+    """
+
+    def test_simpleOrderHashable(self):
+        """
+        A class that only defines __gt__ and/or __lt__ should be hashable.
+        """
+        a = SimpleOrder(1)
+        b = SimpleOrder(2)
+        self.assert_(a < b)
+        self.assert_(b > a)
+        self.assert_(a.__hash__ is not None)
+
+    def test_notHashableException(self):
+        """
+        If a class is not hashable, it should raise a TypeError with an
+        understandable message.
+        """
+        a = DumbEqualityWithoutHash()
+        try:
+            hash(a)
+        except TypeError as e:
+            self.assertEquals(str(e),
+                              "unhashable type: 'DumbEqualityWithoutHash'")
+        else:
+            raise test_support.TestFailed("Should not be here")
+
+
 def test_main():
-    test_support.run_unittest(VectorTest, NumberTest, MiscTest, DictTest, ListTest)
+    test_support.run_unittest(VectorTest, NumberTest, MiscTest, DictTest, ListTest, HashableTest)
 
 if __name__ == "__main__":
     test_main()
diff --git a/Lib/test/test_signal.py b/Lib/test/test_signal.py
index c1df51e..80a0bb2 100644
--- a/Lib/test/test_signal.py
+++ b/Lib/test/test_signal.py
@@ -166,12 +166,59 @@
         self.assertRaises(TypeError, signal.signal,
                           signal.SIGUSR1, None)
 
+class WakeupSignalTests(unittest.TestCase):
+    TIMEOUT_FULL = 10
+    TIMEOUT_HALF = 5
+
+    def test_wakeup_fd_early(self):
+        import select
+
+        signal.alarm(1)
+        before_time = time.time()
+        # We attempt to get a signal during the sleep,
+        # before select is called
+        time.sleep(self.TIMEOUT_FULL)
+        mid_time = time.time()
+        self.assert_(mid_time - before_time < self.TIMEOUT_HALF)
+        select.select([self.read], [], [], self.TIMEOUT_FULL)
+        after_time = time.time()
+        self.assert_(after_time - mid_time < self.TIMEOUT_HALF)
+
+    def test_wakeup_fd_during(self):
+        import select
+
+        signal.alarm(1)
+        before_time = time.time()
+        # We attempt to get a signal during the select call
+        self.assertRaises(select.error, select.select,
+            [self.read], [], [], self.TIMEOUT_FULL)
+        after_time = time.time()
+        self.assert_(after_time - before_time < self.TIMEOUT_HALF)
+
+    def setUp(self):
+        import fcntl
+
+        self.alrm = signal.signal(signal.SIGALRM, lambda x,y:None)
+        self.read, self.write = os.pipe()
+        flags = fcntl.fcntl(self.write, fcntl.F_GETFL, 0)
+        flags = flags | os.O_NONBLOCK
+        fcntl.fcntl(self.write, fcntl.F_SETFL, flags)
+        self.old_wakeup = signal.set_wakeup_fd(self.write)
+
+    def tearDown(self):
+        signal.set_wakeup_fd(self.old_wakeup)
+        os.close(self.read)
+        os.close(self.write)
+        signal.signal(signal.SIGALRM, self.alrm)
+
+
 def test_main():
     if sys.platform[:3] in ('win', 'os2'):
         raise test_support.TestSkipped("Can't test signal on %s" % \
                                        sys.platform)
 
-    test_support.run_unittest(BasicSignalTests, InterProcessSignalTests)
+    test_support.run_unittest(BasicSignalTests, InterProcessSignalTests,
+        WakeupSignalTests)
 
 
 if __name__ == "__main__":
diff --git a/Lib/test/test_subprocess.py b/Lib/test/test_subprocess.py
index 806791b..a46bc38 100644
--- a/Lib/test/test_subprocess.py
+++ b/Lib/test/test_subprocess.py
@@ -242,7 +242,7 @@
         self.assertEquals(rc, 2)
 
     def test_cwd(self):
-        tmpdir = os.getenv("TEMP", "/tmp")
+        tmpdir = tempfile.gettempdir()
         # We cannot use os.path.realpath to canonicalize the path,
         # since it doesn't expand Tru64 {memb} strings. See bug 1063571.
         cwd = os.getcwd()
diff --git a/Lib/test/test_warnings.py b/Lib/test/test_warnings.py
index 6889e3f..8206202 100644
--- a/Lib/test/test_warnings.py
+++ b/Lib/test/test_warnings.py
@@ -1,5 +1,7 @@
 import warnings
+import linecache
 import os
+from io import StringIO
 import sys
 import unittest
 from test import test_support
@@ -36,6 +38,8 @@
                     self.assert_(w.category is category)
 
     def test_filtering(self):
+        # Test filterwarnings().
+        # Implicitly also tests resetwarnings().
         with test_support.catch_warning() as w:
             warnings.filterwarnings("error", "", Warning, "", 0)
             self.assertRaises(UserWarning, warnings.warn, 'convert to error')
@@ -97,6 +101,33 @@
             self.assertEqual(os.path.basename(w.filename), "sys")
 
 
+class WarningsDisplayTests(unittest.TestCase):
+
+    def test_formatwarning(self):
+        message = "msg"
+        category = Warning
+        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
+        line_num = 3
+        file_line = linecache.getline(file_name, line_num).strip()
+        expect = "%s:%s: %s: %s\n  %s\n" % (file_name, line_num, category.__name__,
+                                         message, file_line)
+        self.failUnlessEqual(warnings.formatwarning(message, category,
+                                                    file_name, line_num),
+                             expect)
+
+    def test_showwarning(self):
+        file_name = os.path.splitext(warning_tests.__file__)[0] + '.py'
+        line_num = 3
+        expected_file_line = linecache.getline(file_name, line_num).strip()
+        message = 'msg'
+        category = Warning
+        file_object = StringIO()
+        expect = warnings.formatwarning(message, category, file_name, line_num)
+        warnings.showwarning(message, category, file_name, line_num,
+                                file_object)
+        self.failUnlessEqual(file_object.getvalue(), expect)
+
+
 def test_main(verbose=None):
     # Obscure hack so that this test passes after reloads or repeated calls
     # to test_main (regrtest -R).
@@ -106,7 +137,7 @@
         del warning_tests.__warningregistry__
     if hasattr(sys, '__warningregistry__'):
         del sys.__warningregistry__
-    test_support.run_unittest(TestModule)
+    test_support.run_unittest(TestModule, WarningsDisplayTests)
 
 if __name__ == "__main__":
     test_main(verbose=True)
