diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 3cec6df..64deaec 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -93,10 +93,11 @@
 	# reproduce the header exactly as it appears in the file).
 
 	def readheaders(self):
+		self.dict = {}
 		self.unixfrom = ''
 		self.headers = list = []
 		self.status = ''
-		headerseen = 0
+		headerseen = ""
 		firstline = 1
 		while 1:
 			line = self.fp.readline()
@@ -113,10 +114,16 @@
 			elif headerseen and line[0] in ' \t':
 				# It's a continuation line.
 				list.append(line)
-			elif regex.match('^[!-9;-~]+:', line) >= 0:
+				x = (self.dict[headerseen] + "\n " +
+				     string.strip(line))
+				self.dict[headerseen] = string.strip(x)
+			elif ':' in line:
 				# It's a header line.
 				list.append(line)
-				headerseen = 1
+				i = string.find(line, ':')
+				headerseen = string.lower(line[:i])
+				self.dict[headerseen] = string.strip(
+					line[i+1:])
 			else:
 				# It's not a header line; stop here.
 				if not headerseen:
@@ -198,22 +205,25 @@
 		return string.joinfields(list, '')
 
 
-	# Going one step further: also strip leading and trailing
-	# whitespace.
+	# The normal interface: return a stripped version of the
+	# header value with a name, or None if it doesn't exist.  This
+	# uses the dictionary version which finds the *last* such
+	# header.
 
 	def getheader(self, name):
-		text = self.getrawheader(name)
-		if text == None:
+		try:
+			return self.dict[string.lower(name)]
+		except KeyError:
 			return None
-		return string.strip(text)
 
 
 	# Retrieve a single address from a header as a tuple, e.g.
 	# ('Guido van Rossum', 'guido@cwi.nl').
 
 	def getaddr(self, name):
-		data = self.getheader(name)
-		if not data:
+		try:
+			data = self[name]
+		except KeyError:
 			return None, None
 		return parseaddr(data)
 
@@ -224,8 +234,9 @@
 		# XXX This function is not really correct.  The split
 		# on ',' might fail in the case of commas within
 		# quoted strings.
-		data = self.getheader(name)
-		if not data:
+		try:
+			data = self[name]
+		except KeyError:
 			return []
 		data = string.splitfields(data, ',')
 		for i in range(len(data)):
@@ -236,55 +247,32 @@
 	# with time.mktime().
 
 	def getdate(self, name):
-		data = self.getheader(name)
-		if not data:
+		try:
+			data = self[name]
+		except KeyError:
 			return None
 		return parsedate(data)
 
 
-	# Access as a dictionary (only finds first header of each type):
+	# Access as a dictionary (only finds *last* header of each type):
 
 	def __len__(self):
-		types = {}
-		for line in self.headers:
-			if line[0] in string.whitespace: continue
-			i = string.find(line, ':')
-			if i > 0:
-				name = string.lower(line[:i])
-				types[name] = None
-		return len(types)
+		return len(self.dict)
 
 	def __getitem__(self, name):
-		value = self.getheader(name)
-		if value is None: raise KeyError, name
-		return value
+		return self.dict[string.lower(name)]
 
 	def has_key(self, name):
-		value = self.getheader(name)
-		return value is not None
+		return self.dict.has_key(string.lower(name))
 
 	def keys(self):
-		types = {}
-		for line in self.headers:
-			if line[0] in string.whitespace: continue
-			i = string.find(line, ':')
-			if i > 0:
-				name = line[:i]
-				key = string.lower(name)
-				types[key] = name
-		return types.values()
+		return self.dict.keys()
 
 	def values(self):
-		values = []
-		for name in self.keys():
-			values.append(self[name])
-		return values
+		return self.dict.values()
 
 	def items(self):
-		items = []
-		for name in self.keys():
-			items.append(name, self[name])
-		return items
+		return self.dict.items()
 
 
 
