diff --git a/Lib/plat-mac/aepack.py b/Lib/plat-mac/aepack.py
index dfb2953..6797473 100644
--- a/Lib/plat-mac/aepack.py
+++ b/Lib/plat-mac/aepack.py
@@ -20,7 +20,7 @@
 from Carbon import AE
 from Carbon.AppleEvents import *
 import MacOS
-import macfs
+import Carbon.File
 import StringIO
 import aetypes
 from aetypes import mkenum, mktype
@@ -59,8 +59,9 @@
 # Some python types we need in the packer:
 #
 AEDescType = AE.AEDescType
-FSSType = macfs.FSSpecType
-AliasType = macfs.AliasType
+FSSType = Carbon.File.FSSpecType
+FSRefType = Carbon.File.FSRefType
+AliasType = Carbon.File.AliasType
 
 def packkey(ae, key, value):
 	if hasattr(key, 'which'):
@@ -83,36 +84,35 @@
 	if x == None:
 		return AE.AECreateDesc('null', '')
 		
-	t = type(x)
-	if t == AEDescType:
+	if isinstance(x, AEDescType):
 		return x
-	if t == FSSType:
+	if isinstance(x, FSSType):
 		return AE.AECreateDesc('fss ', x.data)
-	if t == AliasType:
+	if isinstance(x, AliasType):
 		return AE.AECreateDesc('alis', x.data)
-	if t == IntType:
+	if isinstance(x, IntType):
 		return AE.AECreateDesc('long', struct.pack('l', x))
-	if t == FloatType:
+	if isinstance(x, FloatType):
 		return AE.AECreateDesc('doub', struct.pack('d', x))
-	if t == StringType:
+	if isinstance(x, StringType):
 		return AE.AECreateDesc('TEXT', x)
-	if t == UnicodeType:
+	if isinstance(x, UnicodeType):
 		data = t.encode('utf16')
 		if data[:2] == '\xfe\xff':
 			data = data[2:]
 		return AE.AECreateDesc('utxt', data)
-	if t == ListType:
+	if isinstance(x, ListType):
 		list = AE.AECreateList('', 0)
 		for item in x:
 			list.AEPutDesc(0, pack(item))
 		return list
-	if t == DictionaryType:
+	if isinstance(x, DictionaryType):
 		record = AE.AECreateList('', 1)
 		for key, value in x.items():
 			packkey(record, key, value)
 			#record.AEPutParamDesc(key, pack(value))
 		return record
-	if t == InstanceType and hasattr(x, '__aepack__'):
+	if hasattr(x, '__aepack__'):
 		return x.__aepack__()
 	if hasattr(x, 'which'):
 		return AE.AECreateDesc('TEXT', x.which)
@@ -144,7 +144,7 @@
 		record = desc.AECoerceDesc('reco')
 		return mkaetext(unpack(record, formodulename))
 	if t == typeAlias:
-		return macfs.RawAlias(desc.data)
+		return Carbon.File.Alias(rawdata=desc.data)
 	# typeAppleEvent returned as unknown
 	if t == typeBoolean:
 		return struct.unpack('b', desc.data)[0]
@@ -165,7 +165,7 @@
 		data = desc.data
 		return struct.unpack('d', data)[0]
 	if t == typeFSS:
-		return macfs.RawFSSpec(desc.data)
+		return Carbon.File.FSSpec(rawdata=desc.data)
 	if t == typeInsertionLoc:
 		record = desc.AECoerceDesc('reco')
 		return mkinsertionloc(unpack(record, formodulename))
@@ -353,8 +353,8 @@
 		None,
 		['a', 'list', 'of', 'strings'],
 		{'key1': 'value1', 'key2':'value2'},
-		macfs.FSSpec(':'),
-		macfs.FSSpec(':').NewAliasMinimal(),
+		Carbon.File.FSSpec(os.curdir),
+		Carbon.File.FSSpec(os.curdir).NewAliasMinimal(),
 		aetypes.Enum('enum'),
 		aetypes.Type('type'),
 		aetypes.Keyword('kwrd'),
