diff --git a/Lib/idlelib/EditorWindow.py b/Lib/idlelib/EditorWindow.py
index dccd3ff..bc61afb 100644
--- a/Lib/idlelib/EditorWindow.py
+++ b/Lib/idlelib/EditorWindow.py
@@ -1138,7 +1138,7 @@
             if not self.context_use_ps1:
                 for context in self.num_context_lines:
                     startat = max(lno - context, 1)
-                    startatindex = `startat` + ".0"
+                    startatindex = repr(startat) + ".0"
                     rawtext = text.get(startatindex, "insert")
                     y.set_str(rawtext)
                     bod = y.find_good_parse_start(
diff --git a/Lib/idlelib/HyperParser.py b/Lib/idlelib/HyperParser.py
index 519de74..31f46b1 100644
--- a/Lib/idlelib/HyperParser.py
+++ b/Lib/idlelib/HyperParser.py
@@ -31,7 +31,7 @@
         if not editwin.context_use_ps1:
             for context in editwin.num_context_lines:
                 startat = max(lno - context, 1)
-                startatindex = `startat` + ".0"
+                startatindex = repr(startat) + ".0"
                 stopatindex = "%d.end" % lno
                 # We add the newline because PyParse requires a newline at end.
                 # We add a space so that index won't be at end of line, so that
diff --git a/Lib/plat-mac/aetypes.py b/Lib/plat-mac/aetypes.py
index ea01422..e5781ef 100644
--- a/Lib/plat-mac/aetypes.py
+++ b/Lib/plat-mac/aetypes.py
@@ -128,7 +128,7 @@
         self.keyword = "%-4.4s" % str(keyword)
 
     def __repr__(self):
-        return "Keyword(%r)" % `self.keyword`
+        return "Keyword(%r)" % self.keyword
 
     def __str__(self):
         return string.strip(self.keyword)
diff --git a/Lib/test/list_tests.py b/Lib/test/list_tests.py
index 14b54c7..453c51c 100644
--- a/Lib/test/list_tests.py
+++ b/Lib/test/list_tests.py
@@ -37,7 +37,7 @@
 
         self.assertEqual(str(a0), str(l0))
         self.assertEqual(repr(a0), repr(l0))
-        self.assertEqual(`a2`, `l2`)
+        self.assertEqual(repr(a2), repr(l2))
         self.assertEqual(str(a2), "[0, 1, 2]")
         self.assertEqual(repr(a2), "[0, 1, 2]")
 
diff --git a/Lib/test/test_doctest.py b/Lib/test/test_doctest.py
index e8379c5..12d75dd 100644
--- a/Lib/test/test_doctest.py
+++ b/Lib/test/test_doctest.py
@@ -605,7 +605,7 @@
     ...     if isinstance(piece, doctest.Example):
     ...         print 'Example:', (piece.source, piece.want, piece.lineno)
     ...     else:
-    ...         print '   Text:', `piece`
+    ...         print '   Text:', repr(piece)
        Text: '\n'
     Example: ('x, y = 2, 3  # no output expected\n', '', 1)
        Text: ''
diff --git a/Lib/test/test_grammar.py b/Lib/test/test_grammar.py
index 0ce43dc..331d527 100644
--- a/Lib/test/test_grammar.py
+++ b/Lib/test/test_grammar.py
@@ -685,7 +685,7 @@
 
 
 print 'atoms'
-### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | '`' testlist '`' | NAME | NUMBER | STRING
+### atom: '(' [testlist] ')' | '[' [testlist] ']' | '{' [dictmaker] '}' | NAME | NUMBER | STRING
 ### dictmaker: test ':' test (',' test ':' test)* [',']
 
 x = (1)
@@ -706,8 +706,6 @@
 x = {'one': 1, 'two': 2,}
 x = {'one': 1, 'two': 2, 'three': 3, 'four': 4, 'five': 5, 'six': 6}
 
-x = `x`
-x = `1 or 2 or 3`
 x = x
 x = 'x'
 x = 123
diff --git a/Lib/test/test_mutants.py b/Lib/test/test_mutants.py
index 7fc9ba3..8afda75 100644
--- a/Lib/test/test_mutants.py
+++ b/Lib/test/test_mutants.py
@@ -209,7 +209,7 @@
         # Tim sez:  "luck of the draw; crashes with or without for me."
         print >> f
 
-        return `"machiavelli"`
+        return repr("machiavelli")
 
     def __hash__(self):
         return 0
diff --git a/Lib/test/test_site.py b/Lib/test/test_site.py
index 05a4ac4..d379ab5 100644
--- a/Lib/test/test_site.py
+++ b/Lib/test/test_site.py
@@ -164,7 +164,7 @@
         site.abs__file__()
         for module in (sys, os, __builtin__):
             try:
-                self.failUnless(os.path.isabs(module.__file__), `module`)
+                self.failUnless(os.path.isabs(module.__file__), repr(module))
             except AttributeError:
                 continue
         # We could try everything in sys.modules; however, when regrtest.py
diff --git a/Lib/test/test_userdict.py b/Lib/test/test_userdict.py
index bc45bf3..447f434 100644
--- a/Lib/test/test_userdict.py
+++ b/Lib/test/test_userdict.py
@@ -46,7 +46,7 @@
         # Test __repr__
         self.assertEqual(str(u0), str(d0))
         self.assertEqual(repr(u1), repr(d1))
-        self.assertEqual(`u2`, `d2`)
+        self.assertEqual(repr(u2), repr(d2))
 
         # Test __cmp__ and __len__
         all = [d0, d1, d2, u, u0, u1, u2, uu, uu0, uu1, uu2]
diff --git a/Lib/test/test_weakref.py b/Lib/test/test_weakref.py
index f5114b2..1165980 100644
--- a/Lib/test/test_weakref.py
+++ b/Lib/test/test_weakref.py
@@ -51,10 +51,10 @@
         # Live reference:
         o = C()
         wr = weakref.ref(o)
-        `wr`
+        repr(wr)
         # Dead reference:
         del o
-        `wr`
+        repr(wr)
 
     def test_basic_callback(self):
         self.check_basic_callback(C)
diff --git a/Lib/test/tokenize_tests.txt b/Lib/test/tokenize_tests.txt
index 59e51d7..1facfc1 100644
--- a/Lib/test/tokenize_tests.txt
+++ b/Lib/test/tokenize_tests.txt
@@ -21,7 +21,7 @@
   5]
 z = {'a':5,
   'b':6}
-x = (len(`y`) + 5*x - a[
+x = (len(repr(y)) + 5*x - a[
    3 ]
    - x + len({
    }
diff --git a/Lib/wsgiref/headers.py b/Lib/wsgiref/headers.py
index 0908f60..c364b26 100644
--- a/Lib/wsgiref/headers.py
+++ b/Lib/wsgiref/headers.py
@@ -140,7 +140,7 @@
         return self._headers[:]
 
     def __repr__(self):
-        return "Headers(%s)" % `self._headers`
+        return "Headers(%r)" % self._headers
 
     def __str__(self):
         """str() returns the formatted headers, complete with end line,
diff --git a/Lib/wsgiref/simple_server.py b/Lib/wsgiref/simple_server.py
index 95996cc..e6c9f38 100644
--- a/Lib/wsgiref/simple_server.py
+++ b/Lib/wsgiref/simple_server.py
@@ -169,7 +169,7 @@
     print >>stdout
     h = environ.items(); h.sort()
     for k,v in h:
-        print >>stdout, k,'=',`v`
+        print >>stdout, k,'=',repr(v)
     start_response("200 OK", [('Content-Type','text/plain')])
     return [stdout.getvalue()]
 
