diff --git a/deploy/macosx/Contents/Info.plist b/deploy/macosx/Contents/Info.plist
new file mode 100644
index 0000000..23b070b
--- /dev/null
+++ b/deploy/macosx/Contents/Info.plist
@@ -0,0 +1,26 @@
+
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ updater.sh
+ CFBundleIdentifier
+ com.bit-blot.aquaria
+ CFBundleIconFile
+ aquaria.icns
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ Aqou
+ CFBundleShortVersionString
+ 1.1.3+
+ CSResourcesFileMapped
+
+ CFBundleName
+ Aquaria-opensource-updater
+
+
diff --git a/deploy/macosx/Contents/MacOS/updater.sh b/deploy/macosx/Contents/MacOS/updater.sh
new file mode 100644
index 0000000..8454e66
--- /dev/null
+++ b/deploy/macosx/Contents/MacOS/updater.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+
+hascmd() {
+ # because `which` is non-POSIX
+ type "$1" >/dev/null 2>&1
+ return $?
+}
+
+# title, text, detail
+msgbox()
+{
+
+echo "
+#-------[ $1 ]--------
+# $2
+#---------------------------------
+$3
+
+"
+if [ -n "$DISPLAY" ]; then
+ if hascmd kdialog; then
+ kdialog --error "$2\n\n$3" --title "$1" 2>/dev/null # kdialog auto-expands \n
+ elif hascmd zenity; then
+ zenity --error --title="$1" --text="$2\n\n$3" # zenity auto-expands \n
+ elif hascmd wish; then
+ echo "tk_messageBox -type ok -title \"$1\" -message \"$2\" -icon error -detail \"$3\"; exit" | wish
+ elif hascmd osascript; then # apple specific
+/usr/bin/osascript <
+
+
+
+ CFBundleDevelopmentRegion
+ English
+ CFBundleExecutable
+ aquaria
+ CFBundleIdentifier
+ com.bit-blot.aquaria
+ CFBundleIconFile
+ aquaria.icns
+ CFBundleInfoDictionaryVersion
+ 6.0
+ CFBundlePackageType
+ APPL
+ CFBundleSignature
+ Aqra
+ CFBundleShortVersionString
+ 1.1.3+
+ CSResourcesFileMapped
+
+ CFBundleName
+ Aquaria
+
+
diff --git a/deploy/macosx/files/Contents/PkgInfo b/deploy/macosx/files/Contents/PkgInfo
new file mode 100644
index 0000000..d3aed74
--- /dev/null
+++ b/deploy/macosx/files/Contents/PkgInfo
@@ -0,0 +1 @@
+APPLAqra
\ No newline at end of file
diff --git a/deploy/macosx/files/Contents/Resources/aquaria.icns b/deploy/macosx/files/Contents/Resources/aquaria.icns
new file mode 100644
index 0000000..4172f68
Binary files /dev/null and b/deploy/macosx/files/Contents/Resources/aquaria.icns differ
diff --git a/deploy/macosx/updater/main.tcl b/deploy/macosx/updater/main.tcl
new file mode 100644
index 0000000..e8a1cc5
--- /dev/null
+++ b/deploy/macosx/updater/main.tcl
@@ -0,0 +1,327 @@
+
+
+# Sorry for the bad code, but this is my first Tcl script in years...
+# and never really understood this weird language -- fg
+
+# TODO: Might fix this script for linux some day
+# (it works on linux and even windows, but creates a *.app folder as output, with the mac binaries etc
+
+package require Tcl 8.4
+package require Tk
+
+set ::OUTAPP "Aquaria-1.1.3+.app"
+
+# setup GUI
+tk appname "Aquaria updater (1.1.x -> 1.1.3+)"
+
+label .status -anchor w -height 2 -font "tkDefaultFont 10" \
+ -text "Click Start. The updater will try to find your installation.
+No files will be altered without your confirmation."
+
+label .detail -anchor nw -height 3 -font "Helvetica 10"
+button .btn -text "Start updating" -command { doUpdate }
+
+image create photo imgSplash -file "splash.gif"
+label .splash -image imgSplash
+
+bind .status [list %W configure -wraplength %w]
+bind .detail [list %W configure -wraplength %w]
+
+pack .splash -expand y
+pack .status -fill x -expand y
+pack .detail -fill x -expand y
+pack .btn -pady 15
+
+update
+wm minsize . [image width imgSplash] [winfo height .]
+wm maxsize . [image width imgSplash] [winfo height .]
+
+proc center_window {} {
+ wm withdraw .
+ update idletasks
+ set x [expr [winfo screenwidth .]/2 - [winfo reqwidth .]/2 \
+ - [winfo vrootx .]]
+ set y [expr [winfo screenheight .]/2 - [winfo reqheight .]/2 \
+ - [winfo vrooty .]]
+ wm geom . +$x+$y
+ wm deiconify .
+}
+
+# this is necessary on OSX, otherwise this pops up in the top left corner
+center_window
+# workaround for quirky window managers (see http://wiki.tcl.tk/1254)
+after idle center_window
+
+# end GUI
+
+proc msgboxCompat { type title message detail } {
+ if { [catch {
+ set ret [tk_messageBox -type $type -title $title -message $message -detail $detail]
+ }] } {
+ # no -detail on OSX <= 10.5
+ set ret [tk_messageBox -type $type -title $title -message "$message\n\n$detail"]
+ }
+ return $ret
+}
+
+proc msgboxYesNo { title message detail } {
+ set ret [msgboxCompat yesno $title $message $detail]
+ return $ret
+}
+
+proc msgboxOk { title message detail } {
+ set ret [msgboxCompat ok $title $message $detail]
+ return $ret
+}
+
+proc setstatus s {
+ .status configure -text $s
+ update
+}
+
+proc setdetail s {
+ .detail configure -text $s
+ update
+}
+
+proc getVendor path {
+ if { [isAmbrosia $path] } {
+ return "Ambrosia software \[Mac\]"
+ }
+ if { [file exists "$path/Contents/MacOS/aquaria"]
+ && [file exists "$path/Contents/MacOS/libSDL-1.2.0.dylib"]
+ && [file isdirectory "$path/ambrosia"]
+ } {
+ return "HiB \[Mac\]"
+ }
+ if { [file exists "$path/Aquaria.exe"]
+ && [file exists "$path/AQConfig.exe"]
+ && [file exists "$path/fmodex.dll"]
+ } {
+ return "Plimus/HiB \[Win32\]"
+ }
+ if { [file exists "$path/libSDL-1.2.so.0"] } {
+ return "HiB \[Linux\]"
+ }
+
+ return "Opensource/Unknown"
+}
+
+proc useThatDir path {
+ set detail "$path
+
+(Vendor: [getVendor $path])
+
+Use it to create the updated version? Select \"No\" to continue searching for another one.
+
+The original application will not be changed, and will still be usable afterwards."
+
+ set answer [msgboxYesNo "Question" "Found Aquaria app:" $detail]
+ return [string equal $answer "yes"]
+}
+
+proc checkSubdirs { path } {
+ set need {data gfx mus scripts sfx vox}
+ foreach i $need {
+ if { ! [file isdirectory [file normalize "$path/$i"]] } {
+ return 0
+ }
+ }
+ return 1
+}
+
+proc checkExe path {
+ if { [file isfile "$path/Contents/MacOS/aquaria"]
+ || [file isfile "$path/Contents/MacOS/Aquaria"]
+ || [file isfile "$path/Aquaria.exe"]
+ || [file isfile "$path/aquaria"]
+ } {
+ return 1
+ }
+ return 0
+}
+
+proc isAquariaApp path {
+ if { [checkExe $path] } {
+ if { [checkSubdirs $path] } {
+ return 1
+ }
+ if { [isAmbrosia $path] } {
+ if { [checkSubdirs "$path/Contents/Resources"] } {
+ return 1
+ }
+ }
+ }
+ return 0
+}
+
+proc suitable { path } {
+ if { [isAquariaApp $path] } {
+ return [useThatDir $path]
+ }
+ return 0
+}
+
+proc findInstall { basedir } {
+ return [findInstallRec $basedir 0]
+}
+
+set ::IGNOREPATHS {"/System" "/Developer" "/Library" "/dev" "/proc" "/net"}
+proc checkableEntry name {
+ if { [lsearch $::IGNOREPATHS $name] >= 0 } {
+ return 0
+ }
+ if { ! [file exists $name] } {
+ return 0
+ }
+ if { [string equal [file type $name] "link"] } {
+ return 0
+ }
+ # no -hidden on OSX <= 10.5
+ catch {
+ if { [file attributes $name -hidden] } {
+ return 0
+ }
+ }
+ return 1
+}
+
+proc filter {list script} {
+ set res {}
+ foreach e $list {if {[uplevel 1 [list $script $e]]} {lappend res $e}}
+ set res
+ }
+
+proc findInstallRec { basedir nest } {
+
+ #puts "\[$nest\] $basedir"
+
+ # prevent stack overflow due to bad symlinks
+ if { $nest > 15 } {
+ return {}
+ }
+
+ # do not recurse into apps
+ if { [string match "*.app*" $basedir] } {
+ return {}
+ }
+
+ # Fix the directory name, this ensures the directory name is in the
+ # native format for the platform and contains a final directory seperator
+ set basedir [string trimright [file join [file normalize $basedir] { }]]
+
+ setdetail $basedir
+ set dirs [lsort [filter [glob -nocomplain -type {d r} -path $basedir *] checkableEntry]]
+
+ foreach dn $dirs {
+ if { [suitable $dn] } {
+ return $dn
+ }
+ }
+
+ foreach dn $dirs {
+ set ret [findInstallRec $dn [expr $nest + 1]]
+ if { [string length $ret] > 0 } {
+ return $ret
+ }
+ }
+
+ return {}
+}
+
+# because [file copy] is wimpy and fails for read-protected mac metadata
+proc copyFilesHarder { src dst } {
+
+ set src "[file normalize $src]/"
+ set dst "[file normalize $dst]/"
+
+ # just in case
+ if { ! [file isdirectory $dst] } {
+ file mkdir $dst
+ }
+
+ set files [lsort [glob -nocomplain -type {f r d} -path $src *]]
+
+ # copy files
+ foreach f $files {
+ set t [file tail $f]
+ if { [file isdirectory $f] } {
+ copyFilesHarder $f "$dst/$t"
+ } else {
+ # do not copy file if it already exists in the same location. note that $dst has a trailing / here.
+ if { ! [string equal $f "$dst$t"] } {
+ setdetail $t
+ file copy -force $f $dst
+ }
+ }
+ }
+}
+
+proc doUpdate {} {
+ .btn configure -state disabled -text "Working..."
+ setstatus "Searching for Aquaria application..."
+ set app [findInstall "/"]
+
+ if { [string length $app] > 0 } {
+ set target "[file dirname $app]/$::OUTAPP"
+ file mkdir $target
+ copyBaseFiles $app $target
+ copyUpdateFiles $target
+ copyUserFiles
+ file attributes "$target/Contents/MacOS/aquaria" -permissions "+x"
+
+ set answer [msgboxYesNo "Question" "Finished! The newly built app is located at:" "$target\n\nDo you want to start it now?"]
+ if { [string equal $answer yes] } {
+ doLaunch $target
+ }
+ exit 0
+
+
+ } else {
+ msgboxOk "Nope." "Nothing found!" \
+ "Sorry, but this updater was unable to find a complete Aquaria installation. You can still update manually, though."
+ exit 1
+ }
+}
+
+proc isAmbrosia path {
+ # this does not exist in the HiB version
+ return [file isdirectory [file normalize "$path/Contents/Frameworks/AmbrosiaTools.framework"]]
+}
+
+proc copyBaseFiles { from to } {
+ setstatus "Copying files from old application... This may take a while."
+
+ # all except scripts
+ set fl {data gfx mus sfx vox Contents}
+
+ if { [isAmbrosia $from] } {
+ foreach f $fl {
+ copyFilesHarder "$from/Contents/Resources/$f" "$to/$f"
+ }
+ } else {
+ foreach f $fl {
+ copyFilesHarder "$from/$f" "$to/$f"
+ }
+ }
+}
+
+proc copyUpdateFiles { to } {
+
+ setstatus "Copying updated game files..."
+ copyFilesHarder "../files/" $to
+}
+
+proc copyUserFiles {} {
+ set udir "~/Library/Application Support/Aquaria"
+
+ setstatus "Copying updated user files..."
+ copyFilesHarder "../user/" $udir
+}
+
+proc doLaunch app {
+ cd $app
+ exec [file nativename "Contents/MacOS/aquaria"] &
+ exit 0
+}
+
diff --git a/deploy/macosx/updater/splash.gif b/deploy/macosx/updater/splash.gif
new file mode 100644
index 0000000..f2e1e24
Binary files /dev/null and b/deploy/macosx/updater/splash.gif differ