diff --git a/Mac/BuildScript/README.txt b/Mac/BuildScript/README.txt
index 41df0e4..0f1aeb5 100644
--- a/Mac/BuildScript/README.txt
+++ b/Mac/BuildScript/README.txt
@@ -37,6 +37,17 @@
 * When done the script will tell you where the DMG image is (by default
   somewhere in ``/tmp/_py``).
 
+Building a 4-way universal installer
+....................................
+
+It is also possible to build a 4-way universal installer that runs on 
+OSX Leopard or later::
+
+  $ ./build-installer.py --dep-target=10.5 --universal-archs=all --sdk=/
+
+This requires that the deployment target is 10.5 (or later), and hence
+also that your building on at least OSX 10.5.
+
 Testing
 -------
 
diff --git a/Mac/BuildScript/build-installer.py b/Mac/BuildScript/build-installer.py
index 4823246..174bf68 100755
--- a/Mac/BuildScript/build-installer.py
+++ b/Mac/BuildScript/build-installer.py
@@ -2,7 +2,8 @@
 """
 This script is used to build the "official unofficial" universal build on
 Mac OS X. It requires Mac OS X 10.4, Xcode 2.2 and the 10.4u SDK to do its
-work.
+work.  64-bit or four-way universal builds require at least OS X 10.5 and
+the 10.5 SDK.
 
 Please ensure that this script keeps working with Python 2.3, to avoid
 bootstrap issues (/usr/bin/python is Python 2.3 on OSX 10.4)
@@ -63,7 +64,15 @@
 SDKPATH = "/Developer/SDKs/MacOSX10.4u.sdk"
 #SDKPATH = "/"
 
-ARCHLIST = ('i386', 'ppc',)
+universal_opts_map = { '32-bit': ('i386', 'ppc',),
+                       '64-bit': ('x86_64', 'ppc64',),
+                       'all': ('i386', 'ppc', 'x86_64', 'ppc64',) }
+
+UNIVERSALOPTS = tuple(universal_opts_map.keys())
+
+UNIVERSALARCHS = '32-bit'
+
+ARCHLIST = universal_opts_map[UNIVERSALARCHS]
 
 # Source directory (asume we're in Mac/BuildScript)
 SRCDIR = os.path.dirname(
@@ -72,6 +81,9 @@
                 os.path.abspath(__file__
         ))))
 
+# $MACOSX_DEPLOYMENT_TARGET -> minimum OS X level
+DEPTARGET = '10.3'
+
 USAGE = textwrap.dedent("""\
     Usage: build_python [options]
 
@@ -82,62 +94,67 @@
     --third-party=DIR:   Store third-party sources here (default: %(DEPSRC)r)
     --sdk-path=DIR:      Location of the SDK (default: %(SDKPATH)r)
     --src-dir=DIR:       Location of the Python sources (default: %(SRCDIR)r)
