The usual.
diff --git a/Lib/dos-8x3/exceptio.py b/Lib/dos-8x3/exceptio.py
index 12da416..2963c04 100644
--- a/Lib/dos-8x3/exceptio.py
+++ b/Lib/dos-8x3/exceptio.py
@@ -60,6 +60,7 @@
 """
 
 class Exception:
+    """Proposed base class for all exceptions."""
     def __init__(self, *args):
         self.args = args
 
@@ -75,9 +76,11 @@
         return self.args[i]
 
 class StandardError(Exception):
+    """Base class for all standard Python exceptions."""
     pass
 
 class SyntaxError(StandardError):
+    """Invalid syntax."""
     filename = lineno = offset = text = None
     msg = ""
     def __init__(self, *args):
@@ -94,8 +97,7 @@
         return str(self.msg)
 
 class EnvironmentError(StandardError):
-    """Base class for exceptions that occur outside the Python system.
-    Primarily used as a base class for OSError and IOError."""
+    """Base class for I/O related errors."""
     def __init__(self, *args):
         self.args = args
         self.errno = None
@@ -126,70 +128,94 @@
             return StandardError.__str__(self)
 
 class IOError(EnvironmentError):
+    """I/O operation failed."""
     pass
 
 class OSError(EnvironmentError):
-    """Used by the posix module."""
+    """OS system call failed."""
     pass
 
 class RuntimeError(StandardError):
+    """Unspecified run-time error."""
     pass
 
 class NotImplementedError(RuntimeError):
+    """Method or function hasn't been implemented yet."""
     pass
 
 class SystemError(StandardError):
+    """Internal error in the Python interpreter.
+
+    Please report this to the Python maintainer, along with the traceback,
+    the Python version, and the hardware/OS platform and version."""
     pass
 
 class EOFError(StandardError):
+    """Read beyond end of file."""
     pass
 
 class ImportError(StandardError):
+    """Import can't find module, or can't find name in module."""
     pass
 
 class TypeError(StandardError):
+    """Inappropriate argument type."""
     pass
 
 class ValueError(StandardError):
+    """Inappropriate argument value (of correct type)."""
     pass
 
 class KeyboardInterrupt(StandardError):
+    """Program interrupted by user."""
     pass
 
 class AssertionError(StandardError):
+    """Assertion failed."""
     pass
 
 class ArithmeticError(StandardError):
+    """Base class for arithmetic errors."""
     pass
 
 class OverflowError(ArithmeticError):
+    """Result too large to be represented."""
     pass
 
 class FloatingPointError(ArithmeticError):
+    """Floating point operation failed."""
     pass
 
 class ZeroDivisionError(ArithmeticError):
+    """Second argument to a division or modulo operation was zero."""
     pass
 
 class LookupError(StandardError):
+    """Base class for lookup errors."""
     pass
 
 class IndexError(LookupError):
+    """Sequence index out of range."""
     pass
 
 class KeyError(LookupError):
+    """Mapping key not found."""
     pass
 
 class AttributeError(StandardError):
+    """Attribute not found."""
     pass
 
 class NameError(StandardError):
+    """Name not found locally or globally."""
     pass
 
 class MemoryError(StandardError):
+    """Out of memory."""
     pass
 
 class SystemExit(Exception):
+    """Request to exit from the interpreter."""
     def __init__(self, *args):
         self.args = args
         if len(args) == 0:
diff --git a/Lib/dos-8x3/formatte.py b/Lib/dos-8x3/formatte.py
index a3e82a4..4b340d5 100755
--- a/Lib/dos-8x3/formatte.py
+++ b/Lib/dos-8x3/formatte.py
@@ -331,7 +331,7 @@
         self.atbreak = 0
 
     def send_paragraph(self, blankline):
-        self.file.write('\n' + '\n'*blankline)
+        self.file.write('\n'*blankline)
         self.col = 0
         self.atbreak = 0
 
diff --git a/Lib/dos-8x3/telnetli.py b/Lib/dos-8x3/telnetli.py
index 8cf372e..efb2b40 100644
--- a/Lib/dos-8x3/telnetli.py
+++ b/Lib/dos-8x3/telnetli.py
@@ -376,6 +376,9 @@
 
     def interact(self):
         """Interaction function, emulates a very dumb telnet client."""
+        if sys.platform == "win32":
+            self.mt_interact()
+            return
         while 1:
             rfd, wfd, xfd = select.select([self, sys.stdin], [], [])
             if self in rfd:
