diff --git a/Lib/dos-8x3/configpa.py b/Lib/dos-8x3/configpa.py
new file mode 100644
index 0000000..2f3ca51
--- /dev/null
+++ b/Lib/dos-8x3/configpa.py
@@ -0,0 +1,255 @@
+"""Configuration file parser.
+
+A setup file consists of sections, lead by a "[section]" header,
+and followed by "name: value" entries, with continuations and such in
+the style of rfc822.
+
+The option values can contain format strings which refer to other
+values in the same section, or values in a special [DEFAULT] section.
+For example:
+
+    something: %(dir)s/whatever
+
+would resolve the "%(dir)s" to the value of dir.  All reference
+expansions are done late, on demand.
+
+Intrinsic defaults can be specified by passing them into the
+ConfigParser constructor as a dictionary.
+
+class:
+
+ConfigParser -- responsible for for parsing a list of
+                configuration files, and managing the parsed database.
+
+    methods:
+
+    __init__(defaults=None) -- create the parser and specify a
+                               dictionary of intrinsic defaults.  The
+                               keys must be strings, the values must
+                               be appropriate for %()s string
+                               interpolation.  Note that `name' is
+                               always an intrinsic default; it's value
+                               is the section's name.
+
+    sections() -- return all the configuration section names, sans DEFAULT
+
+    options(section) -- return list of configuration options for the named
+			section
+
+    read(*filenames) -- read and parse the list of named configuration files
+
+    get(section, option, raw=0) -- return a string value for the named
+				   option.  All % interpolations are
+				   expanded in the return values, based on
+				   the defaults passed into the constructor
+				   and the DEFAULT section.
+
+    getint(section, options) -- like get(), but convert value to an integer
+
+    getfloat(section, options) -- like get(), but convert value to a float
+
+    getboolean(section, options) -- like get(), but convert value to
+				    a boolean (currently defined as 0
+				    or 1, only)
+"""
+
+import sys
+import string
+import regex
+from types import ListType
+
+
+SECTHEAD_RE = "^\[\([-A-Za-z0-9]*\)\][" + string.whitespace + "]*$"
+secthead_cre = regex.compile(SECTHEAD_RE)
+OPTION_RE = "^\([-A-Za-z0-9.]+\)\(:\|[" + string.whitespace + "]*=\)\(.*\)$"
+option_cre = regex.compile(OPTION_RE)
+
+DEFAULTSECT = "DEFAULT"
+
+
+
+# exception classes
+class Error:
+    def __init__(self, msg=''):
+	self.__msg = msg
+    def __repr__(self):
+	return self.__msg
+
+class NoSectionError(Error):
+    def __init__(self, section):
+	Error.__init__(self, 'No section: %s' % section)
+	self.section = section
+
+class DuplicateSectionError(Error):
+    def __init__(self, section):
+	Error.__init__(self, "Section %s already exists" % section)
+	self.section = section
+
+class NoOptionError(Error):
+    def __init__(self, option, section):
+	Error.__init__(self, "No option `%s' in section: %s" %
+		       (option, section))
+	self.option = option
+	self.section = section
+
+class InterpolationError(Error):
+    def __init__(self, reference, option, section):
+	Error.__init__(self,
+		       "Bad value substitution: sect `%s', opt `%s', ref `%s'"
+		       % (section, option, reference))
+	self.reference = reference
+	self.option = option
+	self.section = section
+
+
+
+class ConfigParser:
+    def __init__(self, defaults=None):
+	self.__sections = {}
+	if defaults is None:
+	    self.__defaults = {}
+	else:
+	    self.__defaults = defaults
+
+    def defaults(self):
+	return self.__defaults
+
+    def sections(self):
+	"""Return a list of section names, excluding [DEFAULT]"""
+	# self.__sections will never have [DEFAULT] in it
+	return self.__sections.keys()
+
+    def add_section(self, section):
+	"""Create a new section in the configuration.
+
+	Raise DuplicateSectionError if a section by the specified name
+	already exists.
+	"""
+	if self.__sections.has_key(section):
+	    raise DuplicateSectionError(section)
+	self.__sections[section] = {}
+
+    def has_section(self, section):
+	"""Indicate whether the named section is present in the configuration.
+
+	The DEFAULT section is not acknowledged.
+	"""
+	return self.__sections.has_key(section)
+
+    def options(self, section):
+	try:
+	    opts = self.__sections[section].copy()
+	except KeyError:
+	    raise NoSectionError(section)
+	opts.update(self.__defaults)
+	return opts.keys()
+
+    def read(self, filenames):
+	"""Read and parse a list of filenames."""
+	if type(filenames) is type(''):
+	    filenames = [filenames]
+	for file in filenames:
+	    try:
+		fp = open(file, 'r')
+		self.__read(fp)
+	    except IOError:
+		pass
+
+    def get(self, section, option, raw=0):
+	"""Get an option value for a given section.
+
+	All % interpolations are expanded in the return values, based
+	on the defaults passed into the constructor.
+
+	The section DEFAULT is special.
+	"""
+	try:
+	    d = self.__sections[section].copy()
+	except KeyError:
+	    if section == DEFAULTSECT:
+		d = {}
+	    else:
+		raise NoSectionError(section)
+	d.update(self.__defaults)
+	option = string.lower(option)
+	try:
+	    rawval = d[option]
+	except KeyError:
+	    raise NoOptionError(option, section)
+	# do the string interpolation
+	if raw:
+	    return rawval
+	try:
+	    return rawval % d
+	except KeyError, key:
+	    raise InterpolationError(key, option, section)
+
+    def __get(self, section, conv, option):
+	return conv(self.get(section, option))
+
+    def getint(self, section, option):
+	return self.__get(section, string.atoi, option)
+
+    def getfloat(self, section, option):
+	return self.__get(section, string.atof, option)
+
+    def getboolean(self, section, option):
+	v = self.get(section, option)
+	val = string.atoi(v)
+	if val not in (0, 1):
+	    raise ValueError, 'Not a boolean: %s' % v
+	return val
+
+    def __read(self, fp):
+	"""Parse a sectioned setup file.
+
+	The sections in setup file contains a title line at the top,
+	indicated by a name in square brackets (`[]'), plus key/value
+	options lines, indicated by `name: value' format lines.
+	Continuation are represented by an embedded newline then
+	leading whitespace.  Blank lines, lines beginning with a '#',
+	and just about everything else is ignored.
+	"""
+	cursect = None			# None, or a dictionary
+	optname = None
+	lineno = 0
+	while 1:
+	    line = fp.readline()
+	    if not line:
+		break
+	    lineno = lineno + 1
+	    # comment or blank line?
+	    if string.strip(line) == '' or line[0] in '#;':
+		continue
+	    if string.lower(string.split(line)[0]) == 'rem' \
+	       and line[0] == "r":	# no leading whitespace
+		continue
+	    # continuation line?
+	    if line[0] in ' \t' and cursect <> None and optname:
+		value = string.strip(line)
+		if value:
+		    cursect = cursect[optname] + '\n ' + value
+	    # a section header?
+	    elif secthead_cre.match(line) >= 0:
+		sectname = secthead_cre.group(1)
+		if self.__sections.has_key(sectname):
+		    cursect = self.__sections[sectname]
+		elif sectname == DEFAULTSECT:
+		    cursect = self.__defaults
+		else:
+		    cursect = {'name': sectname}
+		    self.__sections[sectname] = cursect
+		# So sections can't start with a continuation line.
+		optname = None
+	    # an option line?
+	    elif option_cre.match(line) >= 0:
+		optname, optval = option_cre.group(1, 3)
+		optname = string.lower(optname)
+		optval = string.strip(optval)
+		# allow empty values
+		if optval == '""':
+		    optval = ''
+		cursect[optname] = optval
+	    # an error
+	    else:
+		print 'Error in %s at %d: %s', (fp.name, lineno, `line`)
diff --git a/Lib/dos-8x3/posixfil.py b/Lib/dos-8x3/posixfil.py
index fc5f53f..d66517f 100755
--- a/Lib/dos-8x3/posixfil.py
+++ b/Lib/dos-8x3/posixfil.py
@@ -177,7 +177,7 @@
 	# Hack by davem@magnet.com to get locking to go on freebsd;
 	# additions for AIX by Vladimir.Marangozov@imag.fr
         import sys, os
