diff --git a/Lib/doctest.py b/Lib/doctest.py
index 25b14ca..ccf976c 100644
--- a/Lib/doctest.py
+++ b/Lib/doctest.py
@@ -740,7 +740,15 @@
 
         # Divide want into lines; check that it's properly
         # indented; and then strip the indentation.
-        want_lines = m.group('want').rstrip().split('\n')
+        want = m.group('want')
+
+        # Strip trailing newline and following spaces
+        l = len(want.rstrip())
+        l = want.find('\n', l)
+        if l >= 0:
+            want = want[:l]
+            
+        want_lines = want.split('\n')
         self._check_prefix(want_lines, ' '*indent, name,
                            lineno+len(source_lines))
         want = '\n'.join([wl[indent:] for wl in want_lines])
@@ -1063,6 +1071,8 @@
             filename = None
         else:
             filename = getattr(module, '__file__', module.__name__)
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
         return self._parser.get_doctest(docstring, globs, name,
                                         filename, lineno)
 
@@ -1199,6 +1209,7 @@
             verbose = '-v' in sys.argv
         self._verbose = verbose
         self.optionflags = optionflags
+        self.original_optionflags = optionflags
 
         # Keep track of the examples we've run.
         self.tries = 0
@@ -1246,20 +1257,22 @@
             _tag_msg("Exception raised", _exception_traceback(exc_info)))
 
     def _failure_header(self, test, example):
-        s = (self.DIVIDER + "\n" +
-             _tag_msg("Failure in example", example.source))
-        if test.filename is None:
-            # [XX] I'm not putting +1 here, to give the same output
-            # as the old version.  But I think it *should* go here.
-            return s + ("from line #%s of %s\n" %
-                        (example.lineno, test.name))
-        elif test.lineno is None:
-            return s + ("from line #%s of %s in %s\n" %
-                        (example.lineno+1, test.name, test.filename))
+        out = [self.DIVIDER]
+        if test.filename:
+            if test.lineno is not None and example.lineno is not None:
+                lineno = test.lineno + example.lineno + 1
+            else:
+                lineno = '?'
+            out.append('File "%s", line %s, in %s' %
+                       (test.filename, lineno, test.name))
         else:
-            lineno = test.lineno+example.lineno+1
-            return s + ("from line #%s of %s (%s)\n" %
-                        (lineno, test.filename, test.name))
+            out.append('Line %s, in %s' % (example.lineno+1, test.name))
+        out.append('Failed example:')
+        source = example.source
+        if source.endswith('\n'):
+            source = source[:-1]
+        out.append('    ' + '\n    '.join(source.split('\n')))
+        return '\n'.join(out)+'\n'
 
     #/////////////////////////////////////////////////////////////////
     # DocTest Running
@@ -1568,6 +1581,7 @@
         compare `want` and `got`.  `indent` is the indentation of the
         original example.
         """
+        
         # If <BLANKLINE>s are being used, then replace blank lines
         # with <BLANKLINE> in the actual output string.
         if not (optionflags & DONT_ACCEPT_BLANKLINE):
@@ -1600,8 +1614,13 @@
 
         # If we're not using diff, then simply list the expected
         # output followed by the actual output.
-        return (_tag_msg("Expected", want or "Nothing") +
-                _tag_msg("Got", got))
+        if want.endswith('\n'):
+            want = want[:-1]
+        want = '    ' + '\n    '.join(want.split('\n'))
+        if got.endswith('\n'):
+            got = got[:-1]
+        got = '    ' + '\n    '.join(got.split('\n'))
+        return "Expected:\n%s\nGot:\n%s\n" % (want, got)
 
 class DocTestFailure(Exception):
     """A DocTest example has failed in debugging mode.
@@ -1989,6 +2008,7 @@
 
     def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
                  checker=None):
+
         unittest.TestCase.__init__(self)
         self._dt_optionflags = optionflags
         self._dt_checker = checker
@@ -2025,7 +2045,7 @@
         if test.lineno is None:
             lineno = 'unknown line number'
         else:
-            lineno = 'line %s' % test.lineno
+            lineno = '%s' % test.lineno
         lname = '.'.join(test.name.split('.')[-1:])
         return ('Failed doctest test for %s\n'
                 '  File "%s", line %s, in %s\n\n%s'
@@ -2150,9 +2170,7 @@
             continue
         if not test.filename:
             filename = module.__file__
-            if filename.endswith(".pyc"):
-                filename = filename[:-1]
-            elif filename.endswith(".pyo"):
+            if filename[-4:] in (".pyc", ".pyo"):
                 filename = filename[:-1]
             test.filename = filename
         suite.addTest(DocTestCase(test, optionflags, setUp, tearDown,
@@ -2469,10 +2487,13 @@
 ...      42
 ... ''', 'XYZ')
 **********************************************************************
-Failure in example: print x
-from line #2 of XYZ
-Expected: 42
-Got: 84
+Line 3, in XYZ
+Failed example:
+    print x
+Expected:
+    42
+Got:
+    84
 (1, 2)
 >>> t.runstring(">>> x = x * 2\n>>> print x\n84\n", 'example2')
 (0, 2)
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index 3c5fa08..6d9d745 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -267,11 +267,24 @@
 will return a single test (for that function's docstring):
 
     >>> finder = doctest.DocTestFinder()
+
+We'll simulate a __file__ attr that ends in pyc:
+
+    >>> import test.test_doctest
+    >>> old = test.test_doctest.__file__
+    >>> test.test_doctest.__file__ = 'test_doctest.pyc'
+
     >>> tests = finder.find(sample_func)
 
     >>> print tests  # doctest: +ELLIPSIS
     [<DocTest sample_func from ...:12 (1 example)>]
 
+    >>> tests[0].filename
+    'test_doctest.py'
+
+    >>> test.test_doctest.__file__ = old
+    
+
     >>> e = tests[0].examples[0]
     >>> (e.source, e.want, e.lineno)
     ('print sample_func(22)\n', '44\n', 3)
@@ -519,10 +532,13 @@
     Trying: print x
     Expecting: 14
     **********************************************************************
-    Failure in example: print x
-    from line #2 of f
-    Expected: 14
-    Got: 12
+    Line 3, in f
+    Failed example:
+        print x
+    Expected:
+        14
+    Got:
+        12
     Trying: x/2
     Expecting: 6
     ok
@@ -645,8 +661,9 @@
     >>> doctest.DocTestRunner(verbose=False).run(test)
     ... # doctest: +ELLIPSIS
     **********************************************************************
-    Failure in example: raise ValueError, 'message'
-    from line #1 of f
+    Line 2, in f
+    Failed example:
+        raise ValueError, 'message'
     Expected:
         Traceback (most recent call last):
         ValueError: wrong message
@@ -668,11 +685,12 @@
     >>> doctest.DocTestRunner(verbose=False).run(test)
     ... # doctest: +ELLIPSIS
     **********************************************************************
-    Failure in example: 1/0
-    from line #1 of f
+    Line 2, in f
+    Failed example:
+        1/0
     Exception raised:
         Traceback (most recent call last):
-          ...
+        ...
         ZeroDivisionError: integer division or modulo by zero
     (1, 1)
 """
@@ -700,10 +718,13 @@
     >>> flags = doctest.DONT_ACCEPT_TRUE_FOR_1
     >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
     **********************************************************************
-    Failure in example: True
-    from line #0 of f
-    Expected: 1
-    Got: True
+    Line 1, in f
+    Failed example:
+        True
+    Expected:
+        1
+    Got:
+        True
     (1, 1)
 
 The DONT_ACCEPT_BLANKLINE flag disables the match between blank lines
@@ -722,8 +743,9 @@
     >>> flags = doctest.DONT_ACCEPT_BLANKLINE
     >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
     **********************************************************************
-    Failure in example: print "a\n\nb"
-    from line #0 of f
+    Line 1, in f
+    Failed example:
+        print "a\n\nb"
     Expected:
         a
         <BLANKLINE>
@@ -744,12 +766,14 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print 1, 2, 3
-    from line #0 of f
+    Line 1, in f
+    Failed example:
+        print 1, 2, 3
     Expected:
           1   2
          3
-    Got: 1 2 3
+    Got:
+        1 2 3
     (1, 1)
 
     >>> # With the flag:
@@ -773,10 +797,13 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(15)
-    from line #0 of f
-    Expected: [0, 1, 2, ..., 14]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
+    Line 1, in f
+    Failed example:
+        print range(15)
+    Expected:
+        [0, 1, 2, ..., 14]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
     (1, 1)
 
     >>> # With the flag:
@@ -825,8 +852,9 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print '\n'.join('abcdefg')
-    from line #1 of f
+    Line 2, in f
+    Failed example:
+        print '\n'.join('abcdefg')
     Expected:
         a
         B
@@ -850,8 +878,9 @@
     >>> flags = doctest.UNIFIED_DIFF
     >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
     **********************************************************************
-    Failure in example: print '\n'.join('abcdefg')
-    from line #1 of f
+    Line 2, in f
+    Failed example:
+        print '\n'.join('abcdefg')
     Differences (unified diff):
         --- Expected
         +++ Got
@@ -876,8 +905,9 @@
     >>> flags = doctest.CONTEXT_DIFF
     >>> doctest.DocTestRunner(verbose=False, optionflags=flags).run(test)
     **********************************************************************
-    Failure in example: print '\n'.join('abcdefg')
-    from line #1 of f
+    Line 2, in f
+    Failed example:
+        print '\n'.join('abcdefg')
     Differences (context diff):
         *** Expected
         --- Got
@@ -919,10 +949,13 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # should fail: no ellipsis
-    from line #1 of f
-    Expected: [0, 1, ..., 9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 2, in f
+    Failed example:
+        print range(10)       # should fail: no ellipsis
+    Expected:
+        [0, 1, ..., 9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (1, 2)
 
 To turn an option off for an example, follow that example with a
@@ -940,10 +973,13 @@
     >>> doctest.DocTestRunner(verbose=False,
     ...                       optionflags=doctest.ELLIPSIS).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # doctest: -ELLIPSIS
-    from line #5 of f
-    Expected: [0, 1, ..., 9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 6, in f
+    Failed example:
+        print range(10)       # doctest: -ELLIPSIS
+    Expected:
+        [0, 1, ..., 9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (1, 2)
 
 Option directives affect only the example that they appear with; they
@@ -962,15 +998,21 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # Should fail: no ellipsis
-    from line #1 of f
-    Expected: [0, 1, ..., 9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 2, in f
+    Failed example:
+        print range(10)       # Should fail: no ellipsis
+    Expected:
+        [0, 1, ..., 9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     **********************************************************************
-    Failure in example: print range(10)       # Should fail: no ellipsis
-    from line #7 of f
-    Expected: [0, 1, ..., 9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 8, in f
+    Failed example:
+        print range(10)       # Should fail: no ellipsis
+    Expected:
+        [0, 1, ..., 9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (2, 3)
 
 Multiple options may be modified by a single option directive.  They
@@ -986,10 +1028,13 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # Should fail
-    from line #1 of f
-    Expected: [0, 1,  ...,   9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 2, in f
+    Failed example:
+        print range(10)       # Should fail
+    Expected:
+        [0, 1,  ...,   9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (1, 2)
 
     >>> def f(x): r'''
@@ -1002,10 +1047,13 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # Should fail
-    from line #1 of f
-    Expected: [0, 1,  ...,   9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 2, in f
+    Failed example:
+        print range(10)       # Should fail
+    Expected:
+        [0, 1,  ...,   9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (1, 2)
 
     >>> def f(x): r'''
@@ -1018,10 +1066,13 @@
     >>> test = doctest.DocTestFinder().find(f)[0]
     >>> doctest.DocTestRunner(verbose=False).run(test)
     **********************************************************************
-    Failure in example: print range(10)       # Should fail
-    from line #1 of f
-    Expected: [0, 1,  ...,   9]
-    Got: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
+    Line 2, in f
+    Failed example:
+        print range(10)       # Should fail
+    Expected:
+        [0, 1,  ...,   9]
+    Got:
+        [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
     (1, 2)
 
 The option directive may be put on the line following the source, as
@@ -1414,6 +1465,14 @@
 
     """
 
+def test_trailing_space_in_test():
+    """
+    Trailing spaces in expcted output are significant:
+    
+      >>> x, y = 'foo', ''
+      >>> print x, y
+      foo \n
+    """
 
 ######################################################################
 ## Main
