diff --git a/completion/available/defaults.completion.bash b/completion/available/defaults.completion.bash
new file mode 100644
index 0000000..5a8d034
--- /dev/null
+++ b/completion/available/defaults.completion.bash
@@ -0,0 +1,175 @@
+# defaults
+# Bash command line completion for defaults
+#
+# Created by Jonathon Mah on 2006-11-08.
+# Copyright 2006 Playhaus. All rights reserved.
+#
+# Version 1.0 (2006-11-08)
+
+
+_defaults_domains()
+{
+    local cur
+    COMPREPLY=()
+    cur=${COMP_WORDS[COMP_CWORD]}
+
+	local domains=$( defaults domains | sed -e 's/, /:/g' | tr : '\n' | sed -e 's/ /\\ /g' | grep -i "^$cur" )
+	local IFS=$'\n'
+	COMPREPLY=( $domains )
+	if [[ $( echo '-app' | grep "^$cur" ) ]]; then
+		COMPREPLY[${#COMPREPLY[@]}]="-app"
+	fi
+
+    return 0
+}
+
+
+_defaults()
+{
+	local cur prev host_opts cmds cmd domain keys key_index
+    cur=${COMP_WORDS[COMP_CWORD]}
+    prev=${COMP_WORDS[COMP_CWORD-1]}
+
+	host_opts='-currentHost -host'
+	cmds='read read-type write rename delete domains find help'
+
+	if [[ $COMP_CWORD -eq 1 ]]; then
+		COMPREPLY=( $( compgen -W "$host_opts $cmds" -- $cur ) )
+		return 0
+	elif [[ $COMP_CWORD -eq 2 ]]; then
+		if [[ "$prev" == "-currentHost" ]]; then
+			COMPREPLY=( $( compgen -W "$cmds" -- $cur ) )
+			return 0
+		elif [[ "$prev" == "-host" ]]; then
+			return 0
+			_known_hosts -a
+		else
+			_defaults_domains
+			return 0
+		fi
+	elif [[ $COMP_CWORD -eq 3 ]]; then
+		if [[ ${COMP_WORDS[1]} == "-host" ]]; then
+			_defaults_domains
+			return 0
+		fi
+    fi
+
+	# Both a domain and command have been specified
+
+	if [[ ${COMP_WORDS[1]} == [${cmds// /|}] ]]; then
+		cmd=${COMP_WORDS[1]}
+		domain=${COMP_WORDS[2]}
+		key_index=3
+		if [[ "$domain" == "-app" ]]; then
+			if [[ $COMP_CWORD -eq 3 ]]; then
+				# Completing application name. Can't help here, sorry
+				return 0
+			fi
+			domain="-app ${COMP_WORDS[3]}"
+			key_index=4
+		fi
+	elif [[ ${COMP_WORDS[2]} == "-currentHost" ]] && [[ ${COMP_WORDS[2]} == [${cmds// /|}] ]]; then
+		cmd=${COMP_WORDS[2]}
+		domain=${COMP_WORDS[3]}
+		key_index=4
+		if [[ "$domain" == "-app" ]]; then
+			if [[ $COMP_CWORD -eq 4 ]]; then
+				# Completing application name. Can't help here, sorry
+				return 0
+			fi
+			domain="-app ${COMP_WORDS[4]}"
+			key_index=5
+		fi
+	elif [[ ${COMP_WORDS[3]} == "-host" ]] && [[ ${COMP_WORDS[3]} == [${cmds// /|}] ]]; then
+		cmd=${COMP_WORDS[3]}
+		domain=${COMP_WORDS[4]}
+		key_index=5
+		if [[ "$domain" == "-app" ]]; then
+			if [[ $COMP_CWORD -eq 5 ]]; then
+				# Completing application name. Can't help here, sorry
+				return 0
+			fi
+			domain="-app ${COMP_WORDS[5]}"
+			key_index=6
+		fi
+	fi
+
+	keys=$( defaults read $domain 2>/dev/null | sed -n -e '/^    [^}) ]/p' | sed -e 's/^    \([^" ]\{1,\}\) = .*$/\1/g' -e 's/^    "\([^"]\{1,\}\)" = .*$/\1/g' | sed -e 's/ /\\ /g' )
+
+	case $cmd in
+	read|read-type)
+		# Complete key
+		local IFS=$'\n'
+		COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) )
+		;;
+	write)
+		if [[ $key_index -eq $COMP_CWORD ]]; then
+			# Complete key
+			local IFS=$'\n'
+			COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) )
+		elif [[ $((key_index+1)) -eq $COMP_CWORD ]]; then
+			# Complete value type
+			# Unfortunately ${COMP_WORDS[key_index]} fails on keys with spaces
+			local value_types='-string -data -integer -float -boolean -date -array -array-add -dict -dict-add'
+			local cur_type=$( defaults read-type $domain ${COMP_WORDS[key_index]} 2>/dev/null | sed -e 's/^Type is \(.*\)/-\1/' -e's/dictionary/dict/' | grep "^$cur" )
+			if [[ $cur_type ]]; then
+				COMPREPLY=( $cur_type )
+			else
+				COMPREPLY=( $( compgen -W "$value_types" -- $cur ) )
+			fi
+		elif [[ $((key_index+2)) -eq $COMP_CWORD ]]; then
+			# Complete value
+			# Unfortunately ${COMP_WORDS[key_index]} fails on keys with spaces
+			COMPREPLY=( $( defaults read $domain ${COMP_WORDS[key_index]} 2>/dev/null | grep -i "^${cur//\\/\\\\}" ) )
+		fi
+		;;
+	rename)
+		if [[ $key_index -eq $COMP_CWORD ]] ||
+		   [[ $((key_index+1)) -eq $COMP_CWORD ]]; then
+			# Complete source and destination keys
+			local IFS=$'\n'
+			COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) )
+		fi
+		;;
+	delete)
+		if [[ $key_index -eq $COMP_CWORD ]]; then
+			# Complete key
+			local IFS=$'\n'
+			COMPREPLY=( $( echo "$keys" | grep -i "^${cur//\\/\\\\}" ) )
+		fi
+		;;
+	esac
+
+    return 0
+}
+
+complete -F _defaults -o default defaults
+
+
+# This file is licensed under the BSD license, as follows:
+#
+# Copyright (c) 2006, Playhaus
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#
+# * Redistributions of source code must retain the above copyright notice, this
+#   list of conditions and the following disclaimer.
+# * Redistributions in binary form must reproduce the above copyright notice,
+#   this list of conditions and the following disclaimer in the documentation
+#   and/or other materials provided with the distribution.
+# * Neither the name of the Playhaus nor the names of its contributors may be
+#   used to endorse or promote products derived from this software without
+#   specific prior written permission.
+#
+# This software is provided by the copyright holders and contributors "as is"
+# and any express or implied warranties, including, but not limited to, the
+# implied warranties of merchantability and fitness for a particular purpose are
+# disclaimed. In no event shall the copyright owner or contributors be liable
+# for any direct, indirect, incidental, special, exemplary, or consequential
+# damages (including, but not limited to, procurement of substitute goods or
+# services; loss of use, data, or profits; or business interruption) however
+# caused and on any theory of liability, whether in contract, strict liability,
+# or tort (including negligence or otherwise) arising in any way out of the use
+# of this software, even if advised of the possibility of such damage.