+    --dep-target=10.n    OS X deployment target (default: %(DEPTARGET)r)
+    --universal-archs=x  universal architectures (options: %(UNIVERSALOPTS)r, default: %(UNIVERSALARCHS)r)
 """)% globals()
 
 
 # Instructions for building libraries that are necessary for building a
 # batteries included python.
-LIBRARY_RECIPES = [
-    dict(
-        name="Bzip2 1.0.4",
-        url="http://www.bzip.org/1.0.4/bzip2-1.0.4.tar.gz",
-        checksum='fc310b254f6ba5fbb5da018f04533688',
-        configure=None,
-        install='make install PREFIX=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
-            shellQuote(os.path.join(WORKDIR, 'libraries')),
-            ' -arch '.join(ARCHLIST),
-            SDKPATH,
-        ),
-    ),
-    dict(
-        name="ZLib 1.2.3",
-        url="http://www.gzip.org/zlib/zlib-1.2.3.tar.gz",
-        checksum='debc62758716a169df9f62e6ab2bc634',
-        configure=None,
-        install='make install prefix=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
-            shellQuote(os.path.join(WORKDIR, 'libraries')),
-            ' -arch '.join(ARCHLIST),
-            SDKPATH,
-        ),
-    ),
-    dict(
-        # Note that GNU readline is GPL'd software
-        name="GNU Readline 5.1.4",
-        url="http://ftp.gnu.org/pub/gnu/readline/readline-5.1.tar.gz" ,
-        checksum='7ee5a692db88b30ca48927a13fd60e46',
-        patchlevel='0',
-        patches=[
-            # The readline maintainers don't do actual micro releases, but
-            # just ship a set of patches.
-            'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-001',
-            'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-002',
-            'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-003',
-            'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-004',
-        ]
-    ),
+#   [The recipes are defined here for convenience but instantiated later after
+#    command line options have been processed.]
+def library_recipes():
+    return [
+      dict(
+          name="Bzip2 1.0.4",
+          url="http://www.bzip.org/1.0.4/bzip2-1.0.4.tar.gz",
+          checksum='fc310b254f6ba5fbb5da018f04533688',
+          configure=None,
+          install='make install PREFIX=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
+              shellQuote(os.path.join(WORKDIR, 'libraries')),
+              ' -arch '.join(ARCHLIST),
+              SDKPATH,
+          ),
+      ),
+      dict(
+          name="ZLib 1.2.3",
+          url="http://www.gzip.org/zlib/zlib-1.2.3.tar.gz",
+          checksum='debc62758716a169df9f62e6ab2bc634',
+          configure=None,
+          install='make install prefix=%s/usr/local/ CFLAGS="-arch %s -isysroot %s"'%(
+              shellQuote(os.path.join(WORKDIR, 'libraries')),
+              ' -arch '.join(ARCHLIST),
+              SDKPATH,
+          ),
+      ),
+      dict(
+          # Note that GNU readline is GPL'd software
+          name="GNU Readline 5.1.4",
+          url="http://ftp.gnu.org/pub/gnu/readline/readline-5.1.tar.gz" ,
+          checksum='7ee5a692db88b30ca48927a13fd60e46',
+          patchlevel='0',
+          patches=[
+              # The readline maintainers don't do actual micro releases, but
+              # just ship a set of patches.
+              'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-001',
+              'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-002',
+              'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-003',
+              'http://ftp.gnu.org/pub/gnu/readline/readline-5.1-patches/readline51-004',
+          ]
+      ),
 
-    dict(
-        name="SQLite 3.6.11",
-        url="http://www.sqlite.org/sqlite-3.6.11.tar.gz",
-        checksum='7ebb099696ab76cc6ff65dd496d17858',
-        configure_pre=[
-            '--enable-threadsafe',
-            '--enable-tempstore',
-            '--enable-shared=no',
-            '--enable-static=yes',
-            '--disable-tcl',
-        ]
-    ),
+      dict(
+          name="SQLite 3.6.11",
+          url="http://www.sqlite.org/sqlite-3.6.11.tar.gz",
+          checksum='7ebb099696ab76cc6ff65dd496d17858',
+          configure_pre=[
+              '--enable-threadsafe',
+              '--enable-tempstore',
+              '--enable-shared=no',
+              '--enable-static=yes',
+              '--disable-tcl',
+          ]
+      ),
 
     dict(
         name="NCurses 5.5",
@@ -170,7 +187,6 @@
     ),
 ]
 
-
 # Instructions for building packages inside the .mpkg.
 PKG_RECIPES = [
     dict(
@@ -205,8 +221,8 @@
         source="/usr/local/bin",
         readme="""\
             This package installs the unix tools in /usr/local/bin for
-            compatibility with older releases of MacPython. This package
-            is not necessary to use MacPython.
+            compatibility with older releases of Python. This package
+            is not necessary to use Python.
             """,
         required=False,
         selected='unselected',
@@ -231,7 +247,7 @@
         long_name="Shell profile updater",
         readme="""\
             This packages updates your shell profile to make sure that
-            the MacPython tools are found by your shell in preference of
+            the Python tools are found by your shell in preference of
             the system provided Python tools.
 
             If you don't install this package you'll have to add
@@ -321,14 +337,16 @@
     """
     Parse arguments and update global settings.
     """
-    global WORKDIR, DEPSRC, SDKPATH, SRCDIR
+    global WORKDIR, DEPSRC, SDKPATH, SRCDIR, DEPTARGET
+    global UNIVERSALOPTS, UNIVERSALARCHS, ARCHLIST
 
     if args is None:
         args = sys.argv[1:]
 
     try:
         options, args = getopt.getopt(args, '?hb',
-                [ 'build-dir=', 'third-party=', 'sdk-path=' , 'src-dir='])
+                [ 'build-dir=', 'third-party=', 'sdk-path=' , 'src-dir=',
+                  'dep-target=', 'universal-archs=', 'help' ])
     except getopt.error, msg:
         print msg
         sys.exit(1)
@@ -338,7 +356,7 @@
         sys.exit(1)
 
     for k, v in options:
-        if k in ('-h', '-?'):
+        if k in ('-h', '-?', '--help'):
             print USAGE
             sys.exit(0)
 