-        if sys.platform == 'freebsd2':
+        if sys.platform in ('netbsd1', 'freebsd2', 'freebsd3'):
 	    flock = struct.pack('lxxxxlxxxxlhh', \
 		  l_start, l_len, os.getpid(), l_type, l_whence) 
         elif sys.platform in ['aix3', 'aix4']:
@@ -190,7 +190,7 @@
 	flock = fcntl.fcntl(self._file_.fileno(), cmd, flock)
 
 	if '?' in how:
-	    if sys.platform == 'freebsd2':
+	    if sys.platform in ('netbsd1', 'freebsd2', 'freebsd3'):
 		l_start, l_len, l_pid, l_type, l_whence = \
 		    struct.unpack('lxxxxlxxxxlhh', flock)
             elif sys.platform in ['aix3', 'aix4']:
diff --git a/Lib/dos-8x3/posixpat.py b/Lib/dos-8x3/posixpat.py
index 9960801..1166881 100755
--- a/Lib/dos-8x3/posixpat.py
+++ b/Lib/dos-8x3/posixpat.py
@@ -5,6 +5,10 @@
 # on other systems (e.g. Mac, Windows), os.path provides the same
 # operations in a manner specific to that platform, and is an alias
 # to another module (e.g. macpath, ntpath).
+"""Common pathname manipulations, Posix version. 
+Instead of importing this module
+directly, import os and refer to this module as os.path.
+"""
 
 import os
 import stat
@@ -16,14 +20,16 @@
 # (another function should be defined to do that).
 
 def normcase(s):
-	return s
+    """Normalize case of pathname.  Has no effect under Posix"""
+    return s
 
 
 # Return wheter a path is absolute.
 # Trivial in Posix, harder on the Mac or MS-DOS.
 
 def isabs(s):
-	return s[:1] == '/'
+    """Test whether a path is absolute"""
+    return s[:1] == '/'
 
 
 # Join pathnames.
@@ -31,15 +37,16 @@
 # Insert a '/' unless the first part is empty or already ends in '/'.
 
 def join(a, *p):
-	path = a
-	for b in p:
-		if b[:1] == '/':
-			path = b
-		elif path == '' or path[-1:] == '/':
-			path = path + b
-		else:
-			path = path + '/' + b
-	return path
+    """Join two or more pathname components, inserting '/' as needed"""
+    path = a
+    for b in p:
+        if b[:1] == '/':
+            path = b
+        elif path == '' or path[-1:] == '/':
+            path = path + b
+        else:
+            path = path + '/' + b
+    return path
 
 
 # Split a path in head (everything up to the last '/') and tail (the
@@ -48,13 +55,15 @@
 # Trailing '/'es are stripped from head unless it is the root.
 
 def split(p):
-	import string
-	i = string.rfind(p, '/') + 1
-	head, tail = p[:i], p[i:]
-	if head and head <> '/'*len(head):
-		while head[-1] == '/':
-			head = head[:-1]
-	return head, tail
+    """Split a pathname.  Returns tuple "(head, tail)" where "tail" is 
+everything after the final slash.  Either part may be empty"""
+    import string
+    i = string.rfind(p, '/') + 1
+    head, tail = p[:i], p[i:]
+    if head and head <> '/'*len(head):
+        while head[-1] == '/':
+            head = head[:-1]
+    return head, tail
 
 
 # Split a path in root and extension.
@@ -63,75 +72,84 @@
 # It is always true that root + ext == p.
 
 def splitext(p):
