diff --git a/Lib/dircache.py b/Lib/dircache.py
index 9cdbc70..ef68b42 100644
--- a/Lib/dircache.py
+++ b/Lib/dircache.py
@@ -1,11 +1,10 @@
 # Module 'dircache'
 #
-# Return a sorted list of the files in a POSIX directory, using a cache
+# Return a sorted list of the files in a directory, using a cache
 # to avoid reading the directory more often than necessary.
 # Also contains a subroutine to append slashes to directories.
 
-import posix
-import path
+import os
 
 cache = {}
 
@@ -16,13 +15,13 @@
 	except KeyError:
 		cached_mtime, list = -1, []
 	try:
-		mtime = posix.stat(path)[8]
-	except posix.error:
+		mtime = os.stat(path)[8]
+	except os.error:
 		return []
 	if mtime <> cached_mtime:
 		try:
-			list = posix.listdir(path)
-		except posix.error:
+			list = os.listdir(path)
+		except os.error:
 			return []
 		list.sort()
 	cache[path] = mtime, list
@@ -32,5 +31,5 @@
 
 def annotate(head, list): # Add '/' suffixes to directories
 	for i in range(len(list)):
-		if path.isdir(path.join(head, list[i])):
+		if os.path.isdir(os.path.join(head, list[i])):
 			list[i] = list[i] + '/'
diff --git a/Lib/dircmp.py b/Lib/dircmp.py
index f4eea1f..cbbce1b 100644
--- a/Lib/dircmp.py
+++ b/Lib/dircmp.py
@@ -2,9 +2,7 @@
 #
 # Defines a class to build directory diff tools on.
 
-import posix
-
-import path
+import os
 
 import dircache
 import cmpcache
@@ -18,8 +16,8 @@
 	def new(dd, (a, b)): # Initialize
 		dd.a = a
 		dd.b = b
-		# Properties that caller may change before callingdd. run():
-		dd.hide = ['.', '..'] # Names never to be shown
+		# Properties that caller may change before calling dd.run():
+		dd.hide = [os.curdir, os.pardir] # Names never to be shown
 		dd.ignore = ['RCS', 'tags'] # Names ignored in comparison
 		#
 		return dd
@@ -53,18 +51,18 @@
 		dd.common_funny = []
 		#
 		for x in dd.common:
-			a_path = path.join(dd.a, x)
-			b_path = path.join(dd.b, x)
+			a_path = os.path.join(dd.a, x)
+			b_path = os.path.join(dd.b, x)
 			#
 			ok = 1
 			try:
 				a_stat = statcache.stat(a_path)
-			except posix.error, why:
+			except os.error, why:
 				# print 'Can\'t stat', a_path, ':', why[1]
 				ok = 0
 			try:
 				b_stat = statcache.stat(b_path)
-			except posix.error, why:
+			except os.error, why:
 				# print 'Can\'t stat', b_path, ':', why[1]
 				ok = 0
 			#
@@ -92,8 +90,8 @@
 		# The hide and ignore properties are inherited from the parent
 		dd.subdirs = {}
 		for x in dd.common_dirs:
-			a_x = path.join(dd.a, x)
-			b_x = path.join(dd.b, x)
+			a_x = os.path.join(dd.a, x)
+			b_x = os.path.join(dd.b, x)
 			dd.subdirs[x] = newdd = dircmp().new(a_x, b_x)
 			newdd.hide = dd.hide
 			newdd.ignore = dd.ignore
@@ -151,7 +149,7 @@
 def cmpfiles(a, b, common):
 	res = ([], [], [])
 	for x in common:
-		res[cmp(path.join(a, x), path.join(b, x))].append(x)
+		res[cmp(os.path.join(a, x), os.path.join(b, x))].append(x)
 	return res
 
 
@@ -165,7 +163,7 @@
 	try:
 		if cmpcache.cmp(a, b): return 0
 		return 1
-	except posix.error:
+	except os.error:
 		return 2
 
 
diff --git a/Lib/shutil.py b/Lib/shutil.py
index d3521ec..dba4ee1 100644
--- a/Lib/shutil.py
+++ b/Lib/shutil.py
@@ -1,7 +1,6 @@
 # Module 'shutil' -- utility functions usable in a shell-like program
 
-import posix
-import path
+import os
 
 MODEBITS = 010000	# Lower 12 mode bits
 # Change this to 01000 (9 mode bits) to avoid copying setuid etc.
@@ -19,17 +18,17 @@
 # Copy mode bits from src to dst
 #
 def copymode(src, dst):
-	st = posix.stat(src)
+	st = os.stat(src)
 	mode = divmod(st[0], MODEBITS)[1]
-	posix.chmod(dst, mode)
+	os.chmod(dst, mode)
 
 # Copy all stat info (mode bits, atime and mtime) from src to dst
 #
 def copystat(src, dst):
-	st = posix.stat(src)
+	st = os.stat(src)
 	mode = divmod(st[0], MODEBITS)[1]
-	posix.chmod(dst, mode)
-	posix.utimes(dst, st[7:9])
+	os.chmod(dst, mode)
+	os.utime(dst, st[7:9])
 
 # Copy data and mode bits ("cp src dst")
 #
@@ -47,24 +46,24 @@
 # The destination must not already exist.
 #
 def copytree(src, dst):
-	names = posix.listdir(src)
-	posix.mkdir(dst, 0777)
-	dot_dotdot = '.', '..'
+	names = os.listdir(src)
+	os.mkdir(dst, 0777)
+	dot_dotdot = (os.curdir, os.pardir)
 	for name in names:
 		if name not in dot_dotdot:
-			srcname = path.join(src, name)
-			dstname = path.join(dst, name)
+			srcname = os.path.join(src, name)
+			dstname = os.path.join(dst, name)
 			#print 'Copying', srcname, 'to', dstname
 			try:
-				#if path.islink(srcname):
-				#	linkto = posix.readlink(srcname)
-				#	posix.symlink(linkto, dstname)
-				#elif path.isdir(srcname):
-				if path.isdir(srcname):
+				#if os.path.islink(srcname):
+				#	linkto = os.readlink(srcname)
+				#	os.symlink(linkto, dstname)
+				#elif os.path.isdir(srcname):
+				if os.path.isdir(srcname):
 					copytree(srcname, dstname)
 				else:
 					copy2(srcname, dstname)
 				# XXX What about devices, sockets etc.?
-			except posix.error, why:
+			except os.error, why:
 				print 'Could not copy', srcname, 'to', dstname,
 				print '(', why[1], ')'