diff --git a/Lib/plat-mac/macostools.py b/Lib/plat-mac/macostools.py
index 8822ab8..1a59354 100644
--- a/Lib/plat-mac/macostools.py
+++ b/Lib/plat-mac/macostools.py
@@ -4,134 +4,137 @@
 copy(src, dst) - Full copy of 'src' to 'dst'
 """
 
-import macfs
 from Carbon import Res
+from Carbon import File, Files
 import os
-from MACFS import *
+import sys
 import MacOS
 import time
 try:
-	openrf = MacOS.openrf
+    openrf = MacOS.openrf
 except AttributeError:
-	# Backward compatability
-	openrf = open
+    # Backward compatability
+    openrf = open
 
 Error = 'macostools.Error'
 
-BUFSIZ=0x80000		# Copy in 0.5Mb chunks
+BUFSIZ=0x80000      # Copy in 0.5Mb chunks
+
+COPY_FLAGS = (Files.kIsStationary|Files.kNameLocked|Files.kHasBundle|
+              Files.kIsInvisible|Files.kIsAlias)
 
 #
 # Not guaranteed to be correct or stay correct (Apple doesn't tell you
 # how to do this), but it seems to work.
 #
 def mkalias(src, dst, relative=None):
-	"""Create a finder alias"""
-	srcfss = macfs.FSSpec(src)
-	# The next line will fail under unix-Python if the destination
-	# doesn't exist yet. We should change this code to be fsref-based.
-	dstfss = macfs.FSSpec(dst)
-	if relative:
-		relativefss = macfs.FSSpec(relative)
-		# ik mag er geen None in stoppen :-(
-		alias = srcfss.NewAlias(relativefss)
-	else:
-		alias = srcfss.NewAlias()
-	
-	if os.path.isdir(src):
-		cr, tp = 'MACS', 'fdrp'
-	else:
-		cr, tp = srcfss.GetCreatorType()
-	
-	Res.FSpCreateResFile(dstfss, cr, tp, -1)
-	h = Res.FSpOpenResFile(dstfss, 3)
-	resource = Res.Resource(alias.data)
-	resource.AddResource('alis', 0, '')
-	Res.CloseResFile(h)
-	
-	dstfinfo = dstfss.GetFInfo()
-	dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
-	dstfss.SetFInfo(dstfinfo)
-	
+    """Create a finder alias"""
+    srcfsr = File.FSRef(src)
+    # The next line will fail under unix-Python if the destination
+    # doesn't exist yet. We should change this code to be fsref-based.
+    dstdir, dstname = os.path.split(dst)
+    if not dstdir: dstdir = os.curdir
+    dstdirfsr = File.FSRef(dstdir)
+    if relative:
+        relativefsr = File.FSRef(relative)
+        # ik mag er geen None in stoppen :-(
+        alias = File.FSNewAlias(relativefsr, srcfsr)
+    else:
+        alias = srcfsr.FSNewAliasMinimal()
+    
+    dstfsr, dstfss = Res.FSCreateResourceFile(dstdirfsr, unicode(dstname), 
+        File.FSGetResourceForkName())
+    h = Res.FSOpenResourceFile(dstfsr, File.FSGetResourceForkName(), 3)
+    resource = Res.Resource(alias.data)
+    resource.AddResource('alis', 0, '')
+    Res.CloseResFile(h)
+    
+    dstfinfo = dstfss.FSpGetFInfo()
+    dstfinfo.Flags = dstfinfo.Flags|0x8000    # Alias flag
+    dstfss.FSpSetFInfo(dstfinfo)
+    
 def mkdirs(dst):
-	"""Make directories leading to 'dst' if they don't exist yet"""
-	if dst == '' or os.path.exists(dst):
-		return
-	head, tail = os.path.split(dst)
-	if os.sep == ':' and not ':' in head:
-		head = head + ':'
-	mkdirs(head)
-	os.mkdir(dst, 0777)
-	
+    """Make directories leading to 'dst' if they don't exist yet"""
+    if dst == '' or os.path.exists(dst):
+        return
+    head, tail = os.path.split(dst)
+    if os.sep == ':' and not ':' in head:
+        head = head + ':'
+    mkdirs(head)
+    os.mkdir(dst, 0777)
+    
 def touched(dst):
-	"""Tell the finder a file has changed"""
-	file_fss = macfs.FSSpec(dst)
-	vRefNum, dirID, name = file_fss.as_tuple()
-	dir_fss = macfs.FSSpec((vRefNum, dirID, ''))
-	crdate, moddate, bkdate = dir_fss.GetDates()
-	now = time.time()
-	if now == moddate:
-		now = now + 1
-	try:
-		dir_fss.SetDates(crdate, now, bkdate)
-	except macfs.error:
-		pass
-	
+    """Tell the finder a file has changed. No-op on MacOSX."""
+    if sys.platform != 'mac': return
+    import macfs
+    file_fss = macfs.FSSpec(dst)
+    vRefNum, dirID, name = file_fss.as_tuple()
+    dir_fss = macfs.FSSpec((vRefNum, dirID, ''))
+    crdate, moddate, bkdate = dir_fss.GetDates()
+    now = time.time()
+    if now == moddate:
+        now = now + 1
+    try:
+        dir_fss.SetDates(crdate, now, bkdate)
+    except macfs.error:
+        pass
+    
 def touched_ae(dst):
