diff --git a/Doc/library/optparse.rst b/Doc/library/optparse.rst
index 24c84b1..c543bd9 100644
--- a/Doc/library/optparse.rst
+++ b/Doc/library/optparse.rst
@@ -1233,8 +1233,9 @@
    the list of arguments to process (default: ``sys.argv[1:]``)
 
 ``values``
-   object to store option arguments in (default: a new instance of
-   :class:`optparse.Values`)
+   a :class:`optparse.Values` object to store option arguments in (default: a
+   new instance of :class:`Values`) -- if you give an existing object, the
+   option defaults will not be initialized on it
 
 and the return values are
 
diff --git a/Lib/Cookie.py b/Lib/Cookie.py
index 99a94da..600d212 100644
--- a/Lib/Cookie.py
+++ b/Lib/Cookie.py
@@ -534,6 +534,8 @@
     r"(?P<val>"                   # Start of group 'val'
     r'"(?:[^\\"]|\\.)*"'            # Any doublequoted string
     r"|"                            # or
+    r"\w{3},\s[\w\d-]{9,11}\s[\d:]{8}\sGMT" # Special case for "expires" attr
+    r"|"                            # or
     ""+ _LegalCharsPatt +"*"        # Any word or empty string
     r")"                          # End of group 'val'
     r"\s*;?"                      # Probably ending in a semi-colon
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
old mode 100755
new mode 100644
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 44519d4..6e2ee175 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -178,6 +178,9 @@
 
 def ismount(path):
     """Test whether a path is a mount point"""
+    if islink(path):
+        # A symlink can never be a mount point
+        return False
     try:
         s1 = os.lstat(path)
         s2 = os.lstat(join(path, '..'))
diff --git a/Lib/pstats.py b/Lib/pstats.py
index a6844fb..08f2318 100644
--- a/Lib/pstats.py
+++ b/Lib/pstats.py
@@ -597,7 +597,10 @@
             print >> self.stream, "  that match it are printed."
 
         def do_add(self, line):
-            self.stats.add(line)
+            if self.stats:
+                self.stats.add(line)
+            else:
+                print >> self.stream, "No statistics object is loaded."
             return 0
         def help_add(self):
             print >> self.stream, "Add profile info from given file to current statistics object."
@@ -632,22 +635,33 @@
                 except IOError, args:
                     print >> self.stream, args[1]
                     return
+                except Exception as err:
+                    print >> self.stream, err.__class__.__name__ + ':', err
+                    return
                 self.prompt = line + "% "
             elif len(self.prompt) > 2:
-                line = self.prompt[-2:]
+                line = self.prompt[:-2]
+                self.do_read(line)
             else:
                 print >> self.stream, "No statistics object is current -- cannot reload."
             return 0
         def help_read(self):
             print >> self.stream, "Read in profile data from a specified file."
+            print >> self.stream, "Without argument, reload the current file."
 
         def do_reverse(self, line):
-            self.stats.reverse_order()
+            if self.stats:
+                self.stats.reverse_order()
+            else:
+                print >> self.stream, "No statistics object is loaded."
             return 0
         def help_reverse(self):
             print >> self.stream, "Reverse the sort order of the profiling report."
 
         def do_sort(self, line):
+            if not self.stats:
+                print >> self.stream, "No statistics object is loaded."
+                return
             abbrevs = self.stats.get_sort_arg_defs()
             if line and not filter(lambda x,a=abbrevs: x not in a,line.split()):
                 self.stats.sort_stats(*line.split())
@@ -669,11 +683,16 @@
             self.generic_help()
 
         def do_strip(self, line):
-            self.stats.strip_dirs()
-            return 0
+            if self.stats:
+                self.stats.strip_dirs()
+            else:
+                print >> self.stream, "No statistics object is loaded."
         def help_strip(self):
             print >> self.stream, "Strip leading path information from filenames in the report."
 
+        def help_help(self):
+            print >> self.stream, "Show help for a given command."
+
         def postcmd(self, stop, line):
             if stop:
                 return stop
