diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index d284834..4590f8d 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -1,6 +1,12 @@
-# Module 'posixpath' -- common operations on POSIX pathnames
+# Module 'posixpath' -- common operations on Posix pathnames.
+# Some of this can actually be useful on non-Posix systems too, e.g.
+# for manipulation of the pathname component of URLs.
+# The "os.path" name is an alias for this module on Posix systems;
+# 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).
 
-import posix
+import os
 import stat
 
 
@@ -102,12 +108,12 @@
 
 
 # Is a path a symbolic link?
-# This will always return false on systems where posix.lstat doesn't exist.
+# This will always return false on systems where os.lstat doesn't exist.
 
 def islink(path):
 	try:
-		st = posix.lstat(path)
-	except (posix.error, AttributeError):
+		st = os.lstat(path)
+	except (os.error, AttributeError):
 		return 0
 	return stat.S_ISLNK(st[stat.ST_MODE])
 
@@ -117,20 +123,20 @@
 
 def exists(path):
 	try:
-		st = posix.stat(path)
-	except posix.error:
+		st = os.stat(path)
+	except os.error:
 		return 0
 	return 1
 
 
-# Is a path a posix directory?
+# Is a path a directory?
 # This follows symbolic links, so both islink() and isdir() can be true
 # for the same path.
 
 def isdir(path):
 	try:
-		st = posix.stat(path)
-	except posix.error:
+		st = os.stat(path)
+	except os.error:
 		return 0
 	return stat.S_ISDIR(st[stat.ST_MODE])
 
@@ -141,8 +147,8 @@
 
 def isfile(path):
 	try:
-		st = posix.stat(path)
-	except posix.error:
+		st = os.stat(path)
+	except os.error:
 		return 0
 	return stat.S_ISREG(st[stat.ST_MODE])
 
@@ -150,18 +156,17 @@
 # Are two filenames really pointing to the same file?
 
 def samefile(f1, f2):
-	s1 = posix.stat(f1)
-	s2 = posix.stat(f2)
+	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!)
-# XXX Oops, posix.fstat() doesn't exist yet!
 
 def sameopenfile(fp1, fp2):
-	s1 = posix.fstat(fp1)
-	s2 = posix.fstat(fp2)
+	s1 = os.fstat(fp1)
+	s2 = os.fstat(fp2)
 	return samestat(s1, s2)
 
 
@@ -174,13 +179,13 @@
 
 
 # Is a path a mount point?
-# (Does this work for all UNIXes?  Is it even guaranteed to work by POSIX?)
+# (Does this work for all UNIXes?  Is it even guaranteed to work by Posix?)
 
 def ismount(path):
 	try:
-		s1 = posix.stat(path)
-		s2 = posix.stat(join(path, '..'))
-	except posix.error:
+		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]
@@ -203,8 +208,8 @@
 
 def walk(top, func, arg):
 	try:
-		names = posix.listdir(top)
-	except posix.error:
+		names = os.listdir(top)
+	except os.error:
 		return
 	func(arg, top, names)
 	exceptions = ('.', '..')
@@ -231,9 +236,9 @@
 	while i < n and path[i] <> '/':
 		i = i+1
 	if i == 1:
-		if not posix.environ.has_key('HOME'):
+		if not os.environ.has_key('HOME'):
 			return path
-		userhome = posix.environ['HOME']
+		userhome = os.environ['HOME']
 	else:
 		import pwd
 		try:
@@ -267,9 +272,9 @@
 		j = i + len(_varprog.group(0))
 		if name[:1] == '{' and name[-1:] == '}':
 			name = name[1:-1]
-		if posix.environ.has_key(name):
+		if os.environ.has_key(name):
 			tail = path[j:]
-			path = path[:i] + posix.environ[name]
+			path = path[:i] + os.environ[name]
 			i = len(path)
 			path = path + tail
 		else:
