diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 2f1a268..8af8ad2 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -142,15 +142,15 @@
                 self.status = 'EOF in headers'
                 break
             # Skip unix From name time lines
-            if firstline and line[:5] == 'From ':
+            if firstline and line.startswith('From '):
                 self.unixfrom = self.unixfrom + line
                 continue
             firstline = 0
             if headerseen and line[0] in ' \t':
                 # It's a continuation line.
                 list.append(line)
-                x = (self.dict[headerseen] + "\n " + string.strip(line))
-                self.dict[headerseen] = string.strip(x)
+                x = (self.dict[headerseen] + "\n " + line.strip())
+                self.dict[headerseen] = x.strip()
                 continue
             elif self.iscomment(line):
                 # It's a comment.  Ignore it.
@@ -162,7 +162,7 @@
             if headerseen:
                 # It's a legal header line, save it.
                 list.append(line)
-                self.dict[headerseen] = string.strip(line[len(headerseen)+1:])
+                self.dict[headerseen] = line[len(headerseen)+1:].strip()
                 continue
             else:
                 # It's not a header line; throw it back and stop here.
@@ -186,9 +186,9 @@
         You may override this method in order to use Message parsing
         on tagged data in RFC822-like formats with special header formats.
         """
-        i = string.find(line, ':')
+        i = line.find(':')
         if i > 0:
-            return string.lower(line[:i])
+            return line[:i].lower()
         else:
             return None
     
@@ -223,12 +223,12 @@
         times, all occurrences are returned.  Case is not
         important in the header name.
         """
-        name = string.lower(name) + ':'
+        name = name.lower() + ':'
         n = len(name)
         list = []
         hit = 0
         for line in self.headers:
-            if string.lower(line[:n]) == name:
+            if line[:n].lower() == name:
                 hit = 1
             elif line[:1] not in string.whitespace:
                 hit = 0
@@ -243,7 +243,7 @@
         only the first matching header (and its continuation
         lines).
         """
-        name = string.lower(name) + ':'
+        name = name.lower() + ':'
         n = len(name)
         list = []
         hit = 0
@@ -251,7 +251,7 @@
             if hit:
                 if line[:1] not in string.whitespace:
                     break
-            elif string.lower(line[:n]) == name:
+            elif line[:n].lower() == name:
                 hit = 1
             if hit:
                 list.append(line)
@@ -271,7 +271,7 @@
         if not list:
             return None
         list[0] = list[0][len(name) + 1:]
-        return string.joinfields(list, '')
+        return ''.join(list)
     
     def getheader(self, name, default=None):
         """Get the header value for a name.
@@ -282,7 +282,7 @@
         version which finds the *last* such header.
         """
         try:
-            return self.dict[string.lower(name)]
+            return self.dict[name.lower()]
         except KeyError:
             return default
     get = getheader
@@ -301,13 +301,13 @@
         for s in self.getallmatchingheaders(name):
             if s[0] in string.whitespace:
                 if current:
-                    current = "%s\n %s" % (current, string.strip(s))
+                    current = "%s\n %s" % (current, s.strip())
                 else:
-                    current = string.strip(s)
+                    current = s.strip()
             else:
                 if have_header:
                     result.append(current)
-                current = string.strip(s[string.find(s, ":") + 1:])
+                current = s[s.find(":") + 1:].strip()
                 have_header = 1
         if have_header:
             result.append(current)
@@ -341,11 +341,11 @@
             else:
                 if raw:
                     raw.append(', ')
-                i = string.find(h, ':')
+                i = h.find(':')
                 if i > 0:
                     addr = h[i+1:]
                 raw.append(addr)
-        alladdrs = string.join(raw, '')
+        alladdrs = ''.join(raw)
         a = AddrlistClass(alladdrs)
         return a.getaddrlist()
     
@@ -383,7 +383,7 @@
     
     def __getitem__(self, name):
         """Get a specific header, as from a dictionary."""
-        return self.dict[string.lower(name)]
+        return self.dict[name.lower()]
 
     def __setitem__(self, name, value):
         """Set the value of a header.