-	root, ext = '', ''
-	for c in p:
-		if c == '/':
-			root, ext = root + ext + c, ''
-		elif c == '.':
-			if ext:
-				root, ext = root + ext, c
-			else:
-				ext = c
-		elif ext:
-			ext = ext + c
-		else:
-			root = root + c
-	return root, ext
+    """Split the extension from a pathname.  Extension is everything from the
+last dot to the end.  Returns "(root, ext)", either part may be empty"""
+    root, ext = '', ''
+    for c in p:
+        if c == '/':
+            root, ext = root + ext + c, ''
+        elif c == '.':
+            if ext:
+                root, ext = root + ext, c
+            else:
+                ext = c
+        elif ext:
+            ext = ext + c
+        else:
+            root = root + c
+    return root, ext
 
 
 # Split a pathname into a drive specification and the rest of the
 # path.  Useful on DOS/Windows/NT; on Unix, the drive is always empty.
 
 def splitdrive(p):
-	return '', p
+    """Split a pathname into drive and path. On Posix, drive is always 
+empty"""
+    return '', p
 
 
 # Return the tail (basename) part of a path.
 
 def basename(p):
-	return split(p)[1]
+    """Returns the final component of a pathname"""
+    return split(p)[1]
 
 
 # Return the head (dirname) part of a path.
 
 def dirname(p):
-	return split(p)[0]
+    """Returns the directory component of a pathname"""
+    return split(p)[0]
 
 
 # Return the longest prefix of all list elements.
 
 def commonprefix(m):
-	if not m: return ''
-	prefix = m[0]
-	for item in m:
-		for i in range(len(prefix)):
-			if prefix[:i+1] <> item[:i+1]:
-				prefix = prefix[:i]
-				if i == 0: return ''
-				break
-	return prefix
+    "Given a list of pathnames, returns the longest common leading component"
+    if not m: return ''
+    prefix = m[0]
+    for item in m:
+        for i in range(len(prefix)):
+            if prefix[:i+1] <> item[:i+1]:
+                prefix = prefix[:i]
+                if i == 0: return ''
+                break
+    return prefix
 
 
 # Is a path a symbolic link?
 # This will always return false on systems where os.lstat doesn't exist.
 
 def islink(path):
-	try:
-		st = os.lstat(path)
-	except (os.error, AttributeError):
-		return 0
-	return stat.S_ISLNK(st[stat.ST_MODE])
+    """Test whether a path is a symbolic link"""
+    try:
+        st = os.lstat(path)
+    except (os.error, AttributeError):
+        return 0
+    return stat.S_ISLNK(st[stat.ST_MODE])
 
 
 # Does a path exist?
 # This is false for dangling symbolic links.
 
 def exists(path):
-	try:
-		st = os.stat(path)
-	except os.error:
-		return 0
-	return 1
+    """Test whether a path exists.  Returns false for broken symbolic links"""
+    try:
+        st = os.stat(path)
+    except os.error:
+        return 0
+    return 1
 
 
 # Is a path a directory?
@@ -139,11 +157,12 @@
 # for the same path.
 
 def isdir(path):
-	try:
-		st = os.stat(path)
-	except os.error:
-		return 0
-	return stat.S_ISDIR(st[stat.ST_MODE])
+    """Test whether a path is a directory"""
+    try:
+        st = os.stat(path)
+    except os.error:
+        return 0
+    return stat.S_ISDIR(st[stat.ST_MODE])
 
 
 # Is a path a regular file?
@@ -151,78 +170,87 @@
 # for the same path.
 
 def isfile(path):
-	try:
-		st = os.stat(path)
-	except os.error:
-		return 0
-	return stat.S_ISREG(st[stat.ST_MODE])
+    """Test whether a path is a regular file"""
+    try:
+        st = os.stat(path)
+    except os.error:
+        return 0
+    return stat.S_ISREG(st[stat.ST_MODE])
 
 
 # Are two filenames really pointing to the same file?
 
 def samefile(f1, f2):
