diff --git a/Lib/dos-8x3/configpa.py b/Lib/dos-8x3/configpa.py
index 89e2d85..bc646e4 100644
--- a/Lib/dos-8x3/configpa.py
+++ b/Lib/dos-8x3/configpa.py
@@ -24,34 +24,37 @@
 
     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.
+    __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
+    sections()
+        return all the configuration section names, sans DEFAULT
 
-    options(section) -- return list of configuration options for the named
-                        section
+    options(section)
+        return list of configuration options for the named section
 
-    read(*filenames) -- read and parse the list of named configuration files
+    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.
+    get(section, option, raw=0, vars=None)
+        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.  Additional substitutions may be
+        provided using the `vars' argument, which must be a dictionary whose
+        contents override any pre-existing defaults.
 
-    getint(section, options) -- like get(), but convert value to an integer
+    getint(section, options)
+        like get(), but convert value to an integer
 
-    getfloat(section, options) -- like get(), but convert value to a float
+    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)
+    getboolean(section, options)
+        like get(), but convert value to a boolean (currently defined as 0 or
+        1, only)
 """
 
 import sys
@@ -173,12 +176,14 @@
             except IOError:
                 pass
 
-    def get(self, section, option, raw=0):
+    def get(self, section, option, raw=0, vars=None):
         """Get an option value for a given section.
 
-        All % interpolations are expanded in the return values, based
-        on the defaults passed into the constructor, unless the optional
-        argument `raw' is true.
+        All % interpolations are expanded in the return values, based on the
+        defaults passed into the constructor, unless the optional argument
+        `raw' is true.  Additional substitutions may be provided using the
+        `vars' argument, which must be a dictionary whose contents overrides
+        any pre-existing defaults.
 
         The section DEFAULT is special.
         """
@@ -191,6 +196,9 @@
                 raise NoSectionError(section)
         d = self.__defaults.copy()
         d.update(sectdict)
+        # Update with the entry specific variables
+        if vars:
+            d.update(vars)
         option = string.lower(option)
         try:
             rawval = d[option]
@@ -199,11 +207,17 @@
         # do the string interpolation
         if raw:
             return rawval
-        try:
-            return rawval % d
-        except KeyError, key:
-            raise InterpolationError(key, option, section, rawval)
 
+        value = rawval                  # Make it a pretty variable name
+        while 1:                        # Loop through this until it's done
+            if not string.find(value, "%("):
+                try:
+                    value = value % d
+                except KeyError, key:
+                    raise InterpolationError(key, option, section, rawval)
+            else:
+                return value
+    
     def __get(self, section, conv, option):
         return conv(self.get(section, option))
 
diff --git a/Lib/dos-8x3/posixpat.py b/Lib/dos-8x3/posixpat.py
index fb3b6a6..36edc80 100755
--- a/Lib/dos-8x3/posixpat.py
+++ b/Lib/dos-8x3/posixpat.py
@@ -367,3 +367,10 @@
     if not comps and not slashes:
         comps.append('.')
     return slashes + string.joinfields(comps, '/')
+
+
+# Return an absolute path.
+def abspath(path):
+    if not isabs(path):
+        path = join(os.getcwd(), path)
+    return normpath(path)
diff --git a/Lib/dos-8x3/queue.py b/Lib/dos-8x3/queue.py
index 5e698ea..79c4880 100755
--- a/Lib/dos-8x3/queue.py
+++ b/Lib/dos-8x3/queue.py
@@ -5,9 +5,14 @@
 try:
     class Empty(Exception):
         pass
+    class Full(Exception):
+        pass
 except TypeError:
     # string based exceptions
-    Empty = 'Queue.Empty'               # Exception raised by get_nowait()
+    # exception raised by get(block=0)/get_nowait()
+    Empty = 'Queue.Empty'
+    # exception raised by put(block=0)/put_nowait()
+    Full = 'Queue.Full'
 
 class Queue:
     def __init__(self, maxsize):
@@ -23,32 +28,38 @@
         self.fsema = thread.allocate_lock()
 
     def qsize(self):
-        """Returns the approximate size of the queue (not reliable!)."""
+        """Return the approximate size of the queue (not reliable!)."""
         self.mutex.acquire()
         n = self._qsize()
         self.mutex.release()
         return n
 
     def empty(self):
-        """Returns 1 if the queue is empty, 0 otherwise (not reliable!)."""
+        """Return 1 if the queue is empty, 0 otherwise (not reliable!)."""
         self.mutex.acquire()
         n = self._empty()
         self.mutex.release()
         return n
 
     def full(self):
-        """Returns 1 if the queue is full, 0 otherwise (not reliable!)."""
+        """Return 1 if the queue is full, 0 otherwise (not reliable!)."""
         self.mutex.acquire()
         n = self._full()
         self.mutex.release()
         return n
 
-    def put(self, item):
+    def put(self, item, block=1):
         """Put an item into the queue.
 