@@ -393,15 +393,15 @@
         rather than where the altered header was.
         """
         del self[name] # Won't fail if it doesn't exist
-        self.dict[string.lower(name)] = value
+        self.dict[name.lower()] = value
         text = name + ": " + value
-        lines = string.split(text, "\n")
+        lines = text.split("\n")
         for line in lines:
             self.headers.append(line + "\n")
     
     def __delitem__(self, name):
         """Delete all occurrences of a specific header, if it is present."""
-        name = string.lower(name)
+        name = name.lower()
         if not self.dict.has_key(name):
             return
         del self.dict[name]
@@ -411,7 +411,7 @@
         hit = 0
         for i in range(len(self.headers)):
             line = self.headers[i]
-            if string.lower(line[:n]) == name:
+            if line[:n].lower() == name:
                 hit = 1
             elif line[:1] not in string.whitespace:
                 hit = 0
@@ -423,7 +423,7 @@
 
     def has_key(self, name):
         """Determine whether a message contains the named header."""
-        return self.dict.has_key(string.lower(name))
+        return self.dict.has_key(name.lower())
     
     def keys(self):
         """Get all of a message's header field names."""
@@ -466,13 +466,7 @@
 
 def quote(str):
     """Add quotes around a string."""
-    return '"%s"' % string.join(
-    string.split(
-    string.join(
-    string.split(str, '\\'),
-    '\\\\'),
-    '"'),
-    '\\"')
+    return str.replace('\\', '\\\\').replace('"', '\\"')
 
 
 def parseaddr(address):
@@ -543,7 +537,7 @@
         if self.pos >= len(self.field):
             # Bad email address technically, no domain.
             if plist:
-                returnlist = [(string.join(self.commentlist), plist[0])]
+                returnlist = [(' '.join(self.commentlist), plist[0])]
             
         elif self.field[self.pos] in '.@':
             # email address is just an addrspec
@@ -551,7 +545,7 @@
             self.pos = oldpos
             self.commentlist = oldcl
             addrspec = self.getaddrspec()
-            returnlist = [(string.join(self.commentlist), addrspec)]
+            returnlist = [(' '.join(self.commentlist), addrspec)]
             
         elif self.field[self.pos] == ':':
             # address is a group
@@ -571,13 +565,13 @@
             routeaddr = self.getrouteaddr()
             
             if self.commentlist:
-                returnlist = [(string.join(plist) + ' (' + \
-                         string.join(self.commentlist) + ')', routeaddr)]
-            else: returnlist = [(string.join(plist), routeaddr)]
+                returnlist = [(' '.join(plist) + ' (' + \
+                         ' '.join(self.commentlist) + ')', routeaddr)]
+            else: returnlist = [(' '.join(plist), routeaddr)]
             
         else:
             if plist:
-                returnlist = [(string.join(self.commentlist), plist[0])]
+                returnlist = [(' '.join(self.commentlist), plist[0])]
             elif self.field[self.pos] in self.specials:
                 self.pos = self.pos + 1
         
@@ -636,12 +630,12 @@
             self.gotonext()
         
         if self.pos >= len(self.field) or self.field[self.pos] != '@':
-            return string.join(aslist, '')
+            return ''.join(aslist)
         
         aslist.append('@')
         self.pos = self.pos + 1
         self.gotonext()
-        return string.join(aslist, '') + self.getdomain()
+        return ''.join(aslist) + self.getdomain()
     
     def getdomain(self):
         """Get the complete domain name from an address."""
@@ -659,7 +653,7 @@
             elif self.field[self.pos] in self.atomends:
                 break
             else: sdlist.append(self.getatom())
