diff --git a/Lib/plat-mac/macfs.py b/Lib/plat-mac/macfs.py
deleted file mode 100644
index 6ec4bef..0000000
--- a/Lib/plat-mac/macfs.py
+++ /dev/null
@@ -1,198 +0,0 @@
-"""macfs - Pure Python module designed to be backward compatible with
-macfs and MACFS.
-"""
-import sys
-import struct
-import Carbon.Res
-import Carbon.File
-import warnings
-
-warnings.warn("macfs is deprecated, use Carbon.File, Carbon.Folder or EasyDialogs",
-              DeprecationWarning, stacklevel=2)
-
-# First step: ensure we also emulate the MACFS module, which contained
-# all the constants
-
-sys.modules['MACFS'] = sys.modules[__name__]
-
-# Import all those constants
-from Carbon.Files import *
-from Carbon.Folders import *
-
-# For some obscure historical reason these are here too:
-READ = 1
-WRITE = 2
-smAllScripts = -3
-
-#
-# Find the epoch conversion for file dates in a way that works on OS9 and OSX
-import time
-if time.gmtime(0)[0] == 1970:
-    _EPOCHCONVERT = -((1970-1904)*365 + 17) * (24*60*60) + 0x100000000
-    def _utc2time(utc):
-        t = utc[1] + _EPOCHCONVERT
-        return int(t)
-    def _time2utc(t):
-        t = int(t) - _EPOCHCONVERT
-        if t < -0x7fffffff:
-            t = t + 0x10000000
-        return (0, int(t), 0)
-else:
-    def _utc2time(utc):
-        t = utc[1]
-        if t < 0:
-            t = t + 0x100000000
-        return t
-    def _time2utc(t):
-        if t > 0x7fffffff:
-            t = t - 0x100000000
-        return (0, int(t), 0)
-
-# The old name of the error object:
-error = Carbon.File.Error
-
-#
-# The various objects macfs used to export. We override them here, because some
-# of the method names are subtly different.
-#
-class FSSpec(Carbon.File.FSSpec):
-    def as_fsref(self):
-        return FSRef(self)
-
-    def NewAlias(self, src=None):
-        return Alias(Carbon.File.NewAlias(src, self))
-
-    def GetCreatorType(self):
-        finfo = self.FSpGetFInfo()
-        return finfo.Creator, finfo.Type
-
-    def SetCreatorType(self, ctor, tp):
-        finfo = self.FSpGetFInfo()
-        finfo.Creator = ctor
-        finfo.Type = tp
-        self.FSpSetFInfo(finfo)
-
-    def GetFInfo(self):
-        return self.FSpGetFInfo()
-
-    def SetFInfo(self, info):
-        return self.FSpSetFInfo(info)
-
-    def GetDates(self):
-        catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate
-        catinfo, d1, d2, d3 = FSRef(self).FSGetCatalogInfo(catInfoFlags)
-        cdate = catinfo.createDate
-        mdate = catinfo.contentModDate
-        bdate = catinfo.backupDate
-        return _utc2time(cdate), _utc2time(mdate), _utc2time(bdate)
-
-    def SetDates(self, cdate, mdate, bdate):
-        catInfoFlags = kFSCatInfoCreateDate|kFSCatInfoContentMod|kFSCatInfoBackupDate
-        catinfo = Carbon.File.FSCatalogInfo(
-            createDate = _time2utc(cdate),
-            contentModDate = _time2utc(mdate),
-            backupDate = _time2utc(bdate))
-        FSRef(self).FSSetCatalogInfo(catInfoFlags, catinfo)
-
-class FSRef(Carbon.File.FSRef):
-    def as_fsspec(self):
-        return FSSpec(self)
-
-class Alias(Carbon.File.Alias):
-
-    def GetInfo(self, index):
-        return self.GetAliasInfo(index)
-
-    def Update(self, *args):
-        pass # print "Alias.Update not yet implemented"
-
-    def Resolve(self, src=None):
-        fss, changed = self.ResolveAlias(src)
-        return FSSpec(fss), changed
-
-from Carbon.File import FInfo
-
-# Backward-compatible type names:
-FSSpecType = FSSpec
-FSRefType = FSRef
-AliasType = Alias
-FInfoType = FInfo
-
-# Global functions:
-def ResolveAliasFile(fss, chain=1):
-    fss, isdir, isalias = Carbon.File.ResolveAliasFile(fss, chain)
-    return FSSpec(fss), isdir, isalias
-
-def RawFSSpec(data):
-    return FSSpec(rawdata=data)
-
-def RawAlias(data):
-    return Alias(rawdata=data)
-
-def FindApplication(*args):
-    raise NotImplementedError, "FindApplication no longer implemented"
-
-def NewAliasMinimalFromFullPath(path):
-    return Alias(Carbon.File.NewAliasMinimalFromFullPath(path, '', ''))
-
-# Another global function:
-from Carbon.Folder import FindFolder
-
-#
-# Finally the old Standard File routine emulators.
-#
-
-_curfolder = None
-
-def StandardGetFile(*typelist):
-    """Ask for an input file, optionally specifying 4-char file types that are
-    allowable"""
-    return PromptGetFile('', *typelist)
-
-def PromptGetFile(prompt, *typelist):
-    """Ask for an input file giving the user a prompt message. Optionally you can
-    specifying 4-char file types that are allowable"""
-    import EasyDialogs
-    warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
-              DeprecationWarning, stacklevel=2)
-    if not typelist:
-        typelist = None
-    fss = EasyDialogs.AskFileForOpen(message=prompt, wanted=FSSpec,
-        typeList=typelist, defaultLocation=_handleSetFolder())
-    return fss, not fss is None
-
-def StandardPutFile(prompt, default=None):
-    """Ask the user for an output file, with a prompt. Optionally you cn supply a
-    default output filename"""
-    import EasyDialogs
-    warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
-              DeprecationWarning, stacklevel=2)
-    fss = EasyDialogs.AskFileForSave(wanted=FSSpec, message=prompt,
-    savedFileName=default, defaultLocation=_handleSetFolder())
-    return fss, not fss is None
-
-def SetFolder(folder):
-    global _curfolder
-    warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
-              DeprecationWarning, stacklevel=2)
-    if _curfolder:
-        rv = FSSpec(_curfolder)
-    else:
-        rv = None
-    _curfolder = folder
-    return rv
-
-def _handleSetFolder():
-    global _curfolder
-    rv = _curfolder
-    _curfolder = None
-    return rv
-
-def GetDirectory(prompt=None):
-    """Ask the user to select a folder. Optionally you can give a prompt."""
-    import EasyDialogs
-    warnings.warn("macfs.StandardGetFile and friends are deprecated, use EasyDialogs.AskFileForOpen",
-              DeprecationWarning, stacklevel=2)
-    fss = EasyDialogs.AskFolder(message=prompt, wanted=FSSpec,
-        defaultLocation=_handleSetFolder())
-    return fss, not fss is None
diff --git a/Lib/plat-mac/macostools.py b/Lib/plat-mac/macostools.py
index 2adc8aa..27d2f83 100644
--- a/Lib/plat-mac/macostools.py
+++ b/Lib/plat-mac/macostools.py
@@ -65,21 +65,9 @@
 
 def touched(dst):
     """Tell the finder a file has changed. No-op on MacOSX."""
-    if sys.platform != 'mac': return
     import warnings
-    warnings.filterwarnings("ignore", "macfs.*", DeprecationWarning, __name__)
-    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
+    warnings.warn("macostools.touched() has been deprecated",
+                    DeprecationWarning, 2)
 
 def touched_ae(dst):
     """Tell the finder a file has changed"""
@@ -129,7 +117,6 @@
         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"""
