diff --git a/Distribution/MacOSX.hs b/Distribution/MacOSX.hs
--- a/Distribution/MacOSX.hs
+++ b/Distribution/MacOSX.hs
@@ -18,6 +18,7 @@
 module Distribution.MacOSX (
   appBundleBuildHook,
   appBundleInstallHook,
+  appBundleCopyHook,
   makeAppBundle,
   MacApp(..),
   ChaseDeps(..),
@@ -41,9 +42,9 @@
 import Distribution.Simple
 import Distribution.Simple.InstallDirs (bindir, prefix, CopyDest(NoCopyDest))
 import Distribution.Simple.LocalBuildInfo (absoluteInstallDirs, LocalBuildInfo(..))
-import Distribution.Simple.Setup (BuildFlags, InstallFlags, fromFlagOrDefault, installVerbosity)
+import Distribution.Simple.Setup (BuildFlags, InstallFlags, CopyFlags, fromFlagOrDefault, installVerbosity, copyVerbosity)
 import Distribution.Simple.Utils (installDirectoryContents, installExecutableFile)
-import Distribution.Verbosity (normal)
+import Distribution.Verbosity (normal, Verbosity)
 
 import Distribution.MacOSX.Internal
 import Distribution.MacOSX.AppBuildInfo
@@ -77,8 +78,35 @@
   -> Args -- ^ All other parameters as per
           -- 'Distribution.Simple.postInstall'.
   -> InstallFlags -> PackageDescription -> LocalBuildInfo -> IO ()
-appBundleInstallHook apps _ iflags pkg localb = when isMacOS $ do
-  let verbosity = fromFlagOrDefault normal (installVerbosity iflags)
+appBundleInstallHook apps _ iflags =
+	appBundleInstallOrCopyHook apps
+	    (fromFlagOrDefault normal (installVerbosity iflags))
+{-# DEPRECATED appBundleInstallHook "Use appBundleCopyHook instead" #-}
+
+-- | Post-copy hook for OS X application bundles.  Copies the
+-- application bundle (assuming you are also using the appBundleBuildHook)
+-- to @$prefix/Applications@
+-- Does nothing if called on another O/S.
+-- Use this instead of appBundleInstallHook (do not hook
+-- both postInst and postCopy).
+appBundleCopyHook ::
+  [MacApp] -- ^ List of applications to build; if empty, an
+           -- application is built for each executable in the package,
+           -- with no icon or plist, and no dependency-chasing.
+  -> Args -- ^ All other parameters as per
+          -- 'Distribution.Simple.postCopy'.
+  -> CopyFlags -> PackageDescription -> LocalBuildInfo -> IO ()
+appBundleCopyHook apps _ cflags =
+	appBundleInstallOrCopyHook apps
+	    (fromFlagOrDefault normal (copyVerbosity cflags))
+
+appBundleInstallOrCopyHook ::
+  [MacApp] -- ^ List of applications to build; if empty, an
+           -- application is built for each executable in the package,
+           -- with no icon or plist, and no dependency-chasing.
+  -> Verbosity
+  -> PackageDescription -> LocalBuildInfo -> IO ()
+appBundleInstallOrCopyHook apps verbosity pkg localb = when isMacOS $ do
   libraryHaskell  <- flip fmap getHomeDirectory $ (</> "Library/Haskell")
   let standardPrefix = (libraryHaskell ++ "/") `isPrefixOf` prefix installDir
   let applicationsDir = if standardPrefix
diff --git a/Distribution/MacOSX/Dependencies.hs b/Distribution/MacOSX/Dependencies.hs
--- a/Distribution/MacOSX/Dependencies.hs
+++ b/Distribution/MacOSX/Dependencies.hs
@@ -213,10 +213,17 @@
 updateDependency appPath app src tgt =
   do putStrLn $ "Updating " ++ newLib ++ "'s dependency on " ++ tgt ++
                    " to " ++ tgt'
+     -- Ensure we have write permissions while editing the library. Notably,
+     -- Homebrew removes write permissions from installed files.
+     perm <- getPermissions newLib
+     setPermissions newLib perm { writable = True }
      let cmd = iTool ++ " -change " ++ show tgt ++ " " ++ show tgt' ++
                    " " ++ show newLib
-     --putStrLn cmd
-     ExitSuccess <- system cmd
+     exitCode <- system cmd
+     setPermissions newLib perm
+     when (exitCode /= ExitSuccess) $
+       error $ "Failed to update library dependencies on " ++ show newLib ++
+        " with command: " ++ cmd
      return ()
   where tgt' = "@executable_path/../Frameworks/" </> makeRelative "/" tgt
         newLib = appPath </> pathInApp app src
diff --git a/Distribution/MacOSX/Internal.hs b/Distribution/MacOSX/Internal.hs
--- a/Distribution/MacOSX/Internal.hs
+++ b/Distribution/MacOSX/Internal.hs
@@ -56,32 +56,5 @@
   FilePath -- ^ Path to application bundle root.
   -> MacApp -> IO ()
 osxIncantations appPath app =
-  do dtools <- developerTools
-     runCommand $ dtools </> "Rez Carbon.r -o " ++ appPath </> pathInApp app (appName app)
-     writeFile (appPath </> "PkgInfo") "APPL????"
-     runCommand $ dtools </> "SetFile -a C " ++ appPath </> "Contents" -- Tell Finder about the icon.
+  do writeFile (appPath </> "PkgInfo") "APPL????"
      return ()
-
-runCommand :: String -> IO ()
-runCommand commandExec =
-  do putStrLn $ "Running: " ++ commandExec
-     exitValue <- system commandExec
-     case exitValue of
-        ExitSuccess -> return ()
-        _ -> do putStrLn $ "Warning - Could not run the command \""
-                           ++ commandExec ++ "\". Please check your local `XCode` configuration."
-                exitFailure
-
--- | Path to the developer tools directory, if one exists
-developerTools :: IO FilePath
-developerTools =
-   do ds <- filterM doesDirectoryExist cands
-      case ds of
-        [] -> do putStrLn $ "Can't find the developer tools directory. Have you installed the Developer tools?\n"
-                            ++ "I tried looking for:\n" ++ unlines (map ("* " ++) cands)
-                 exitWith (ExitFailure 1)
-        (d:_) -> return d
-  where
-    cands = [ "/Applications/XCode.app/Contents/Developer/Tools"
-            , "/Developer/Tools"
-            ]
diff --git a/cabal-macosx.cabal b/cabal-macosx.cabal
--- a/cabal-macosx.cabal
+++ b/cabal-macosx.cabal
@@ -1,5 +1,5 @@
 Name:                   cabal-macosx
-Version:                0.2.3.5
+Version:                0.2.4.0
 Stability:              Alpha
 Synopsis:               Cabal support for creating Mac OSX application bundles.
 Description:
diff --git a/tests/Distribution/MacOSX/Internal/Tests.hs b/tests/Distribution/MacOSX/Internal/Tests.hs
--- a/tests/Distribution/MacOSX/Internal/Tests.hs
+++ b/tests/Distribution/MacOSX/Internal/Tests.hs
@@ -1,21 +1,18 @@
 module Distribution.MacOSX.Internal.Tests where
 
-import System.IO.Temp (withSystemTempDirectory)
-import Control.Exception (SomeException, catch)
 import Prelude hiding (catch)
 import Test.HUnit (Assertion, assertEqual)
 import Test.Framework (Test, mutuallyExclusive, testGroup)
 import Test.Framework.Providers.HUnit (testCase)
 import Distribution.PackageDescription (BuildInfo(..), Executable(..), emptyBuildInfo)
 
-import Distribution.MacOSX.Internal (osxIncantations, getMacAppsForBuildableExecutors)
+import Distribution.MacOSX.Internal (getMacAppsForBuildableExecutors)
 import Distribution.MacOSX.Common
 
 macosxInternalTests :: Test
 macosxInternalTests = testGroup "Distribution.MacOSX.Internal"
     [ mutuallyExclusive $ testGroup "MacOSX Internal"
-        [ testCase "should exit with an exit-failure as Xcode's Carbon Tools fail to run" testCarbonTools,
-          -- I should consider to use QuickCheck maybe... :)
+        [ -- I should consider to use QuickCheck maybe... :)
           testCase "given nothing then should not try to build any mac-app" testBuildMacApp_noInput,
           testCase "given no executables then should not try to build any mac-app" testBuildMacApp_noExecutables,
           testCase "given only two executables then should try to build two mac-apps" testBuildMacApp_twoBuildableExecutables,
@@ -23,15 +20,6 @@
           testCase "given two executables and one not executable and two apps then should try to build one mac-app" testBuildMacApp_twoAppsAndTwoExecutablesOneBuildableOneNot
         ]
     ]
-
-testCarbonTools :: Assertion
-testCarbonTools = do
-    let macApp = MacApp "DummyApp" Nothing Nothing [] [] DoNotChase
-
-    withSystemTempDirectory "DummyAppPath" $ \tmpDir
-        -> osxIncantations tmpDir macApp -- some problems here to add `assertFailure` after
-             `catch`
-                 (\e -> putStrLn $ "Catched: " ++ show (e :: SomeException))
 
 testBuildMacApp_noInput :: Assertion
 testBuildMacApp_noInput = do