-	If the queue is full, block until a free slot is avaiable.
-	"""
-        self.fsema.acquire()
+        If optional arg 'block' is 1 (the default), block if
+        necessary until a free slot is available.  Otherwise (block
+        is 0), put an item on the queue if a free slot is immediately
+        available, else raise the Full exception.
+        """
+        if block:
+            self.fsema.acquire()
+        elif not self.fsema.acquire(0):
+            raise Full
         self.mutex.acquire()
         was_empty = self._empty()
         self._put(item)
@@ -58,45 +69,27 @@
             self.fsema.release()
         self.mutex.release()
 
-    def get(self):
-        """Gets and returns an item from the queue.
+    def put_nowait(self, item):
+        """Put an item into the queue without blocking.
 
-        This method blocks if necessary until an item is available.
+        Only enqueue the item if a free slot is immediately available.
+        Otherwise raise the Full exception.
         """
-        self.esema.acquire()
-        self.mutex.acquire()
-        was_full = self._full()
-        item = self._get()
-        if was_full:
-            self.fsema.release()
-        if not self._empty():
-            self.esema.release()
-        self.mutex.release()
-        return item
+        return self.put(item, 0)
 
-    # Get an item from the queue if one is immediately available,
-    # raise Empty if the queue is empty or temporarily unavailable
-    def get_nowait(self):
-        """Gets and returns an item from the queue.
+    def get(self, block=1):
+        """Remove and return an item from the queue.
 
-        Only gets an item if one is immediately available, Otherwise
-        this raises the Empty exception if the queue is empty or
-        temporarily unavailable.
+        If optional arg 'block' is 1 (the default), block if
+        necessary until an item is available.  Otherwise (block is 0),
+        return an item if one is immediately available, else raise the
+        Empty exception.
         """
-        locked = self.esema.acquire(0)
-        self.mutex.acquire()
-        if self._empty():
-            # The queue is empty -- we can't have esema
-            self.mutex.release()
+        if block:
+            self.esema.acquire()
+        elif not self.esema.acquire(0):
             raise Empty
-        if not locked:
-            locked = self.esema.acquire(0)
-            if not locked:
-                # Somebody else has esema
-                # but we have mutex --
-                # go out of their way
-                self.mutex.release()
-                raise Empty
+        self.mutex.acquire()
         was_full = self._full()
         item = self._get()
         if was_full:
@@ -106,8 +99,13 @@
         self.mutex.release()
         return item
 
-    # XXX Need to define put_nowait() as well.
+    def get_nowait(self):
+        """Remove and return an item from the queue without blocking.
 
+        Only get an item if one is immediately available.  Otherwise
+        raise the Empty exception.
+        """
+        return self.get(0)
 
     # Override these methods to implement other queue organizations
     # (e.g. stack or priority queue).
diff --git a/Lib/dos-8x3/test_ntp.py b/Lib/dos-8x3/test_ntp.py
new file mode 100644
index 0000000..9c79865
--- /dev/null
+++ b/Lib/dos-8x3/test_ntp.py
@@ -0,0 +1,41 @@
+import ntpath
+import string
+
+errors = 0
+
+def tester(fn, wantResult):
+	fn = string.replace(fn, "\\", "\\\\")
+	gotResult = eval(fn)
+	if wantResult != gotResult:
+		print "error!"
+		print "evaluated: " + str(fn)
+		print "should be: " + str(wantResult)
+		print " returned: " + str(gotResult)
+		print ""
+		global errors
+		errors = errors + 1
+
+tester('ntpath.splitdrive("c:\\foo\\bar")', ('c:', '\\foo\\bar'))
+tester('ntpath.splitdrive("\\\\conky\\mountpoint\\foo\\bar")', ('\\\\conky\\mountpoint', '\\foo\\bar'))
+tester('ntpath.splitdrive("c:/foo/bar")', ('c:', '/foo/bar'))
+tester('ntpath.splitdrive("//conky/mountpoint/foo/bar")', ('//conky/mountpoint', '/foo/bar'))
+
+tester('ntpath.split("c:\\foo\\bar")', ('c:\\foo', 'bar'))
+tester('ntpath.split("\\\\conky\\mountpoint\\foo\\bar")', ('\\\\conky\\mountpoint\\foo', 'bar'))
+
+tester('ntpath.split("c:\\")', ('c:\\', ''))
+tester('ntpath.split("\\\\conky\\mountpoint\\")', ('\\\\conky\\mountpoint\\', ''))
+
+tester('ntpath.split("c:/")', ('c:/', ''))
+tester('ntpath.split("//conky/mountpoint/")', ('//conky/mountpoint/', ''))
+
+tester('ntpath.isabs("c:\\")', 1)
+tester('ntpath.isabs("\\\\conky\\mountpoint\\")', 1)
+tester('ntpath.isabs("\\foo")', 1)
+tester('ntpath.isabs("\\foo\\bar")', 1)
+
+if errors:
+	print str(errors) + " errors."
+else:
+	print "No errors.  Thank your lucky stars."
+
