diff --git a/Lib/pydoc.py b/Lib/pydoc.py
index be2a73e..2aea8c0 100755
--- a/Lib/pydoc.py
+++ b/Lib/pydoc.py
@@ -390,7 +390,7 @@
             # needed to make any special characters, so show a raw string.
             return 'r' + testrepr[0] + self.escape(test) + testrepr[0]
         return re.sub(r'((\\[\\abfnrtv\'"]|\\[0-9]..|\\x..|\\u....)+)',
-                      r'<span class="">\1</span>',
+                      r'<font color="#c040c0">\1</font>',
                       self.escape(testrepr))
 
     repr_str = repr_string
@@ -417,7 +417,7 @@
         return '''
 <!doctype html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
 <html><head><title>Python: %s</title>
-</head><body>
+</head><body bgcolor="#f0f0f8">
 %s
 </body></html>''' % (title, contents)
 
@@ -456,7 +456,7 @@
 
     def bigsection(self, title, *args):
         """Format a section with a big heading."""
-        title = '<span class="bigsection">%s</span>' % title
+        title = '<big><strong>%s</strong></big>' % title
         return self.section(title, *args)
 
     def preformat(self, text):
@@ -477,7 +477,7 @@
             result = result + '</td>'
         return '<table width="100%%" summary="list"><tr>%s</tr></table>' % result
 
-    def grey(self, text): return '<span class="grey">%s</span>' % text
+    def grey(self, text): return '<font color="#909090">%s</font>' % text
 
     def namelink(self, name, *dicts):
         """Make a link for an identifier, given name-to-URL mappings."""
@@ -508,7 +508,7 @@
         else:
             url = '%s.html' % name
         if ispackage:
-            text = '<span class="package">%s</span>&nbsp;(package)' % name
+            text = '<strong>%s</strong>&nbsp;(package)' % name
         else:
             text = name
         return '<a href="%s">%s</a>' % (url, text)
@@ -542,7 +542,7 @@
             elif text[end:end+1] == '(':
                 results.append(self.namelink(name, methods, funcs, classes))
             elif selfdot:
-                results.append('self.<span class="selfdot">%s</span>' % name)
+                results.append('self.<strong>%s</strong>' % name)
             else:
                 results.append(self.namelink(name, classes))
             here = end
@@ -557,14 +557,14 @@
         for entry in tree:
             if type(entry) is type(()):
                 c, bases = entry
-                result = result + '<dt class="classlink">'
+                result = result + '<dt><font face="helvetica, arial">'
                 result = result + self.classlink(c, modname)
                 if bases and bases != (parent,):
                     parents = []
                     for base in bases:
                         parents.append(self.classlink(base, modname))
                     result = result + '(' + ', '.join(parents) + ')'
-                result = result + '\n</dt>'
+                result = result + '\n</font></dt>'
             elif type(entry) is type([]):
                 result = result + '<dd>\n%s</dd>\n' % self.formattree(
                     entry, modname, c)
@@ -581,10 +581,10 @@
         links = []
         for i in range(len(parts)-1):
             links.append(
-                '<a href="%s.html" class="links">%s</a>' %
+                '<a href="%s.html"><font color="#ffffff">%s</font></a>' %
                 ('.'.join(parts[:i+1]), parts[i]))
         linkedname = '.'.join(links + parts[-1:])
-        head = '<span class="linkedname">%s</span>' % linkedname
+        head = '<big><big><strong>%s</strong></big></big>' % linkedname
         try:
             path = inspect.getabsfile(object)
             url = path