-        return string.join(sdlist, '')
+        return ''.join(sdlist)
     
     def getdelimited(self, beginchar, endchars, allowcomments = 1):
         """Parse a header fragment delimited by special characters.
@@ -695,7 +689,7 @@
                 slist.append(self.field[self.pos])
             self.pos = self.pos + 1
         
-        return string.join(slist, '')
+        return ''.join(slist)
     
     def getquote(self):
         """Get a quote-delimited fragment from self's field."""
@@ -719,7 +713,7 @@
             else: atomlist.append(self.field[self.pos])
             self.pos = self.pos + 1
         
-        return string.join(atomlist, '')
+        return ''.join(atomlist)
     
     def getphraselist(self):
         """Parse a sequence of RFC-822 phrases.
@@ -756,7 +750,7 @@
         return len(self.addresslist)
 
     def __str__(self):
-        return string.joinfields(map(dump_address_pair, self.addresslist),", ")
+        return ", ".join(map(dump_address_pair, self.addresslist))
 
     def __add__(self, other):
         # Set union
@@ -828,17 +822,17 @@
     
     Accounts for military timezones.
     """
-    data = string.split(data)
-    if data[0][-1] in (',', '.') or string.lower(data[0]) in _daynames:
+    data = data.split()
+    if data[0][-1] in (',', '.') or data[0].lower() in _daynames:
         # There's a dayname here. Skip it
         del data[0]
     if len(data) == 3: # RFC 850 date, deprecated
-        stuff = string.split(data[0], '-')
+        stuff = data[0].split('-')
         if len(stuff) == 3:
             data = stuff + data[1:]
     if len(data) == 4:
         s = data[3]
-        i = string.find(s, '+')
+        i = s.find('+')
         if i > 0:
             data[3:] = [s[:i], s[i+1:]]
         else:
@@ -847,16 +841,16 @@
         return None
     data = data[:5]
     [dd, mm, yy, tm, tz] = data
-    mm = string.lower(mm)
+    mm = mm.lower()
     if not mm in _monthnames:
-        dd, mm = mm, string.lower(dd)
+        dd, mm = mm, dd.lower()
         if not mm in _monthnames:
             return None
     mm = _monthnames.index(mm)+1
     if mm > 12: mm = mm - 12
     if dd[-1] == ',':
         dd = dd[:-1]
-    i = string.find(yy, ':')
+    i = yy.find(':')
     if i > 0:
         yy, tm = tm, yy
     if yy[-1] == ',':
@@ -865,7 +859,7 @@
         yy, tz = tz, yy
     if tm[-1] == ',':
         tm = tm[:-1]
-    tm = string.splitfields(tm, ':')
+    tm = tm.split(':')
     if len(tm) == 2:
         [thh, tmm] = tm
         tss = '0'
@@ -874,21 +868,21 @@
     else:
         return None
     try:
-        yy = string.atoi(yy)
-        dd = string.atoi(dd)
-        thh = string.atoi(thh)
-        tmm = string.atoi(tmm)
-        tss = string.atoi(tss)
-    except string.atoi_error:
+        yy = int(yy)
+        dd = int(dd)
+        thh = int(thh)
+        tmm = int(tmm)
+        tss = int(tss)
+    except ValueError:
         return None
-    tzoffset=None
-    tz=string.upper(tz)
+    tzoffset = None
+    tz = tz.upper()
     if _timezones.has_key(tz):
-        tzoffset=_timezones[tz]
+        tzoffset = _timezones[tz]
     else:
         try: 
-            tzoffset=string.atoi(tz)
-        except string.atoi_error: 
+            tzoffset = int(tz)
+        except ValueError: 
             pass
     # Convert a timezone offset into seconds ; -0500 -> -18000
     if tzoffset:
@@ -904,8 +898,8 @@
 
 def parsedate(data):
     """Convert a time string to a time tuple."""
-    t=parsedate_tz(data)
-    if type(t)==type( () ):
+    t = parsedate_tz(data)
+    if type(t) == type( () ):
         return t[:9]
     else: return t    
 
