The usual.
diff --git a/Lib/dos-8x3/simpleht.py b/Lib/dos-8x3/simpleht.py
index 8a77758..4cfedbc 100755
--- a/Lib/dos-8x3/simpleht.py
+++ b/Lib/dos-8x3/simpleht.py
@@ -6,7 +6,7 @@
 """
 
 
-__version__ = "0.4"
+__version__ = "0.5"
 
 
 import os
@@ -99,6 +99,7 @@
             return None
         list.sort(lambda a, b: cmp(a.lower(), b.lower()))
         f = StringIO()
+        f.write("<title>Directory listing for %s</title>\n" % self.path)
         f.write("<h2>Directory listing for %s</h2>\n" % self.path)
         f.write("<hr>\n<ul>\n")
         for name in list:
@@ -107,7 +108,7 @@
             # Append / for directories or @ for symbolic links
             if os.path.isdir(fullname):
                 displayname = name + "/"
-                linkname = name + os.sep
+                linkname = name + "/"
             if os.path.islink(fullname):
                 displayname = name + "@"
                 # Note: a link to a directory displays with @ and links with /
diff --git a/Lib/dos-8x3/sre_pars.py b/Lib/dos-8x3/sre_pars.py
index a50191e..55de24c 100644
--- a/Lib/dos-8x3/sre_pars.py
+++ b/Lib/dos-8x3/sre_pars.py
@@ -15,9 +15,9 @@
 MAXREPEAT = 65535
 
 SPECIAL_CHARS = ".\\[{()*+?^$|"
-REPEAT_CHARS  = "*+?{"
+REPEAT_CHARS = "*+?{"
 
-DIGITS = tuple("012345689")
+DIGITS = tuple("0123456789")
 
 OCTDIGITS = tuple("01234567")
 HEXDIGITS = tuple("0123456789abcdefABCDEF")
@@ -259,13 +259,12 @@
             # hexadecimal escape
             while source.next in HEXDIGITS and len(escape) < 4:
                 escape = escape + source.get()
-            escape = escape[2:]
-            if len(escape) != 2:
-                raise error, "bogus escape: %s" % repr("\\" + escape)
-            return LITERAL, int(escape, 16) & 0xff
+            if len(escape) != 4:
+                raise ValueError
+            return LITERAL, int(escape[2:], 16) & 0xff
         elif escape[1:2] == "0":
             # octal escape
-            while source.next in OCTDIGITS and len(escape) < 5:
+            while source.next in OCTDIGITS and len(escape) < 4:
                 escape = escape + source.get()
             return LITERAL, int(escape[1:], 8) & 0xff
         elif escape[1:2] in DIGITS:
@@ -273,7 +272,8 @@
             here = source.tell()
             if source.next in DIGITS:
                 escape = escape + source.get()
-                if escape[2] in OCTDIGITS and source.next in OCTDIGITS:
+                if (escape[1] in OCTDIGITS and escape[2] in OCTDIGITS and
+                    source.next in OCTDIGITS):
                     # got three octal digits; this is an octal escape
                     escape = escape + source.get()
                     return LITERAL, int(escape[1:], 8) & 0xff
@@ -281,7 +281,7 @@
             group = _group(escape, state.groups)
             if group:
                 return GROUPREF, group
-            raise error, "bogus escape: %s" % repr(escape)
+            raise ValueError
         if len(escape) == 2:
             return LITERAL, ord(escape[1])
     except ValueError:
diff --git a/Lib/dos-8x3/test_mma.py b/Lib/dos-8x3/test_mma.py
index 73c1a15..449c674 100644
--- a/Lib/dos-8x3/test_mma.py
+++ b/Lib/dos-8x3/test_mma.py
@@ -40,7 +40,7 @@
     assert m[0] == '3'
     print '  Contents of first 3 bytes:', repr(m[0:3])
     assert m[0:3] == '3\0\0'
-    print '  Contents of second page:',  m[PAGESIZE-1 : PAGESIZE + 7]
+    print '  Contents of second page:',  repr(m[PAGESIZE-1 : PAGESIZE + 7])
     assert m[PAGESIZE-1 : PAGESIZE + 7] == '\0foobar\0'
     
     m.flush()
@@ -119,4 +119,3 @@
     print ' Test passed'
 
 test_both()
-
diff --git a/Lib/dos-8x3/test_pop.py b/Lib/dos-8x3/test_pop.py
index 26ef9d9..1215847 100644
--- a/Lib/dos-8x3/test_pop.py
+++ b/Lib/dos-8x3/test_pop.py
@@ -28,16 +28,20 @@
     print "Testing os module:"
     import popen2
     cmd  = "cat"
-    teststr = "abc\n"
-    resultstr = teststr
+    teststr = "ab cd\n"
     if os.name == "nt":
         cmd = "more"
-        resultstr = "\n" + resultstr
+    # "more" doesn't act the same way across Windows flavors,
+    # sometimes adding an extra newline at the start or the
+    # end.  So we strip whitespace off both ends for comparison.
+    expected = teststr.strip()
     print "testing popen2..."
     w, r = os.popen2(cmd)
     w.write(teststr)
     w.close()
-    assert r.read() == resultstr
+    got = r.read()
+    if got.strip() != expected:
+        raise ValueError("wrote %s read %s" % (`teststr`, `got`))
     print "testing popen3..."
     try:
         w, r, e = os.popen3([cmd])
@@ -45,11 +49,16 @@
         w, r, e = os.popen3(cmd)
     w.write(teststr)
     w.close()
-    assert r.read() == resultstr
-    assert e.read() == ""
+    got = r.read()
+    if got.strip() != expected:
+        raise ValueError("wrote %s read %s" % (`teststr`, `got`))
+    got = e.read()
+    if got:
+        raise ValueError("unexected %s on stderr" % `got`)
     for inst in popen2._active[:]:
         inst.wait()
-    assert not popen2._active
+    if popen2._active:
+        raise ValueError("_active not empty")
     print "All OK"
 
 main()
diff --git a/Lib/dos-8x3/webbrows.py b/Lib/dos-8x3/webbrows.py
index 5a4a80f..66cdbff 100644
--- a/Lib/dos-8x3/webbrows.py
+++ b/Lib/dos-8x3/webbrows.py
@@ -183,9 +183,7 @@
 
 class WindowsDefault:
     def open(self, url, new=0):
-        import win32api, win32con
-        win32api.ShellExecute(0, "open", url, None, ".",
-                              win32con.SW_SHOWNORMAL)
+        self.junk = os.popen("start " + url)
 
     def open_new(self, url):
         self.open(url)