@@ -393,6 +396,29 @@
                     break
                 self.write(line)
 
+    def mt_interact(self):
+        """Multithreaded version of interact()."""
+        import thread
+        thread.start_new_thread(self.listener, ())
+        while 1:
+            line = sys.stdin.readline()
+            if not line:
+                break
+            self.write(line)
+
+    def listener(self):
+        """Helper for mt_interact() -- this executes in the other thread."""
+        while 1:
+            try:
+                data = self.read_eager()
+            except EOFError:
+                print '*** Connection closed by remote host ***'
+                return
+            if data:
+                sys.stdout.write(data)
+            else:
+                sys.stdout.flush()
+
     def expect(self, list, timeout=None):
         """Read until one from a list of a regular expressions matches.
 
diff --git a/Lib/dos-8x3/test_rfc.py b/Lib/dos-8x3/test_rfc.py
new file mode 100644
index 0000000..b8ae8c7
--- /dev/null
+++ b/Lib/dos-8x3/test_rfc.py
@@ -0,0 +1,82 @@
+from test_support import verbose
+import rfc822, sys
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+def test(msg, results):
+    fp = StringIO()
+    fp.write(msg)
+    fp.seek(0)
+    m = rfc822.Message(fp)
+    i = 0
+    for n, a in m.getaddrlist('to') + m.getaddrlist('cc'):
+        if verbose:
+            print 'name:', repr(n), 'addr:', repr(a)
+        try:
+            mn, ma = results[i][0], results[i][1]
+        except IndexError:
+            print 'extra parsed address:', repr(n), repr(a)
+            continue
+        i = i + 1
+        if mn == n and ma == a:
+            if verbose:
+                print '    [matched]'
+        else:
+            if verbose:
+                print '    [no match]'
+            print 'not found:', repr(n), repr(a)
+
+test('''Date:    Wed, 13 Jan 1999 23:57:35 -0500
+From:    Guido van Rossum <guido@CNRI.Reston.VA.US>
+To:      "Guido van
+	 : Rossum" <guido@python.org>
+Subject: test2
+
+test2
+''', [('Guido van\n	 : Rossum', 'guido@python.org')])
+
+test('''From: Barry <bwarsaw@python.org
+To: guido@python.org (Guido: the Barbarian)
+Subject: nonsense
+
+test''', [('Guido: the Barbarian', 'guido@python.org'),
+          ])
+
+test('''From: Barry <bwarsaw@python.org
+To: guido@python.org (Guido: the Barbarian)
+Cc: "Guido: the Madman" <guido@python.org>
+
+test''', [('Guido: the Barbarian', 'guido@python.org'),
+          ('Guido: the Madman', 'guido@python.org')
+          ])
+
+test('''To: "The monster with
+     the very long name: Guido" <guido@python.org>
+
+test''', [('The monster with\n     the very long name: Guido',
+           'guido@python.org')])
+
+test('''To: "Amit J. Patel" <amitp@Theory.Stanford.EDU>
+CC: Mike Fletcher <mfletch@vrtelecom.com>,
+        "'string-sig@python.org'" <string-sig@python.org>
+Cc: fooz@bat.com, bart@toof.com
+Cc: goit@lip.com
+
+test''', [('Amit J. Patel', 'amitp@Theory.Stanford.EDU'),
+          ('Mike Fletcher', 'mfletch@vrtelecom.com'),
+          ("'string-sig@python.org'", 'string-sig@python.org'),
+          ('', 'fooz@bat.com'),
+          ('', 'bart@toof.com'),
+          ('', 'goit@lip.com'),
+          ])
+
+# This one is just twisted.  I don't know what the proper result should be,
+# but it shouldn't be to infloop, which is what used to happen!
+test('''To: <[smtp:dd47@mail.xxx.edu]_at_hmhq@hdq-mdm1-imgout.companay.com>
+
+test''', [('', ''),
+          ('', 'dd47@mail.xxx.edu'),
+          ('', '_at_hmhq@hdq-mdm1-imgout.companay.com')
+          ])
diff --git a/Lib/dos-8x3/userlist.py b/Lib/dos-8x3/userlist.py
index 1d5065f..93e4a7e 100755
--- a/Lib/dos-8x3/userlist.py
+++ b/Lib/dos-8x3/userlist.py
@@ -49,3 +49,4 @@
 	def index(self, item): return self.data.index(item)
 	def reverse(self): self.data.reverse()
 	def sort(self, *args): apply(self.data.sort, args)
+	def extend(self, list): self.data.extend(list)