-	"""Tell the finder a file has changed"""
-	import Finder
-	f = Finder.Finder()
-	file_fss = macfs.FSSpec(dst)
-	vRefNum, dirID, name = file_fss.as_tuple()
-	dir_fss = macfs.FSSpec((vRefNum, dirID, ''))
-	f.update(dir_fss)
-	
+    """Tell the finder a file has changed"""
+    pardir = os.path.split(dst)[0]
+    if not pardir:
+        pardir = os.curdir
+    import Finder
+    f = Finder.Finder()
+    f.update(File.FSRef(pardir))
+    
 def copy(src, dst, createpath=0, copydates=1, forcetype=None):
-	"""Copy a file, including finder info, resource fork, etc"""
-	if hasattr(src, 'as_pathname'):
-		src = src.as_pathname()
-	if hasattr(dst, 'as_pathname'):
-		dst = dst.as_pathname()
-	if createpath:
-		mkdirs(os.path.split(dst)[0])
-	
-	ifp = open(src, 'rb')
-	ofp = open(dst, 'wb')
-	d = ifp.read(BUFSIZ)
-	while d:
-		ofp.write(d)
-		d = ifp.read(BUFSIZ)
-	ifp.close()
-	ofp.close()
-	
-	ifp = openrf(src, '*rb')
-	ofp = openrf(dst, '*wb')
-	d = ifp.read(BUFSIZ)
-	while d:
-		ofp.write(d)
-		d = ifp.read(BUFSIZ)
-	ifp.close()
-	ofp.close()
-	
-	srcfss = macfs.FSSpec(src)
-	dstfss = macfs.FSSpec(dst)
-	sf = srcfss.GetFInfo()
-	df = dstfss.GetFInfo()
-	df.Creator, df.Type = sf.Creator, sf.Type
-	if forcetype != None:
-		df.Type = forcetype
-	df.Flags = (sf.Flags & (kIsStationary|kNameLocked|kHasBundle|kIsInvisible|kIsAlias))
-	dstfss.SetFInfo(df)
-	if copydates:
-		crdate, mddate, bkdate = srcfss.GetDates()
-		dstfss.SetDates(crdate, mddate, bkdate)
-	touched(dstfss)
-	
+    """Copy a file, including finder info, resource fork, etc"""
+    src = File.pathname(src)
+    dst = File.pathname(dst)
+    if createpath:
+        mkdirs(os.path.split(dst)[0])
+    
+    ifp = open(src, 'rb')
+    ofp = open(dst, 'wb')
+    d = ifp.read(BUFSIZ)
+    while d:
+        ofp.write(d)
+        d = ifp.read(BUFSIZ)
+    ifp.close()
+    ofp.close()
+    
+    ifp = openrf(src, '*rb')
+    ofp = openrf(dst, '*wb')
+    d = ifp.read(BUFSIZ)
+    while d:
+        ofp.write(d)
+        d = ifp.read(BUFSIZ)
+    ifp.close()
+    ofp.close()
+    
+    srcfss = File.FSSpec(src)
+    dstfss = File.FSSpec(dst)
+    sf = srcfss.FSpGetFInfo()
+    df = dstfss.FSpGetFInfo()
+    df.Creator, df.Type = sf.Creator, sf.Type
+    if forcetype != None:
+        df.Type = forcetype
+    df.Flags = (sf.Flags & COPY_FLAGS)
+    dstfss.FSpSetFInfo(df)
+    if copydates:
+        srcfsr = File.FSRef(src)
+        dstfsr = File.FSRef(dst)
+        catinfo, _, _, _ = srcfsr.FSGetCatalogInfo(Files.kFSCatInfoAllDates)
+        dstfsr.FSSetCatalogInfo(Files.kFSCatInfoAllDates, catinfo)
+    touched(dstfss)
+    
 def copytree(src, dst, copydates=1):
-	"""Copy a complete file tree to a new destination"""
-	if os.path.isdir(src):
-		mkdirs(dst)
-		files = os.listdir(src)
-		for f in files:
-			copytree(os.path.join(src, f), os.path.join(dst, f), copydates)
-	else:
-		copy(src, dst, 1, copydates)
+    """Copy a complete file tree to a new destination"""
+    if os.path.isdir(src):
+        mkdirs(dst)
+        files = os.listdir(src)
+        for f in files:
+            copytree(os.path.join(src, f), os.path.join(dst, f), copydates)
+    else:
+        copy(src, dst, 1, copydates)