@@ -354,6 +372,16 @@
         elif k in ('--src-dir',):
             SRCDIR=v
 
+        elif k in ('--dep-target', ):
+            DEPTARGET=v
+
+        elif k in ('--universal-archs', ):
+            if v in UNIVERSALOPTS:
+                UNIVERSALARCHS = v
+                ARCHLIST = universal_opts_map[UNIVERSALARCHS]
+            else:
+                raise NotImplementedError, v
+
         else:
             raise NotImplementedError, k
 
@@ -366,7 +394,9 @@
     print " * Source directory:", SRCDIR
     print " * Build directory: ", WORKDIR
     print " * SDK location:    ", SDKPATH
-    print " * third-party source:", DEPSRC
+    print " * Third-party source:", DEPSRC
+    print " * Deployment target:", DEPTARGET
+    print " * Universal architectures:", ARCHLIST
     print ""
 
 
@@ -476,6 +506,7 @@
         print "Using local copy of %s"%(name,)
 
     else:
+        print "Did not find local copy of %s"%(name,)
         print "Downloading %s"%(name,)
         downloadURL(url, sourceArchive)
         print "Archive for %s stored as %s"%(name, sourceArchive)
@@ -566,7 +597,7 @@
     os.makedirs(os.path.join(universal, 'usr', 'local', 'lib'))
     os.makedirs(os.path.join(universal, 'usr', 'local', 'include'))
 
-    for recipe in LIBRARY_RECIPES:
+    for recipe in library_recipes():
         buildRecipe(recipe, universal, ARCHLIST)
 
 
@@ -590,7 +621,7 @@
 
 
 def buildPython():
-    print "Building a universal python"
+    print "Building a universal python for %s architectures" % UNIVERSALARCHS
 
     buildDir = os.path.join(WORKDIR, '_bld', 'python')
     rootDir = os.path.join(WORKDIR, '_root')
@@ -614,9 +645,13 @@
     version = getVersion()
 
     print "Running configure..."
-    runCommand("%s -C --enable-framework --enable-universalsdk=%s LDFLAGS='-g -L%s/libraries/usr/local/lib' OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%(
-        shellQuote(os.path.join(SRCDIR, 'configure')),
-        shellQuote(SDKPATH), shellQuote(WORKDIR)[1:-1],
+    runCommand("%s -C --enable-framework --enable-universalsdk=%s "
+               "--with-universal-archs=%s "
+               "LDFLAGS='-g -L%s/libraries/usr/local/lib' "
+               "OPT='-g -O3 -I%s/libraries/usr/local/include' 2>&1"%(
+        shellQuote(os.path.join(SRCDIR, 'configure')), shellQuote(SDKPATH),
+        UNIVERSALARCHS,
+        shellQuote(WORKDIR)[1:-1],
         shellQuote(WORKDIR)[1:-1]))
 
     print "Running make"
@@ -704,7 +739,7 @@
     data = fileContents(inPath)
     data = data.replace('$FULL_VERSION', getFullVersion())
     data = data.replace('$VERSION', getVersion())
-    data = data.replace('$MACOSX_DEPLOYMENT_TARGET', '10.3 or later')
+    data = data.replace('$MACOSX_DEPLOYMENT_TARGET', ''.join((DEPTARGET, ' or later')))
     data = data.replace('$ARCHITECTURES', "i386, ppc")
     data = data.replace('$INSTALL_SIZE', installSize())
 
@@ -784,9 +819,9 @@
         vers = getFullVersion()
         major, minor = map(int, getVersion().split('.', 2))
         pl = Plist(
-                CFBundleGetInfoString="MacPython.%s %s"%(pkgname, vers,),
-                CFBundleIdentifier='org.python.MacPython.%s'%(pkgname,),
-                CFBundleName='MacPython.%s'%(pkgname,),
+                CFBundleGetInfoString="Python.%s %s"%(pkgname, vers,),
+                CFBundleIdentifier='org.python.Python.%s'%(pkgname,),
+                CFBundleName='Python.%s'%(pkgname,),
                 CFBundleShortVersionString=vers,
                 IFMajorVersion=major,
                 IFMinorVersion=minor,
@@ -807,7 +842,7 @@
 
         pl = Plist(
                     IFPkgDescriptionDescription=readme,
-                    IFPkgDescriptionTitle=recipe.get('long_name', "MacPython.%s"%(pkgname,)),
+                    IFPkgDescriptionTitle=recipe.get('long_name', "Python.%s"%(pkgname,)),
                     IFPkgDescriptionVersion=vers,
                 )
         writePlist(pl, os.path.join(packageContents, 'Resources', 'Description.plist'))
@@ -822,9 +857,9 @@
     major, minor = map(int, getVersion().split('.', 2))
 
     pl = Plist(
-            CFBundleGetInfoString="MacPython %s"%(vers,),
-            CFBundleIdentifier='org.python.MacPython',
-            CFBundleName='MacPython',
+            CFBundleGetInfoString="Python %s"%(vers,),
+            CFBundleIdentifier='org.python.Python',
+            CFBundleName='Python',
             CFBundleShortVersionString=vers,
             IFMajorVersion=major,
             IFMinorVersion=minor,
@@ -858,7 +893,7 @@
         shutil.rmtree(outdir)
     os.mkdir(outdir)
 
-    pkgroot = os.path.join(outdir, 'MacPython.mpkg', 'Contents')
+    pkgroot = os.path.join(outdir, 'Python.mpkg', 'Contents')
     pkgcontents = os.path.join(pkgroot, 'Packages')
     os.makedirs(pkgcontents)
     for recipe in PKG_RECIPES:
@@ -875,7 +910,7 @@
 
     makeMpkgPlist(os.path.join(pkgroot, 'Info.plist'))
     pl = Plist(
-                IFPkgDescriptionTitle="Universal MacPython",
+                IFPkgDescriptionTitle="Python",
                 IFPkgDescriptionVersion=getVersion(),
             )
 
@@ -915,10 +950,32 @@
     imagepath = imagepath + '.dmg'
 
     os.mkdir(outdir)
-    runCommand("hdiutil create -volname 'Universal MacPython %s' -srcfolder %s %s"%(
-            getFullVersion(),
+    volname='Python %s'%(getFullVersion())
+    runCommand("hdiutil create -format UDRW -volname %s -srcfolder %s %s"%(
+            shellQuote(volname),
             shellQuote(os.path.join(WORKDIR, 'installer')),
-            shellQuote(imagepath)))
+            shellQuote(imagepath + ".tmp.dmg" )))
+
+
+    if not os.path.exists(os.path.join(WORKDIR, "mnt")):
+        os.mkdir(os.path.join(WORKDIR, "mnt"))
+    runCommand("hdiutil attach %s -mountroot %s"%(
+        shellQuote(imagepath + ".tmp.dmg"), shellQuote(os.path.join(WORKDIR, "mnt"))))
+
+    # Custom icon for the DMG, shown when the DMG is mounted.
+    shutil.copy("../Icons/Disk Image.icns",
+            os.path.join(WORKDIR, "mnt", volname, ".VolumeIcon.icns"))
+    runCommand("/Developer/Tools/SetFile -a C %s/"%(
+            shellQuote(os.path.join(WORKDIR, "mnt", volname)),))
+
+    runCommand("hdiutil detach %s"%(shellQuote(os.path.join(WORKDIR, "mnt", volname))))
+
+    setIcon(imagepath + ".tmp.dmg", "../Icons/Disk Image.icns")
+    runCommand("hdiutil convert %s -format UDZO -o %s"%(
+            shellQuote(imagepath + ".tmp.dmg"), shellQuote(imagepath)))
+    setIcon(imagepath, "../Icons/Disk Image.icns")
+
+    os.unlink(imagepath + ".tmp.dmg")
 
     return imagepath
 
@@ -946,7 +1003,7 @@
     parseOptions()
     checkEnvironment()
 
-    os.environ['MACOSX_DEPLOYMENT_TARGET'] = '10.3'
+    os.environ['MACOSX_DEPLOYMENT_TARGET'] = DEPTARGET
 
     if os.path.exists(WORKDIR):
         shutil.rmtree(WORKDIR)
@@ -982,13 +1039,6 @@
     print >> fp, "# By:", pwd.getpwuid(os.getuid()).pw_gecos
     fp.close()
 
-    # Custom icon for the DMG, shown when the DMG is mounted.
-    # XXX: Code is diabled because it doesn't actually work :-(
-#    shutil.copy("../Icons/Disk Image.icns",
-#            os.path.join(WORKDIR, "installer", ".VolumeIcon.icns"))
-#    os.system("/Developer/Tools/SetFile -a C %s"%(
-#            os.path.join(WORKDIR, "installer", ".VolumeIcon.icns")))
-    setIcon(os.path.join(WORKDIR, "installer"), "../Icons/Disk Image.icns")
 
 
     # And copy it to a DMG