-	s1 = os.stat(f1)
-	s2 = os.stat(f2)
-	return samestat(s1, s2)
+    """Test whether two pathnames reference the same actual file"""
+    s1 = os.stat(f1)
+    s2 = os.stat(f2)
+    return samestat(s1, s2)
 
 
 # Are two open files really referencing the same file?
 # (Not necessarily the same file descriptor!)
 
 def sameopenfile(fp1, fp2):
-	s1 = os.fstat(fp1)
-	s2 = os.fstat(fp2)
-	return samestat(s1, s2)
+    """Test whether two open file objects reference the same file"""
+    s1 = os.fstat(fp1)
+    s2 = os.fstat(fp2)
+    return samestat(s1, s2)
 
 
 # Are two stat buffers (obtained from stat, fstat or lstat)
 # describing the same file?
 
 def samestat(s1, s2):
-	return s1[stat.ST_INO] == s2[stat.ST_INO] and \
-		s1[stat.ST_DEV] == s2[stat.ST_DEV]
+    """Test whether two stat buffers reference the same file"""
+    return s1[stat.ST_INO] == s2[stat.ST_INO] and \
+	   s1[stat.ST_DEV] == s2[stat.ST_DEV]
 
 
 # Is a path a mount point?
 # (Does this work for all UNIXes?  Is it even guaranteed to work by Posix?)
 
 def ismount(path):
-	try:
-		s1 = os.stat(path)
-		s2 = os.stat(join(path, '..'))
-	except os.error:
-		return 0 # It doesn't exist -- so not a mount point :-)
-	dev1 = s1[stat.ST_DEV]
-	dev2 = s2[stat.ST_DEV]
-	if dev1 != dev2:
-		return 1		# path/.. on a different device as path
-	ino1 = s1[stat.ST_INO]
-	ino2 = s2[stat.ST_INO]
-	if ino1 == ino2:
-		return 1		# path/.. is the same i-node as path
-	return 0
+    """Test whether a path is a mount point"""
+    try:
+        s1 = os.stat(path)
+        s2 = os.stat(join(path, '..'))
+    except os.error:
+        return 0 # It doesn't exist -- so not a mount point :-)
+    dev1 = s1[stat.ST_DEV]
+    dev2 = s2[stat.ST_DEV]
+    if dev1 != dev2:
+        return 1        # path/.. on a different device as path
+    ino1 = s1[stat.ST_INO]
+    ino2 = s2[stat.ST_INO]
+    if ino1 == ino2:
+        return 1        # path/.. is the same i-node as path
+    return 0
 
 
 # Directory tree walk.
 # For each directory under top (including top itself, but excluding
 # '.' and '..'), func(arg, dirname, filenames) is called, where
 # dirname is the name of the directory and filenames is the list
-# files files (and subdirectories etc.) in the directory.
+# of files (and subdirectories etc.) in the directory.
 # The func may modify the filenames list, to implement a filter,
 # or to impose a different order of visiting.
 
 def walk(top, func, arg):
-	try:
-		names = os.listdir(top)
-	except os.error:
-		return
-	func(arg, top, names)
-	exceptions = ('.', '..')
-	for name in names:
-		if name not in exceptions:
-			name = join(top, name)
-			if isdir(name) and not islink(name):
-				walk(name, func, arg)
+    """walk(top,func,args) calls func(arg, d, files) for each directory "d" 
+in the tree  rooted at "top" (including "top" itself).  "files" is a list
+of all the files and subdirs in directory "d".
+"""
+    try:
+        names = os.listdir(top)
+    except os.error:
+        return
+    func(arg, top, names)
+    exceptions = ('.', '..')
+    for name in names:
+        if name not in exceptions:
+            name = join(top, name)
+            if isdir(name) and not islink(name):
+                walk(name, func, arg)
 
 
 # Expand paths beginning with '~' or '~user'.
@@ -235,24 +263,26 @@
 # variable expansion.)
 
 def expanduser(path):
-	if path[:1] <> '~':
-		return path
-	i, n = 1, len(path)
-	while i < n and path[i] <> '/':
-		i = i+1
-	if i == 1:
-		if not os.environ.has_key('HOME'):
-			return path
-		userhome = os.environ['HOME']
-	else:
-		import pwd
-		try:
-			pwent = pwd.getpwnam(path[1:i])
-		except KeyError:
-			return path
-		userhome = pwent[5]
-	if userhome[-1:] == '/': i = i+1
-	return userhome + path[i:]
+    """Expand ~ and ~user constructions.  If user or $HOME is unknown, 
+do nothing"""
+    if path[:1] <> '~':
+        return path
+    i, n = 1, len(path)
+    while i < n and path[i] <> '/':
+        i = i+1
+    if i == 1:
+        if not os.environ.has_key('HOME'):
+            return path
+        userhome = os.environ['HOME']
+    else:
+        import pwd
+        try:
+            pwent = pwd.getpwnam(path[1:i])
+        except KeyError:
+            return path
+        userhome = pwent[5]
+    if userhome[-1:] == '/': i = i+1
+    return userhome + path[i:]
 
 
 # Expand paths containing shell variable substitutions.
@@ -262,29 +292,31 @@
 _varprog = None
 
 def expandvars(path):
-	global _varprog
-	if '$' not in path:
-		return path
-	if not _varprog:
-		import re
-		_varprog = re.compile(r'\$(\w+|\{[^}]*\})')
-	i = 0
-	while 1:
-		m = _varprog.search(path, i)
-		if not m:
-			break
-		i, j = m.span(0)
-		name = m.group(1)
-		if name[:1] == '{' and name[-1:] == '}':
-			name = name[1:-1]
-		if os.environ.has_key(name):
-			tail = path[j:]
-			path = path[:i] + os.environ[name]
-			i = len(path)
-			path = path + tail
-		else:
-			i = j
-	return path
+    """Expand shell variables of form $var and ${var}.  Unknown variables
+are left unchanged"""
+    global _varprog
+    if '$' not in path:
+        return path
+    if not _varprog:
+        import re
+        _varprog = re.compile(r'\$(\w+|\{[^}]*\})')
+    i = 0
+    while 1:
+        m = _varprog.search(path, i)
+        if not m:
+            break
+        i, j = m.span(0)
+        name = m.group(1)
+        if name[:1] == '{' and name[-1:] == '}':
+            name = name[1:-1]
+        if os.environ.has_key(name):
+            tail = path[j:]
+            path = path[:i] + os.environ[name]
+            i = len(path)
+            path = path + tail
+        else:
+            i = j
+    return path
 
 
 # Normalize a path, e.g. A//B, A/./B and A/foo/../B all become A/B.
@@ -292,26 +324,26 @@
 # if it contains symbolic links!
 
 def normpath(path):
-	import string
-	# Treat initial slashes specially
-	slashes = ''
-	while path[:1] == '/':
-		slashes = slashes + '/'
-		path = path[1:]
-	comps = string.splitfields(path, '/')
-	i = 0
-	while i < len(comps):
-		if comps[i] == '.':
-			del comps[i]
-		elif comps[i] == '..' and i > 0 and \
-					  comps[i-1] not in ('', '..'):
-			del comps[i-1:i+1]
-			i = i-1
-		elif comps[i] == '' and i > 0 and comps[i-1] <> '':
-			del comps[i]
-		else:
-			i = i+1
-	# If the path is now empty, substitute '.'
-	if not comps and not slashes:
-		comps.append('.')
-	return slashes + string.joinfields(comps, '/')
+    """Normalize path, eliminating double slashes, etc."""
+    import string
+    # Treat initial slashes specially
+    slashes = ''
+    while path[:1] == '/':
+        slashes = slashes + '/'
+        path = path[1:]
+    comps = string.splitfields(path, '/')
+    i = 0
+    while i < len(comps):
+        if comps[i] == '.':
+            del comps[i]
+        elif comps[i] == '..' and i > 0 and comps[i-1] not in ('', '..'):
+            del comps[i-1:i+1]
+            i = i-1
+        elif comps[i] == '' and i > 0 and comps[i-1] <> '':
+            del comps[i]
+        else:
+            i = i+1
+    # If the path is now empty, substitute '.'
+    if not comps and not slashes:
+        comps.append('.')
+    return slashes + string.joinfields(comps, '/')
diff --git a/Lib/dos-8x3/test_fcn.py b/Lib/dos-8x3/test_fcn.py
index a5ea1e6..2ae6b99 100644
--- a/Lib/dos-8x3/test_fcn.py
+++ b/Lib/dos-8x3/test_fcn.py
@@ -5,7 +5,7 @@
 import struct
 import fcntl
 import FCNTL
