When in MacPython-OSX use bundlebuilder to create .app bundles.
diff --git a/Lib/plat-mac/aepack.py b/Lib/plat-mac/aepack.py
index bfe539a..17a7e70 100644
--- a/Lib/plat-mac/aepack.py
+++ b/Lib/plat-mac/aepack.py
@@ -88,6 +88,8 @@
 		return x
 	if isinstance(x, FSSType):
 		return AE.AECreateDesc('fss ', x.data)
+	if isinstance(x, FSRefType):
+		return AE.AECreateDesc('fsrf', x.data)
 	if isinstance(x, AliasType):
 		return AE.AECreateDesc('alis', x.data)
 	if isinstance(x, IntType):
@@ -166,6 +168,8 @@
 		return struct.unpack('d', data)[0]
 	if t == typeFSS:
 		return Carbon.File.FSSpec(rawdata=desc.data)
+	if t == typeFSRef:
+		return Carbon.File.FSRef(rawdata=desc.data)
 	if t == typeInsertionLoc:
 		record = desc.AECoerceDesc('reco')
 		return mkinsertionloc(unpack(record, formodulename))
diff --git a/Lib/plat-mac/aetypes.py b/Lib/plat-mac/aetypes.py
index ac339e7..b091a28 100644
--- a/Lib/plat-mac/aetypes.py
+++ b/Lib/plat-mac/aetypes.py
@@ -11,24 +11,8 @@
 #
 def pack(*args, **kwargs):
 	from aepack import pack
-	return apply(pack, args, kwargs)
+	return pack( *args, **kwargs)
 	
-def IsSubclass(cls, base):
-	"""Test whether CLASS1 is the same as or a subclass of CLASS2"""
-	# Loop to optimize for single inheritance
-	while 1:
-		if cls is base: return 1
-		if len(cls.__bases__) <> 1: break
-		cls = cls.__bases__[0]
-	# Recurse to cope with multiple inheritance
-	for c in cls.__bases__:
-		if IsSubclass(c, base): return 1
-	return 0
-
-def IsInstance(x, cls):
-	"""Test whether OBJECT is an instance of (a subclass of) CLASS"""
-	return type(x) is InstanceType and IsSubclass(x.__class__, cls)
-
 def nice(s):
 	"""'nice' representation of an object"""
 	if type(s) is StringType: return repr(s)
@@ -63,7 +47,7 @@
 		return pack(self.enum, typeEnumeration)
 
 def IsEnum(x):
-	return IsInstance(x, Enum)
+	return isinstance(x, Enum)
 
 def mkenum(enum):
 	if IsEnum(enum): return enum
@@ -108,7 +92,7 @@
 		return pack(struct.pack('b', self.bool), 'bool')
 
 def IsBoolean(x):
-	return IsInstance(x, Boolean)
+	return isinstance(x, Boolean)
 
 def mkboolean(bool):
 	if IsBoolean(bool): return bool
@@ -130,7 +114,7 @@
 		return pack(self.type, typeType)
 
 def IsType(x):
-	return IsInstance(x, Type)
+	return isinstance(x, Type)
 
 def mktype(type):
 	if IsType(type): return type
@@ -153,7 +137,7 @@
 		return pack(self.keyword, typeKeyword)
 
 def IsKeyword(x):
-	return IsInstance(x, Keyword)
+	return isinstance(x, Keyword)
 
 class Range:
 	"""An AE range object"""
@@ -172,7 +156,7 @@
 		return pack({'star': self.start, 'stop': self.stop}, 'rang')
 
 def IsRange(x):
-	return IsInstance(x, Range)
+	return isinstance(x, Range)
 
 class Comparison:
 	"""An AE Comparison"""
@@ -195,7 +179,7 @@
 			    'cmpd')
 
 def IsComparison(x):
-	return IsInstance(x, Comparison)
+	return isinstance(x, Comparison)
 	
 class NComparison(Comparison):
 	# The class attribute 'relo' must be set in a subclass
@@ -220,7 +204,7 @@
 		return pack(self.abso, 'abso')
 
 def IsOrdinal(x):
-	return IsInstance(x, Ordinal)
+	return isinstance(x, Ordinal)
 	
 class NOrdinal(Ordinal):
 	# The class attribute 'abso' must be set in a subclass
