diff --git a/Lib/ntpath.py b/Lib/ntpath.py
index 5782cbe..9597c63 100644
--- a/Lib/ntpath.py
+++ b/Lib/ntpath.py
@@ -1,7 +1,8 @@
 # Module 'ntpath' -- common operations on WinNT/Win95 pathnames
 """Common pathname manipulations, WindowsNT/95 version. 
-Instead of importing this module
-directly, import os and refer to this module as os.path.
+
+Instead of importing this module directly, import os and refer to this
+module as os.path.
 """
 
 import os
@@ -16,17 +17,15 @@
 def normcase(s):
     """Normalize case of pathname.
 
-    Makes all characters lowercase and all slashes into backslashes.
-
-    """
+    Makes all characters lowercase and all slashes into backslashes."""
     return string.lower(string.replace(s, "/", "\\"))
 
 
 # Return wheter a path is absolute.
 # Trivial in Posix, harder on the Mac or MS-DOS.
 # For DOS it is absolute if it starts with a slash or backslash (current
-# volume), or if a pathname after the volume letter and colon starts with
-# a slash or backslash.
+# volume), or if a pathname after the volume letter and colon / UNC resource
+# starts with a slash or backslash.
 
 def isabs(s):
     """Test whether a path is absolute"""
@@ -50,13 +49,30 @@
 
 
 # Split a path in a drive specification (a drive letter followed by a
-# colon) and the path specification.
+# colon, or a UNC resource) and the path specification.
 # It is always true that drivespec + pathspec == p
 def splitdrive(p):
-    """Split a pathname into drive and path specifiers. Returns a 2-tuple
-"(drive,path)";  either part may be empty"""
+    """Split a pathname into drive and path specifiers.
+
+    Return a 2-tuple (drive, path); either part may be empty.
+    This recognizes UNC paths (e.g. '\\\\host\\mountpoint\\dir\\file')"""
     if p[1:2] == ':':
         return p[0:2], p[2:]
+    firstTwo = p[0:2]
+    if firstTwo == '//' or firstTwo == '\\\\':
+        # is a UNC path:
+        # vvvvvvvvvvvvvvvvvvvv equivalent to drive letter
+        # \\machine\mountpoint\directories...
+        #           directory ^^^^^^^^^^^^^^^
+        normp = normcase(p)
+        index = string.find(normp, '\\', 2)
+        if index == -1:
+            ##raise RuntimeError, 'illegal UNC path: "' + p + '"'
+            return ("", p)
+        index = string.find(normp, '\\', index + 1)
+        if index == -1:
+            index = len(p)
+        return p[:index], p[index:]
     return '', p
 
 
@@ -67,8 +83,10 @@
 # The resulting head won't end in '/' unless it is the root.
 
 def split(p):
-    """Split a pathname.  Returns tuple "(head, tail)" where "tail" is 
-everything after the final slash.  Either part may be empty"""
+    """Split a pathname.
+
+    Return tuple (head, tail) where tail is everything after the final slash.
+    Either part may be empty."""
     d, p = splitdrive(p)
     slashes = ''
     while p and p[-1:] in '/\\':
@@ -96,8 +114,10 @@
 # It is always true that root + ext == p.
 
 def splitext(p):
-    """Split the extension from a pathname.  Extension is everything from the
-last dot to the end.  Returns "(root, ext)", either part may be empty"""
+    """Split the extension from a pathname.
+
+    Extension is everything from the last dot to the end.
+    Return (root, ext), either part may be empty."""
     root, ext = '', ''
     for c in p:
         if c in ['/','\\']:
@@ -146,17 +166,17 @@
 # Get size, mtime, atime of files.
 
 def getsize(filename):
-    """Return the size of a file, reported by os.stat()."""
+    """Return the size of a file, reported by os.stat()"""
     st = os.stat(filename)
     return st[stat.ST_SIZE]
 
 def getmtime(filename):
-    """Return the last modification time of a file, reported by os.stat()."""
+    """Return the last modification time of a file, reported by os.stat()"""
     st = os.stat(filename)
     return st[stat.ST_MTIME]
 
 def getatime(filename):
-    """Return the last access time of a file, reported by os.stat()."""
+    """Return the last access time of a file, reported by os.stat()"""
     st = os.stat(filename)
     return st[stat.ST_MTIME]
 
@@ -208,7 +228,7 @@
 
 
 # Is a path a mount point?
-# XXX This degenerates in: 'is this the root?' on DOS
+# XXX This degenerates in: 'is this the root?' on DOS/Windows
 
 def ismount(path):
     """Test whether a path is a mount point (defined as root of drive)"""
@@ -225,10 +245,11 @@
 # or to impose a different order of visiting.
 
 def walk(top, 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".
-"""
+    """Directory tree walk whth callback function.
+
+    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:
@@ -252,8 +273,9 @@
 # variable expansion.)
 
 def expanduser(path):
-    """Expand ~ and ~user constructions.  If user or $HOME is unknown, 
-do nothing"""
+    """Expand ~ and ~user constructs.
+
+    If user or $HOME is unknown, do nothing."""
     if path[:1] <> '~':
         return path
     i, n = 1, len(path)
@@ -287,8 +309,9 @@
 varchars = string.letters + string.digits + '_-'
 
 def expandvars(path):  
-    """Expand shell variables of form $var and ${var}.  Unknown variables
-are left unchanged"""
+    """Expand shell variables of form $var and ${var}.
+
+    Unknown variables are left unchanged."""
     if '$' not in path:
         return path
     res = ''
@@ -369,6 +392,7 @@
 
 # Return an absolute path.
 def abspath(path):
+    """Return the absolute version of a path"""
     try:
         import win32api
         return win32api.GetFullPathName(path)