diff --git a/Lib/test/test_cookie.py b/Lib/test/test_cookie.py
index e7c0cf1..474b856 100644
--- a/Lib/test/test_cookie.py
+++ b/Lib/test/test_cookie.py
@@ -66,6 +66,16 @@
         </script>
         """)
 
+        # loading 'expires'
+        C = Cookie.SimpleCookie()
+        C.load('Customer="W"; expires=Wed, 01-Jan-2010 00:00:00 GMT')
+        self.assertEqual(C['Customer']['expires'],
+                         'Wed, 01-Jan-2010 00:00:00 GMT')
+        C = Cookie.SimpleCookie()
+        C.load('Customer="W"; expires=Wed, 01-Jan-98 00:00:00 GMT')
+        self.assertEqual(C['Customer']['expires'],
+                         'Wed, 01-Jan-98 00:00:00 GMT')
+
     def test_quoted_meta(self):
         # Try cookie with quoted meta-data
         C = Cookie.SimpleCookie()
diff --git a/Lib/test/test_set.py b/Lib/test/test_set.py
index d53b916..c2e2ad1 100644
--- a/Lib/test/test_set.py
+++ b/Lib/test/test_set.py
@@ -751,7 +751,7 @@
         result = self.set ^ self.set
         self.assertEqual(result, empty_set)
 
-    def checkempty_symmetric_difference(self):
+    def test_empty_symmetric_difference(self):
         result = self.set ^ empty_set
         self.assertEqual(result, self.set)
 
diff --git a/Lib/timeit.py b/Lib/timeit.py
index 9054243..09f37c4 100644
--- a/Lib/timeit.py
+++ b/Lib/timeit.py
@@ -9,7 +9,7 @@
 Library usage: see the Timer class.
 
 Command line usage:
-    python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-h] [statement]
+    python timeit.py [-n N] [-r N] [-s S] [-t] [-c] [-h] [--] [statement]
 
 Options:
   -n/--number N: how many times to execute 'statement' (default: see below)
@@ -19,6 +19,7 @@
   -c/--clock: use time.clock() (default on Windows)
   -v/--verbose: print raw timing results; repeat for more digits precision
   -h/--help: print this usage message and exit
+  --: separate options from statement, use when statement starts with -
   statement: statement to be timed (default 'pass')
 
 A multi-line statement may be given by specifying each line as a
diff --git a/Lib/trace.py b/Lib/trace.py
index 6d5aef0..3611f88 100644
--- a/Lib/trace.py
+++ b/Lib/trace.py
@@ -195,11 +195,13 @@
         base = path[len(longest) + 1:]
     else:
         base = path
+    # the drive letter is never part of the module name
+    drive, base = os.path.splitdrive(base)
     base = base.replace(os.sep, ".")
     if os.altsep:
         base = base.replace(os.altsep, ".")
     filename, ext = os.path.splitext(base)
-    return filename
+    return filename.lstrip(".")
 
 class CoverageResults:
     def __init__(self, counts=None, calledfuncs=None, infile=None,
@@ -798,7 +800,16 @@
                   ignoredirs=ignore_dirs, infile=counts_file,
                   outfile=counts_file, timing=timing)
         try:
-            t.run('execfile(%r)' % (progname,))
+            with open(progname) as fp:
+                code = compile(fp.read(), progname, 'exec')
+            # try to emulate __main__ namespace as much as possible
+            globs = {
+                '__file__': progname,
+                '__name__': '__main__',
+                '__package__': None,
+                '__cached__': None,
+            }
+            t.runctx(code, globs, globs)
         except IOError, err:
             _err_exit("Cannot run file %r because: %s" % (sys.argv[0], err))
         except SystemExit:
diff --git a/Misc/NEWS b/Misc/NEWS
index 9440045..e4a73c9 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -89,6 +89,15 @@
 Library
 -------
 
+- Issue #7395: Fix tracebacks in pstats interactive browser.
+
+- Issue #1713: Fix os.path.ismount(), which returned true for symbolic links
+  across devices.
+
+- Issue #8826: Properly load old-style "expires" attribute in http.cookies.
+
+- Issue #1690103: Fix initial namespace for code run with trace.main().
+
 - Issue #5294: Fix the behavior of pdb's "continue" command when called
   in the top-level debugged frame.
 
