diff --git a/Mac/Lib/newmacfs.py b/Mac/Lib/newmacfs.py
new file mode 100644
index 0000000..54265fa
--- /dev/null
+++ b/Mac/Lib/newmacfs.py
@@ -0,0 +1,90 @@
+"""macfs - Pure Python module designed to be backward compatible with
+macfs and MACFS.
+"""
+import sys
+
+# First step: ensure we also emulate the MACFS module, which contained
+# all the constants
+
+sys.modules['MACFS'] = sys.modules[__name__]
+
+# Import all those constants
+import Carbon.Files
+from Carbon.Folder import FindFolder
+
+# For some obscure historical reason these are here too:
+READ = 1
+WRITE = 2
+smAllScripts = -3
+
+import Carbon.File
+
+class FSSpec(Carbon.File.FSSpec):
+	def as_FSRef(self):
+		return FSRef(self)
+		
+	def NewAlias(self, src=None):
+		if src is None:
+			src = FSSpec((0,0,''))
+		return self.NewAlias(src)
+		
+	def GetCreatorType(self):
+		finfo = self.FSpGetFInfo()
+		return finfo[1], finfo[0]
+		
+	def SetCreatorType(self, ctor, tp):
+		finfo = self.FSpGetFInfo()
+		finfo = (tp, ctor) + finfo[2:]
+		self.FSpSetFInfo(finfo)
+		
+	def GetFInfo(self):
+		return self.FSpGetFInfo()
+		
+	def SetFInfo(self, info):
+		return self.FSpSetFInfo(info)
+		
+	def GetDates(self):
+		raise NotImplementedError, "FSSpec.GetDates no longer implemented"
+	
+	def SetDates(self, *dates):
+		raise NotImplementedError, "FSSpec.SetDates no longer implemented"
+	
+class FSRef(Carbon.File.FSRef):
+	def as_FSSpec(self):
+		return FSSpec(self)
+	
+class Alias(Carbon.File.Alias):
+
+	def Resolve(self, src=None):
+		if src is None:
+			src = FSSpec((0, 0, ''))
+		return self.ResolveAlias(src)
+		
+	def GetInfo(self, index):
+		return self.GetAliasInfo(index)
+		
+	def Update(self, *args):
+		raise NotImplementedError, "Alias.Update not yet implemented"
+	
+class FInfo:
+	pass
+	
+FSSpecType = FSSpec
+FSRefType = FSRef
+AliasType = Alias
+FInfoType = FInfo
+
+def ResolveAliasFile(fss, chain=1):
+	return Carbon.Files.ResolveAliasFile(fss, chain)
+	
+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 Carbon.Files.NewAliasMinimalFromFullPath(path, '', '')
\ No newline at end of file