@@ -250,7 +234,7 @@
 		return pack({'logc': mkenum(self.logc), 'term': self.term}, 'logi')
 
 def IsLogical(x):
-	return IsInstance(x, Logical)
+	return isinstance(x, Logical)
 
 class StyledText:
 	"""An AE object respresenting text in a certain style"""
@@ -269,7 +253,7 @@
 		return pack({'ksty': self.style, 'ktxt': self.text}, 'STXT')
 
 def IsStyledText(x):
-	return IsInstance(x, StyledText)
+	return isinstance(x, StyledText)
 
 class AEText:
 	"""An AE text object with style, script and language specified"""
@@ -290,7 +274,7 @@
 				 keyAEText: self.text}, typeAEText)
 
 def IsAEText(x):
-	return IsInstance(x, AEText)
+	return isinstance(x, AEText)
 
 class IntlText:
 	"""A text object with script and language specified"""
@@ -311,7 +295,7 @@
 			typeIntlText)
 
 def IsIntlText(x):
-	return IsInstance(x, IntlText)
+	return isinstance(x, IntlText)
 
 class IntlWritingCode:
 	"""An object representing script and language"""
@@ -331,7 +315,7 @@
 			typeIntlWritingCode)
 
 def IsIntlWritingCode(x):
-	return IsInstance(x, IntlWritingCode)
+	return isinstance(x, IntlWritingCode)
 
 class QDPoint:
 	"""A point"""
@@ -351,7 +335,7 @@
 			typeQDPoint)
 
 def IsQDPoint(x):
-	return IsInstance(x, QDPoint)
+	return isinstance(x, QDPoint)
 
 class QDRectangle:
 	"""A rectangle"""
@@ -374,7 +358,7 @@
 			typeQDRectangle)
 
 def IsQDRectangle(x):
-	return IsInstance(x, QDRectangle)
+	return isinstance(x, QDRectangle)
 
 class RGBColor:
 	"""An RGB color"""
@@ -395,7 +379,7 @@
 			typeRGBColor)
 
 def IsRGBColor(x):
-	return IsInstance(x, RGBColor)
+	return isinstance(x, RGBColor)
 
 class ObjectSpecifier:
 	
@@ -444,7 +428,7 @@
 			    'obj ')
 
 def IsObjectSpecifier(x):
-	return IsInstance(x, ObjectSpecifier)
+	return isinstance(x, ObjectSpecifier)
 
 
 # Backwards compatability, sigh...
diff --git a/Lib/plat-mac/bgenlocations.py b/Lib/plat-mac/bgenlocations.py
index 87400e1..896861e 100644
--- a/Lib/plat-mac/bgenlocations.py
+++ b/Lib/plat-mac/bgenlocations.py
@@ -26,9 +26,9 @@
 # end of lines, so don't worry about that.
 #
 if sys.platform == 'mac':
-	_MWERKSDIR="Moes:Applications (Mac OS 9):Metrowerks CodeWarrior 7.0:Metrowerks CodeWarrior"
+	_MWERKSDIR="Sap:Applications (Mac OS 9):Metrowerks CodeWarrior 7.0:Metrowerks CodeWarrior"
 else:
-	_MWERKSDIR="/Volumes/Moes/Applications (Mac OS 9)/Metrowerks CodeWarrior 7.0/Metrowerks CodeWarrior/"
+	_MWERKSDIR="/Volumes/Sap/Applications (Mac OS 9)/Metrowerks CodeWarrior 7.0/Metrowerks CodeWarrior/"
 INCLUDEDIR=os.path.join(_MWERKSDIR, "MacOS Support", "Universal", "Interfaces", "CIncludes")
 
 #
diff --git a/Lib/plat-mac/buildtools.py b/Lib/plat-mac/buildtools.py
index 7cafce5..89d4510 100644
--- a/Lib/plat-mac/buildtools.py
+++ b/Lib/plat-mac/buildtools.py
@@ -44,9 +44,7 @@
 def findtemplate(template=None):
 	"""Locate the applet template along sys.path"""
 	if MacOS.runtimemodel == 'macho':
-		if template:
-			return template
-		return findtemplate_macho()
+		return None
 	if not template:
 		template=TEMPLATE
 	for p in sys.path:
@@ -61,15 +59,7 @@
 	file = file.as_pathname()
 	return file
 	
-def findtemplate_macho():
-	execpath = sys.executable.split('/')
-	if not 'Contents' in execpath:
-		raise BuildError, "Not running from a .app bundle: %s" % sys.executable
-	i = execpath.index('Contents')
-	return '/'.join(execpath[:i])
-
-
-def process(template, filename, destname, copy_codefragment, 
+def process(template, filename, destname, copy_codefragment=0, 
 		rsrcname=None, others=[], raw=0, progress="default"):
 	
 	if progress == "default":
@@ -118,7 +108,7 @@
 	except os.error:
 		pass
 	process_common(template, progress, code, rsrcname, destname, 0, 
-		copy_codefragment, raw, others)
+		copy_codefragment, raw, others, filename)
 	
 
 def update(template, filename, output):
@@ -140,10 +130,10 @@
 
 
 def process_common(template, progress, code, rsrcname, destname, is_update, 
-		copy_codefragment, raw=0, others=[]):
+		copy_codefragment, raw=0, others=[], filename=None):
 	if MacOS.runtimemodel == 'macho':
 		return process_common_macho(template, progress, code, rsrcname, destname,
-			is_update, raw, others)
+			is_update, raw, others, filename)
 	if others:
 		raise BuildError, "Extra files only allowed for MachoPython applets"
 	# Create FSSpecs for the various files
@@ -274,12 +264,16 @@
 		progress.label("Done.")
 		progress.inc(0)
 
-def process_common_macho(template, progress, code, rsrcname, destname, is_update, raw=0, others=[]):
+def process_common_macho(template, progress, code, rsrcname, destname, is_update, 
+		raw=0, others=[], filename=None):
+	# Check that we have a filename
+	if filename is None:
+		raise BuildError, "Need source filename on MacOSX"
 	# First make sure the name ends in ".app"
 	if destname[-4:] != '.app':
 		destname = destname + '.app'
 	# Now deduce the short name
-	shortname = os.path.split(destname)[1]
+	destdir, shortname = os.path.split(destname)
 	if shortname[-4:] == '.app':
 		# Strip the .app suffix
 		shortname = shortname[:-4]
@@ -295,136 +289,26 @@
 				icnsname = None
 		else:
 			plistname = None
-	# Start with copying the .app framework
-	if not is_update:
-		exceptlist = ["Contents/Info.plist", 
-				"Contents/Resources/English.lproj/InfoPlist.strings", 
-				"Contents/Resources/English.lproj/Documentation", 
-				"Contents/Resources/python.rsrc",
-				]
-		copyapptree(template, destname, exceptlist, progress)
-		# SERIOUS HACK. If we've just copied a symlink as the
-		# executable we assume we're running from the MacPython addon
-		# to 10.2 python. We remove the symlink again and install
-		# the appletrunner script.
-		executable = os.path.join(destname, "Contents/MacOS/python")
-		if os.path.islink(executable):
-			os.remove(executable)
-			dummyfp, appletrunner, d2 = imp.find_module('appletrunner')
-			del dummyfp
-			shutil.copy2(appletrunner, executable)
-			os.chmod(executable, 0775)
-	# Now either use the .plist file or the default
+	if not os.path.exists(rsrcname):
+		rsrcname = None
 	if progress:
-		progress.label('Create info.plist')
-		progress.inc(0)
+		progress.label('Creating bundle...')
+	import bundlebuilder
+	builder = bundlebuilder.AppBuilder(verbosity=0)
+	builder.mainprogram = filename
+	builder.builddir = destdir
+	builder.name = shortname
+	if rsrcname:
+		builder.resources.append(rsrcname)
+	for o in others:
+		builder.resources.append(o)
 	if plistname:
-		shutil.copy2(plistname, os.path.join(destname, 'Contents', 'Info.plist'))
-		if icnsname:
-			icnsdest = os.path.split(icnsname)[1]
-			icnsdest = os.path.join(destname, 
-				os.path.join('Contents', 'Resources', icnsdest))
-			shutil.copy2(icnsname, icnsdest)
-		# XXXX Wrong. This should be parsed from plist file. Also a big hack:-)
-		if shortname == 'PythonIDE':
-			ownertype = 'Pide'
-		else:
-			ownertype = 'PytA'
-		# XXXX Should copy .icns file
-	else:
-		cocoainfo = ''
-		for o in others:
-			if o[-4:] == '.nib':
-				nibname = os.path.split(o)[1][:-4]
-				cocoainfo = """
-        <key>NSMainNibFile</key>
-        <string>%s</string>
-        <key>NSPrincipalClass</key>
-        <string>NSApplication</string>""" % nibname
-			elif o[-6:] == '.lproj':
-				files = os.listdir(o)
-				for f in files:
-					if f[-4:] == '.nib':
-						nibname = os.path.split(f)[1][:-4]
-						cocoainfo = """
-        <key>NSMainNibFile</key>
-        <string>%s</string>
-        <key>NSPrincipalClass</key>
-        <string>NSApplication</string>""" % nibname
-
-		plistname = os.path.join(template, 'Contents', 'Resources', 'Applet-Info.plist')
-		plistdata = open(plistname).read()
-		plistdata = plistdata % {'appletname':shortname, 'cocoainfo':cocoainfo}
-		ofp = open(os.path.join(destname, 'Contents', 'Info.plist'), 'w')
-		ofp.write(plistdata)
-		ofp.close()
-		ownertype = 'PytA'
-	# Create the PkgInfo file
-	if progress:
-		progress.label('Create PkgInfo')
-		progress.inc(0)
-	ofp = open(os.path.join(destname, 'Contents', 'PkgInfo'), 'wb')
-	ofp.write('APPL' + ownertype)
-	ofp.close()
-		
-	
-	# Copy the resources from the target specific resource template, if any
-	typesfound, ownertype = [], None
-	try:
-		input = macresource.open_pathname(rsrcname)
-	except (MacOS.Error, ValueError):
-		if progress:
-			progress.inc(50)
-	else:
-		if progress:
-			progress.label("Copy resources...")
-			progress.set(20)
-		resfilename = 'python.rsrc'  # XXXX later: '%s.rsrc' % shortname
-		try:
-			output = Res.FSOpenResourceFile(
-					os.path.join(destname, 'Contents', 'Resources', resfilename), 
-					u'', WRITE)
-		except MacOS.Error:
-			fsr, dummy = Res.FSCreateResourceFile(
-					os.path.join(destname, 'Contents', 'Resources'), 
-					unicode(resfilename), '')
-			output = Res.FSOpenResourceFile(fsr, u'', WRITE)
-		
-		typesfound, ownertype = copyres(input, output, [], 0, progress)
-		Res.CloseResFile(input)
-		Res.CloseResFile(output)
-
-	if code:
-		if raw:
-			pycname = '__rawmain__.pyc'
-		else:
-			pycname = '__main__.pyc'
-			# And we also create __rawmain__.pyc
-			outputfilename = os.path.join(destname, 'Contents', 'Resources', '__rawmain__.pyc')
-			if progress:
-				progress.label('Creating __rawmain__.pyc')
-				progress.inc(0)
-			rawsourcefp, rawsourcefile, d2 = imp.find_module('appletrawmain')
-			rawsource = rawsourcefp.read()
-			rawcode = compile(rawsource, rawsourcefile, 'exec')
-			writepycfile(rawcode, outputfilename)
-			
-		outputfilename = os.path.join(destname, 'Contents', 'Resources', pycname)
-		if progress:
-			progress.label('Creating '+pycname)
-			progress.inc(0)
-		writepycfile(code, outputfilename)
-	# Copy other files the user asked for
-	for osrc in others:
-		oname = os.path.split(osrc)[1]
-		odst = os.path.join(destname, 'Contents', 'Resources', oname)
-		if progress: 
-			progress.label('Copy ' + oname)
-			progress.inc(0)
-		if os.path.isdir(osrc):
-			copyapptree(osrc, odst)
-		else:
-			shutil.copy2(osrc, odst)
+		import Plist
+		builder.plist = Plist.fromFile(plistname)
+	if icnsname:
+		builder.iconfile = icnsname
+	builder.setup()
+	builder.build()
 	if progress: 
 		progress.label('Done.')
 		progress.inc(0)