-import os
+import os, sys
 from test_support import verbose
 
 filename = '/tmp/delete-me'
@@ -16,7 +16,12 @@
 if verbose:
     print 'Status from fnctl with O_NONBLOCK: ', rv
     
-lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
+if sys.platform in ('netbsd1', 'freebsd2', 'freebsd3'):
+    lockdata = struct.pack('lxxxxlxxxxlhh', 0, 0, 0, FCNTL.F_WRLCK, 0)
+elif sys.platform in ['aix3', 'aix4']:
+    lockdata = struct.pack('hhlllii', FCNTL.F_WRLCK, 0, 0, 0, 0, 0, 0)
+else:
+    lockdata = struct.pack('hhllhh', FCNTL.F_WRLCK, 0, 0, 0, 0, 0)
 if verbose:
     print 'struct.pack: ', `lockdata`
     
diff --git a/Lib/dos-8x3/test_str.py b/Lib/dos-8x3/test_str.py
index efc98ff..a4f1882 100644
--- a/Lib/dos-8x3/test_str.py
+++ b/Lib/dos-8x3/test_str.py
@@ -45,6 +45,12 @@
      ['this', 'is', 'the', 'split', 'function'])
 test('split', 'a|b|c|d', ['a', 'b', 'c', 'd'], '|')
 test('split', 'a|b|c|d', ['a', 'b', 'c|d'], '|', 2)
+test('split', 'a b c d', ['a', 'b c d'], None, 1)
+test('split', 'a b c d', ['a', 'b', 'c d'], None, 2)
+test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 3)
+test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 4)
+test('split', 'a b c d', ['a', 'b', 'c', 'd'], None, 0)
+test('split', 'a  b  c  d', ['a', 'b', 'c  d'], None, 2)
 
 # join now works with any sequence type
 class Sequence:
@@ -67,6 +73,15 @@
 test('swapcase', 'HeLLo cOmpUteRs', 'hEllO CoMPuTErS')
 test('translate', 'xyzabcdef', 'xyzxyz', transtable, 'def')
 
+test('replace', 'one!two!three!', 'one@two!three!', '!', '@', 1)
+test('replace', 'one!two!three!', 'one@two@three!', '!', '@', 2)
+test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 3)
+test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 4)
+test('replace', 'one!two!three!', 'one@two@three@', '!', '@', 0)
+test('replace', 'one!two!three!', 'one@two@three@', '!', '@')
+test('replace', 'one!two!three!', 'one!two!three!', 'x', '@')
+test('replace', 'one!two!three!', 'one!two!three!', 'x', '@', 2)
+
 strop.whitespace
 strop.lowercase
 strop.uppercase
diff --git a/Lib/dos-8x3/test_tim.py b/Lib/dos-8x3/test_tim.py
index acc4d41..cfa18a3 100644
--- a/Lib/dos-8x3/test_tim.py
+++ b/Lib/dos-8x3/test_tim.py
@@ -8,7 +8,7 @@
     print 'time.ctime(t) <> time.asctime(time.localtime(t))'
 
 time.daylight
-if int(time.mktime(time.localtime(t))) <> int(t):
+if long(time.mktime(time.localtime(t))) <> long(t):
     print 'time.mktime(time.localtime(t)) <> t'
 
 time.sleep(1.2)
