diff --git a/.gitignore b/.gitignore
index 496ee2c..54f7202 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,3 @@
-.DS_Store
\ No newline at end of file
+.DS_Store
+custom/*.bash
+!custom/example.bash
\ No newline at end of file
diff --git a/README.md b/README.md
index ce08ef5..5da8b12 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
 # Bash it
 
-Bash it is a mash up of my own bash commands and scripts, other bash stuff I have found and a shameless ripoff of oh-my-zsh. :) 
+'Bash it' is a mash up of my own bash commands and scripts, other bash stuff I have found and a shameless ripoff of oh-my-zsh. :) 
 
 From what I remember, I've incorporated things I have found from the following:
 
@@ -11,19 +11,19 @@
 
 ## Install
 
-Check a clone of this repo. You can view what a sample ~/.bash\_profile looks like in template/bash\_profile.bash-template. If you wanted to use that template, make sure to make a backup of your current ~/.bash\_profile file.
+Check a clone of this repo. You can view what a sample ~/.bash\_profile looks like in template/bash\_profile.template.bash. If you wanted to use that template, make sure to make a backup of your current ~/.bash\_profile file.
 
 <pre><code>
 git clone http://github.com/revans/bash-it.git
 
 cp ~/.bash_profile ~/.bash_profile_original
-cp template/bash_profile.bash-template ~/.bash_profile
+cp template/bash_profile.template.bash ~/.bash_profile
 </code></pre>
 
 ## Themes
 
-Currently, there is only 1 theme, bobby. There is a base.bash that includes various colors that can then be used to create custom themes. There is support for git in the prompt: showing what branch you're on, if you've committed locally or not, etc. I'm working on adding mercurial support as well.
+Currently, there is only 1 theme, 'bobby'. There is a base.theme.bash that includes various colors that can then be used to create custom themes. There is support for git in the prompt: showing what branch you're on, if you've committed locally or not, etc. I'm working on adding mercurial support as well.
 
 ## Help out!
 
-Just like oh-my-zsh, bash it is meant for the community. If you have things to add, want to add a theme, etc. please fork this project and send me a pull request.
\ No newline at end of file
+Just like oh-my-zsh, 'bash it' is meant for the community. If you have things to add, want to add a theme, etc. please fork this project and send me a pull request.
\ No newline at end of file
diff --git a/bash_it.sh b/bash_it.sh
index 0aba05f..c74668c 100644
--- a/bash_it.sh
+++ b/bash_it.sh
@@ -20,7 +20,7 @@
   source $config_file
 done
 
-
+unset config_file
 # Plugins
 PLUGINS="${BASH}/plugins/*.bash"
 for config_file in $PLUGINS
@@ -47,4 +47,18 @@
 for config_file in $CUSTOM
 do
   source $config_file
-done
\ No newline at end of file
+done
+
+
+#
+# Custom Help
+
+function bash-it() {
+  echo "Welcome to Bash It!"
+  echo
+  echo "Here is a list of commands you can use to get help screens for specific pieces of Bash it:"
+  echo
+  echo "  rails-help                  This will list out all the aliases you can use with rails."
+  echo "  git-help                    This will list out all the aliases you can use with git."
+  echo
+}
\ No newline at end of file
diff --git a/completion/git.bash b/completion/git.bash
deleted file mode 100644
index 35dbf04..0000000
--- a/completion/git.bash
+++ /dev/null
@@ -1,1817 +0,0 @@
-#!bash
-#
-# bash completion support for core Git.
-#
-# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
-# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
-# Distributed under the GNU General Public License, version 2.0.
-#
-# The contained completion routines provide support for completing:
-#
-#    *) local and remote branch names
-#    *) local and remote tag names
-#    *) .git/remotes file names
-#    *) git 'subcommands'
-#    *) tree paths within 'ref:path/to/file' expressions
-#    *) common --long-options
-#
-# To use these routines:
-#
-#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
-#    2) Added the following line to your .bashrc:
-#        source ~/.git-completion.sh
-#
-#    3) You may want to make sure the git executable is available
-#       in your PATH before this script is sourced, as some caching
-#       is performed while the script loads.  If git isn't found
-#       at source time then all lookups will be done on demand,
-#       which may be slightly slower.
-#
-#    4) Consider changing your PS1 to also show the current branch:
-#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
-#
-#       The argument to __git_ps1 will be displayed only if you
-#       are currently in a git repository.  The %s token will be
-#       the name of the current branch.
-#
-#	In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
-#	value, unstaged (*) and staged (+) changes will be shown next
-#	to the branch name.  You can configure this per-repository
-#	with the bash.showDirtyState variable, which defaults to true
-#	once GIT_PS1_SHOWDIRTYSTATE is enabled.
-#
-# To submit patches:
-#
-#    *) Read Documentation/SubmittingPatches
-#    *) Send all patches to the current maintainer:
-#
-#       "Shawn O. Pearce" <spearce@spearce.org>
-#
-#    *) Always CC the Git mailing list:
-#
-#       git@vger.kernel.org
-#
-
-case "$COMP_WORDBREAKS" in
-*:*) : great ;;
-*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
-esac
-
-# __gitdir accepts 0 or 1 arguments (i.e., location)
-# returns location of .git repo
-__gitdir ()
-{
-	if [ -z "${1-}" ]; then
-		if [ -n "$__git_dir" ]; then
-			echo "$__git_dir"
-		elif [ -d .git ]; then
-			echo .git
-		else
-			git rev-parse --git-dir 2>/dev/null
-		fi
-	elif [ -d "$1/.git" ]; then
-		echo "$1/.git"
-	else
-		echo "$1"
-	fi
-}
-
-# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
-# returns text to add to bash PS1 prompt (includes branch name)
-__git_ps1 ()
-{
-	local g="$(git rev-parse --git-dir 2>/dev/null)"
-	if [ -n "$g" ]; then
-		local r
-		local b
-		if [ -d "$g/rebase-apply" ]
-		then
-			if test -f "$g/rebase-apply/rebasing"
-			then
-				r="|REBASE"
-			elif test -f "$g/rebase-apply/applying"
-			then
-				r="|AM"
-			else
-				r="|AM/REBASE"
-			fi
-			b="$(git symbolic-ref HEAD 2>/dev/null)"
-		elif [ -f "$g/rebase-merge/interactive" ]
-		then
-			r="|REBASE-i"
-			b="$(cat "$g/rebase-merge/head-name")"
-		elif [ -d "$g/rebase-merge" ]
-		then
-			r="|REBASE-m"
-			b="$(cat "$g/rebase-merge/head-name")"
-		elif [ -f "$g/MERGE_HEAD" ]
-		then
-			r="|MERGING"
-			b="$(git symbolic-ref HEAD 2>/dev/null)"
-		else
-			if [ -f "$g/BISECT_LOG" ]
-			then
-				r="|BISECTING"
-			fi
-			if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
-			then
-				if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
-				then
-					b="$(cut -c1-7 "$g/HEAD")..."
-				fi
-			fi
-		fi
-
-		local w
-		local i
-
-		if test -n "$GIT_PS1_SHOWDIRTYSTATE"; then
-			if test "$(git config --bool bash.showDirtyState)" != "false"; then
-				git diff --no-ext-diff --ignore-submodules \
-					--quiet --exit-code || w="*"
-				if git rev-parse --quiet --verify HEAD >/dev/null; then
-					git diff-index --cached --quiet \
-						--ignore-submodules HEAD -- || i="+"
-				else
-					i="#"
-				fi
-			fi
-		fi
-
-		if [ -n "${1-}" ]; then
-			printf "$1" "${b##refs/heads/}$w$i$r"
-		else
-			printf " (%s)" "${b##refs/heads/}$w$i$r"
-		fi
-	fi
-}
-
-# __gitcomp_1 requires 2 arguments
-__gitcomp_1 ()
-{
-	local c IFS=' '$'\t'$'\n'
-	for c in $1; do
-		case "$c$2" in
-		--*=*) printf %s$'\n' "$c$2" ;;
-		*.)    printf %s$'\n' "$c$2" ;;
-		*)     printf %s$'\n' "$c$2 " ;;
-		esac
-	done
-}
-
-# __gitcomp accepts 1, 2, 3, or 4 arguments
-# generates completion reply with compgen
-__gitcomp ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	if [ $# -gt 2 ]; then
-		cur="$3"
-	fi
-	case "$cur" in
-	--*=)
-		COMPREPLY=()
-		;;
-	*)
-		local IFS=$'\n'
-		COMPREPLY=($(compgen -P "${2-}" \
-			-W "$(__gitcomp_1 "${1-}" "${4-}")" \
-			-- "$cur"))
-		;;
-	esac
-}
-
-# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
-__git_heads ()
-{
-	local cmd i is_hash=y dir="$(__gitdir "${1-}")"
-	if [ -d "$dir" ]; then
-		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-			refs/heads
-		return
-	fi
-	for i in $(git ls-remote "${1-}" 2>/dev/null); do
-		case "$is_hash,$i" in
-		y,*) is_hash=n ;;
-		n,*^{}) is_hash=y ;;
-		n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
-		n,*) is_hash=y; echo "$i" ;;
-		esac
-	done
-}
-
-# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
-__git_tags ()
-{
-	local cmd i is_hash=y dir="$(__gitdir "${1-}")"
-	if [ -d "$dir" ]; then
-		git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
-			refs/tags
-		return
-	fi
-	for i in $(git ls-remote "${1-}" 2>/dev/null); do
-		case "$is_hash,$i" in
-		y,*) is_hash=n ;;
-		n,*^{}) is_hash=y ;;
-		n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
-		n,*) is_hash=y; echo "$i" ;;
-		esac
-	done
-}
-
-# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
-__git_refs ()
-{
-	local i is_hash=y dir="$(__gitdir "${1-}")"
-	local cur="${COMP_WORDS[COMP_CWORD]}" format refs
-	if [ -d "$dir" ]; then
-		case "$cur" in
-		refs|refs/*)
-			format="refname"
-			refs="${cur%/*}"
-			;;
-		*)
-			if [ -e "$dir/HEAD" ]; then echo HEAD; fi
-			format="refname:short"
-			refs="refs/tags refs/heads refs/remotes"
-			;;
-		esac
-		git --git-dir="$dir" for-each-ref --format="%($format)" \
-			$refs
-		return
-	fi
-	for i in $(git ls-remote "$dir" 2>/dev/null); do
-		case "$is_hash,$i" in
-		y,*) is_hash=n ;;
-		n,*^{}) is_hash=y ;;
-		n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
-		n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
-		n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
-		n,*) is_hash=y; echo "$i" ;;
-		esac
-	done
-}
-
-# __git_refs2 requires 1 argument (to pass to __git_refs)
-__git_refs2 ()
-{
-	local i
-	for i in $(__git_refs "$1"); do
-		echo "$i:$i"
-	done
-}
-
-# __git_refs_remotes requires 1 argument (to pass to ls-remote)
-__git_refs_remotes ()
-{
-	local cmd i is_hash=y
-	for i in $(git ls-remote "$1" 2>/dev/null); do
-		case "$is_hash,$i" in
-		n,refs/heads/*)
-			is_hash=y
-			echo "$i:refs/remotes/$1/${i#refs/heads/}"
-			;;
-		y,*) is_hash=n ;;
-		n,*^{}) is_hash=y ;;
-		n,refs/tags/*) is_hash=y;;
-		n,*) is_hash=y; ;;
-		esac
-	done
-}
-
-__git_remotes ()
-{
-	local i ngoff IFS=$'\n' d="$(__gitdir)"
-	shopt -q nullglob || ngoff=1
-	shopt -s nullglob
-	for i in "$d/remotes"/*; do
-		echo ${i#$d/remotes/}
-	done
-	[ "$ngoff" ] && shopt -u nullglob
-	for i in $(git --git-dir="$d" config --list); do
-		case "$i" in
-		remote.*.url=*)
-			i="${i#remote.}"
-			echo "${i/.url=*/}"
-			;;
-		esac
-	done
-}
-
-__git_merge_strategies ()
-{
-	if [ -n "$__git_merge_strategylist" ]; then
-		echo "$__git_merge_strategylist"
-		return
-	fi
-	git merge -s help 2>&1 |
-	sed -n -e '/[Aa]vailable strategies are: /,/^$/{
-		s/\.$//
-		s/.*://
-		s/^[ 	]*//
-		s/[ 	]*$//
-		p
-	}'
-}
-__git_merge_strategylist=
-__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
-
-__git_complete_file ()
-{
-	local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	?*:*)
-		ref="${cur%%:*}"
-		cur="${cur#*:}"
-		case "$cur" in
-		?*/*)
-			pfx="${cur%/*}"
-			cur="${cur##*/}"
-			ls="$ref:$pfx"
-			pfx="$pfx/"
-			;;
-		*)
-			ls="$ref"
-			;;
-	    esac
-
-		case "$COMP_WORDBREAKS" in
-		*:*) : great ;;
-		*)   pfx="$ref:$pfx" ;;
-		esac
-
-		local IFS=$'\n'
-		COMPREPLY=($(compgen -P "$pfx" \
-			-W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
-				| sed '/^100... blob /{
-				           s,^.*	,,
-				           s,$, ,
-				       }
-				       /^120000 blob /{
-				           s,^.*	,,
-				           s,$, ,
-				       }
-				       /^040000 tree /{
-				           s,^.*	,,
-				           s,$,/,
-				       }
-				       s/^.*	//')" \
-			-- "$cur"))
-		;;
-	*)
-		__gitcomp "$(__git_refs)"
-		;;
-	esac
-}
-
-__git_complete_revlist ()
-{
-	local pfx cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	*...*)
-		pfx="${cur%...*}..."
-		cur="${cur#*...}"
-		__gitcomp "$(__git_refs)" "$pfx" "$cur"
-		;;
-	*..*)
-		pfx="${cur%..*}.."
-		cur="${cur#*..}"
-		__gitcomp "$(__git_refs)" "$pfx" "$cur"
-		;;
-	*)
-		__gitcomp "$(__git_refs)"
-		;;
-	esac
-}
-
-__git_all_commands ()
-{
-	if [ -n "$__git_all_commandlist" ]; then
-		echo "$__git_all_commandlist"
-		return
-	fi
-	local i IFS=" "$'\n'
-	for i in $(git help -a|egrep '^ ')
-	do
-		case $i in
-		*--*)             : helper pattern;;
-		*) echo $i;;
-		esac
-	done
-}
-__git_all_commandlist=
-__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
-
-__git_porcelain_commands ()
-{
-	if [ -n "$__git_porcelain_commandlist" ]; then
-		echo "$__git_porcelain_commandlist"
-		return
-	fi
-	local i IFS=" "$'\n'
-	for i in "help" $(__git_all_commands)
-	do
-		case $i in
-		*--*)             : helper pattern;;
-		applymbox)        : ask gittus;;
-		applypatch)       : ask gittus;;
-		archimport)       : import;;
-		cat-file)         : plumbing;;
-		check-attr)       : plumbing;;
-		check-ref-format) : plumbing;;
-		checkout-index)   : plumbing;;
-		commit-tree)      : plumbing;;
-		count-objects)    : infrequent;;
-		cvsexportcommit)  : export;;
-		cvsimport)        : import;;
-		cvsserver)        : daemon;;
-		daemon)           : daemon;;
-		diff-files)       : plumbing;;
-		diff-index)       : plumbing;;
-		diff-tree)        : plumbing;;
-		fast-import)      : import;;
-		fast-export)      : export;;
-		fsck-objects)     : plumbing;;
-		fetch-pack)       : plumbing;;
-		fmt-merge-msg)    : plumbing;;
-		for-each-ref)     : plumbing;;
-		hash-object)      : plumbing;;
-		http-*)           : transport;;
-		index-pack)       : plumbing;;
-		init-db)          : deprecated;;
-		local-fetch)      : plumbing;;
-		lost-found)       : infrequent;;
-		ls-files)         : plumbing;;
-		ls-remote)        : plumbing;;
-		ls-tree)          : plumbing;;
-		mailinfo)         : plumbing;;
-		mailsplit)        : plumbing;;
-		merge-*)          : plumbing;;
-		mktree)           : plumbing;;
-		mktag)            : plumbing;;
-		pack-objects)     : plumbing;;
-		pack-redundant)   : plumbing;;
-		pack-refs)        : plumbing;;
-		parse-remote)     : plumbing;;
-		patch-id)         : plumbing;;
-		peek-remote)      : plumbing;;
-		prune)            : plumbing;;
-		prune-packed)     : plumbing;;
-		quiltimport)      : import;;
-		read-tree)        : plumbing;;
-		receive-pack)     : plumbing;;
-		reflog)           : plumbing;;
-		repo-config)      : deprecated;;
-		rerere)           : plumbing;;
-		rev-list)         : plumbing;;
-		rev-parse)        : plumbing;;
-		runstatus)        : plumbing;;
-		sh-setup)         : internal;;
-		shell)            : daemon;;
-		show-ref)         : plumbing;;
-		send-pack)        : plumbing;;
-		show-index)       : plumbing;;
-		ssh-*)            : transport;;
-		stripspace)       : plumbing;;
-		symbolic-ref)     : plumbing;;
-		tar-tree)         : deprecated;;
-		unpack-file)      : plumbing;;
-		unpack-objects)   : plumbing;;
-		update-index)     : plumbing;;
-		update-ref)       : plumbing;;
-		update-server-info) : daemon;;
-		upload-archive)   : plumbing;;
-		upload-pack)      : plumbing;;
-		write-tree)       : plumbing;;
-		var)              : infrequent;;
-		verify-pack)      : infrequent;;
-		verify-tag)       : plumbing;;
-		*) echo $i;;
-		esac
-	done
-}
-__git_porcelain_commandlist=
-__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
-
-__git_aliases ()
-{
-	local i IFS=$'\n'
-	for i in $(git --git-dir="$(__gitdir)" config --list); do
-		case "$i" in
-		alias.*)
-			i="${i#alias.}"
-			echo "${i/=*/}"
-			;;
-		esac
-	done
-}
-
-# __git_aliased_command requires 1 argument
-__git_aliased_command ()
-{
-	local word cmdline=$(git --git-dir="$(__gitdir)" \
-		config --get "alias.$1")
-	for word in $cmdline; do
-		if [ "${word##-*}" ]; then
-			echo $word
-			return
-		fi
-	done
-}
-
-# __git_find_subcommand requires 1 argument
-__git_find_subcommand ()
-{
-	local word subcommand c=1
-
-	while [ $c -lt $COMP_CWORD ]; do
-		word="${COMP_WORDS[c]}"
-		for subcommand in $1; do
-			if [ "$subcommand" = "$word" ]; then
-				echo "$subcommand"
-				return
-			fi
-		done
-		c=$((++c))
-	done
-}
-
-__git_has_doubledash ()
-{
-	local c=1
-	while [ $c -lt $COMP_CWORD ]; do
-		if [ "--" = "${COMP_WORDS[c]}" ]; then
-			return 0
-		fi
-		c=$((++c))
-	done
-	return 1
-}
-
-__git_whitespacelist="nowarn warn error error-all fix"
-
-_git_am ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
-	if [ -d "$dir"/rebase-apply ]; then
-		__gitcomp "--skip --resolved --abort"
-		return
-	fi
-	case "$cur" in
-	--whitespace=*)
-		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
-		return
-		;;
-	--*)
-		__gitcomp "
-			--signoff --utf8 --binary --3way --interactive
-			--whitespace=
-			"
-		return
-	esac
-	COMPREPLY=()
-}
-
-_git_apply ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--whitespace=*)
-		__gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
-		return
-		;;
-	--*)
-		__gitcomp "
-			--stat --numstat --summary --check --index
-			--cached --index-info --reverse --reject --unidiff-zero
-			--apply --no-add --exclude=
-			--whitespace= --inaccurate-eof --verbose
-			"
-		return
-	esac
-	COMPREPLY=()
-}
-
-_git_add ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--interactive --refresh --patch --update --dry-run
-			--ignore-errors --intent-to-add
-			"
-		return
-	esac
-	COMPREPLY=()
-}
-
-_git_archive ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--format=*)
-		__gitcomp "$(git archive --list)" "" "${cur##--format=}"
-		return
-		;;
-	--remote=*)
-		__gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
-		return
-		;;
-	--*)
-		__gitcomp "
-			--format= --list --verbose
-			--prefix= --remote= --exec=
-			"
-		return
-		;;
-	esac
-	__git_complete_file
-}
-
-_git_bisect ()
-{
-	__git_has_doubledash && return
-
-	local subcommands="start bad good skip reset visualize replay log run"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-
-	case "$subcommand" in
-	bad|good|reset|skip)
-		__gitcomp "$(__git_refs)"
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-}
-
-_git_branch ()
-{
-	local i c=1 only_local_ref="n" has_r="n"
-
-	while [ $c -lt $COMP_CWORD ]; do
-		i="${COMP_WORDS[c]}"
-		case "$i" in
-		-d|-m)	only_local_ref="y" ;;
-		-r)	has_r="y" ;;
-		esac
-		c=$((++c))
-	done
-
-	case "${COMP_WORDS[COMP_CWORD]}" in
-	--*)
-		__gitcomp "
-			--color --no-color --verbose --abbrev= --no-abbrev
-			--track --no-track --contains --merged --no-merged
-			"
-		;;
-	*)
-		if [ $only_local_ref = "y" -a $has_r = "n" ]; then
-			__gitcomp "$(__git_heads)"
-		else
-			__gitcomp "$(__git_refs)"
-		fi
-		;;
-	esac
-}
-
-_git_bundle ()
-{
-	local cmd="${COMP_WORDS[2]}"
-	case "$COMP_CWORD" in
-	2)
-		__gitcomp "create list-heads verify unbundle"
-		;;
-	3)
-		# looking for a file
-		;;
-	*)
-		case "$cmd" in
-			create)
-				__git_complete_revlist
-			;;
-		esac
-		;;
-	esac
-}
-
-_git_checkout ()
-{
-	__git_has_doubledash && return
-
-	__gitcomp "$(__git_refs)"
-}
-
-_git_cherry ()
-{
-	__gitcomp "$(__git_refs)"
-}
-
-_git_cherry_pick ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--edit --no-commit"
-		;;
-	*)
-		__gitcomp "$(__git_refs)"
-		;;
-	esac
-}
-
-_git_clean ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--dry-run --quiet"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_clone ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--local
-			--no-hardlinks
-			--shared
-			--reference
-			--quiet
-			--no-checkout
-			--bare
-			--mirror
-			--origin
-			--upload-pack
-			--template=
-			--depth
-			"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_commit ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--all --author= --signoff --verify --no-verify
-			--edit --amend --include --only --interactive
-			"
-		return
-	esac
-	COMPREPLY=()
-}
-
-_git_describe ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--all --tags --contains --abbrev= --candidates=
-			--exact-match --debug --long --match --always
-			"
-		return
-	esac
-	__gitcomp "$(__git_refs)"
-}
-
-__git_diff_common_options="--stat --numstat --shortstat --summary
-			--patch-with-stat --name-only --name-status --color
-			--no-color --color-words --no-renames --check
-			--full-index --binary --abbrev --diff-filter=
-			--find-copies-harder
-			--text --ignore-space-at-eol --ignore-space-change
-			--ignore-all-space --exit-code --quiet --ext-diff
-			--no-ext-diff
-			--no-prefix --src-prefix= --dst-prefix=
-			--inter-hunk-context=
-			--patience
-			--raw
-"
-
-_git_diff ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--cached --pickaxe-all --pickaxe-regex
-			--base --ours --theirs
-			$__git_diff_common_options
-			"
-		return
-		;;
-	esac
-	__git_complete_file
-}
-
-_git_fetch ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-
-	if [ "$COMP_CWORD" = 2 ]; then
-		__gitcomp "$(__git_remotes)"
-	else
-		case "$cur" in
-		*:*)
-			local pfx=""
-			case "$COMP_WORDBREAKS" in
-			*:*) : great ;;
-			*)   pfx="${cur%%:*}:" ;;
-			esac
-			__gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
-			;;
-		*)
-			__gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
-			;;
-		esac
-	fi
-}
-
-_git_format_patch ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--stdout --attach --thread
-			--output-directory
-			--numbered --start-number
-			--numbered-files
-			--keep-subject
-			--signoff
-			--in-reply-to=
-			--full-index --binary
-			--not --all
-			--cover-letter
-			--no-prefix --src-prefix= --dst-prefix=
-			--inline --suffix= --ignore-if-in-upstream
-			--subject-prefix=
-			"
-		return
-		;;
-	esac
-	__git_complete_revlist
-}
-
-_git_gc ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--prune --aggressive"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_grep ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--cached
-			--text --ignore-case --word-regexp --invert-match
-			--full-name
-			--extended-regexp --basic-regexp --fixed-strings
-			--files-with-matches --name-only
-			--files-without-match
-			--count
-			--and --or --not --all-match
-			"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_help ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--all --info --man --web"
-		return
-		;;
-	esac
-	__gitcomp "$(__git_all_commands)
-		attributes cli core-tutorial cvs-migration
-		diffcore gitk glossary hooks ignore modules
-		repository-layout tutorial tutorial-2
-		workflows
-		"
-}
-
-_git_init ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--shared=*)
-		__gitcomp "
-			false true umask group all world everybody
-			" "" "${cur##--shared=}"
-		return
-		;;
-	--*)
-		__gitcomp "--quiet --bare --template= --shared --shared="
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_ls_files ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--cached --deleted --modified --others --ignored
-			--stage --directory --no-empty-directory --unmerged
-			--killed --exclude= --exclude-from=
-			--exclude-per-directory= --exclude-standard
-			--error-unmatch --with-tree= --full-name
-			--abbrev --ignored --exclude-per-directory
-			"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_ls_remote ()
-{
-	__gitcomp "$(__git_remotes)"
-}
-
-_git_ls_tree ()
-{
-	__git_complete_file
-}
-
-__git_log_pretty_formats="oneline short medium full fuller email raw format:"
-
-_git_log ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--pretty=*)
-		__gitcomp "$__git_log_pretty_formats
-			" "" "${cur##--pretty=}"
-		return
-		;;
-	--date=*)
-		__gitcomp "
-			relative iso8601 rfc2822 short local default
-		" "" "${cur##--date=}"
-		return
-		;;
-	--*)
-		__gitcomp "
-			--max-count= --max-age= --since= --after=
-			--min-age= --before= --until=
-			--root --topo-order --date-order --reverse
-			--no-merges --follow
-			--abbrev-commit --abbrev=
-			--relative-date --date=
-			--author= --committer= --grep=
-			--all-match
-			--pretty=
-			--not --all
-			--left-right --cherry-pick
-			--graph
-			--decorate
-			--walk-reflogs
-			--parents --children --full-history
-			--merge
-			$__git_diff_common_options
-			--pickaxe-all --pickaxe-regex
-			"
-		return
-		;;
-	esac
-	__git_complete_revlist
-}
-
-_git_merge ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "${COMP_WORDS[COMP_CWORD-1]}" in
-	-s|--strategy)
-		__gitcomp "$(__git_merge_strategies)"
-		return
-	esac
-	case "$cur" in
-	--strategy=*)
-		__gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
-		return
-		;;
-	--*)
-		__gitcomp "
-			--no-commit --no-stat --log --no-log --squash --strategy
-			"
-		return
-	esac
-	__gitcomp "$(__git_refs)"
-}
-
-_git_mergetool ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--tool=*)
-		__gitcomp "
-			kdiff3 tkdiff meld xxdiff emerge
-			vimdiff gvimdiff ecmerge opendiff
-			" "" "${cur##--tool=}"
-		return
-		;;
-	--*)
-		__gitcomp "--tool="
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_merge_base ()
-{
-	__gitcomp "$(__git_refs)"
-}
-
-_git_mv ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--dry-run"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_name_rev ()
-{
-	__gitcomp "--tags --all --stdin"
-}
-
-_git_pull ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-
-	if [ "$COMP_CWORD" = 2 ]; then
-		__gitcomp "$(__git_remotes)"
-	else
-		__gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
-	fi
-}
-
-_git_push ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-
-	if [ "$COMP_CWORD" = 2 ]; then
-		__gitcomp "$(__git_remotes)"
-	else
-		case "$cur" in
-		*:*)
-			local pfx=""
-			case "$COMP_WORDBREAKS" in
-			*:*) : great ;;
-			*)   pfx="${cur%%:*}:" ;;
-			esac
-
-			__gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
-			;;
-		+*)
-			__gitcomp "$(__git_refs)" + "${cur#+}"
-			;;
-		*)
-			__gitcomp "$(__git_refs)"
-			;;
-		esac
-	fi
-}
-
-_git_rebase ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
-	if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
-		__gitcomp "--continue --skip --abort"
-		return
-	fi
-	case "${COMP_WORDS[COMP_CWORD-1]}" in
-	-s|--strategy)
-		__gitcomp "$(__git_merge_strategies)"
-		return
-	esac
-	case "$cur" in
-	--strategy=*)
-		__gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
-		return
-		;;
-	--*)
-		__gitcomp "--onto --merge --strategy --interactive"
-		return
-	esac
-	__gitcomp "$(__git_refs)"
-}
-
-_git_send_email ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
-			--dry-run --envelope-sender --from --identity
-			--in-reply-to --no-chain-reply-to --no-signed-off-by-cc
-			--no-suppress-from --no-thread --quiet
-			--signed-off-by-cc --smtp-pass --smtp-server
-			--smtp-server-port --smtp-ssl --smtp-user --subject
-			--suppress-cc --suppress-from --thread --to
-			--validate --no-validate"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_config ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	local prv="${COMP_WORDS[COMP_CWORD-1]}"
-	case "$prv" in
-	branch.*.remote)
-		__gitcomp "$(__git_remotes)"
-		return
-		;;
-	branch.*.merge)
-		__gitcomp "$(__git_refs)"
-		return
-		;;
-	remote.*.fetch)
-		local remote="${prv#remote.}"
-		remote="${remote%.fetch}"
-		__gitcomp "$(__git_refs_remotes "$remote")"
-		return
-		;;
-	remote.*.push)
-		local remote="${prv#remote.}"
-		remote="${remote%.push}"
-		__gitcomp "$(git --git-dir="$(__gitdir)" \
-			for-each-ref --format='%(refname):%(refname)' \
-			refs/heads)"
-		return
-		;;
-	pull.twohead|pull.octopus)
-		__gitcomp "$(__git_merge_strategies)"
-		return
-		;;
-	color.branch|color.diff|color.status)
-		__gitcomp "always never auto"
-		return
-		;;
-	color.*.*)
-		__gitcomp "
-			normal black red green yellow blue magenta cyan white
-			bold dim ul blink reverse
-			"
-		return
-		;;
-	*.*)
-		COMPREPLY=()
-		return
-		;;
-	esac
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--global --system --file=
-			--list --replace-all
-			--get --get-all --get-regexp
-			--add --unset --unset-all
-			--remove-section --rename-section
-			"
-		return
-		;;
-	branch.*.*)
-		local pfx="${cur%.*}."
-		cur="${cur##*.}"
-		__gitcomp "remote merge mergeoptions" "$pfx" "$cur"
-		return
-		;;
-	branch.*)
-		local pfx="${cur%.*}."
-		cur="${cur#*.}"
-		__gitcomp "$(__git_heads)" "$pfx" "$cur" "."
-		return
-		;;
-	remote.*.*)
-		local pfx="${cur%.*}."
-		cur="${cur##*.}"
-		__gitcomp "
-			url proxy fetch push mirror skipDefaultUpdate
-			receivepack uploadpack tagopt
-			" "$pfx" "$cur"
-		return
-		;;
-	remote.*)
-		local pfx="${cur%.*}."
-		cur="${cur#*.}"
-		__gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
-		return
-		;;
-	esac
-	__gitcomp "
-		apply.whitespace
-		branch.autosetupmerge
-		branch.autosetuprebase
-		clean.requireForce
-		color.branch
-		color.branch.current
-		color.branch.local
-		color.branch.plain
-		color.branch.remote
-		color.diff
-		color.diff.commit
-		color.diff.frag
-		color.diff.meta
-		color.diff.new
-		color.diff.old
-		color.diff.plain
-		color.diff.whitespace
-		color.interactive
-		color.interactive.header
-		color.interactive.help
-		color.interactive.prompt
-		color.pager
-		color.status
-		color.status.added
-		color.status.changed
-		color.status.header
-		color.status.nobranch
-		color.status.untracked
-		color.status.updated
-		color.ui
-		commit.template
-		core.autocrlf
-		core.bare
-		core.compression
-		core.deltaBaseCacheLimit
-		core.editor
-		core.excludesfile
-		core.fileMode
-		core.fsyncobjectfiles
-		core.gitProxy
-		core.ignoreCygwinFSTricks
-		core.ignoreStat
-		core.logAllRefUpdates
-		core.loosecompression
-		core.packedGitLimit
-		core.packedGitWindowSize
-		core.pager
-		core.preferSymlinkRefs
-		core.preloadindex
-		core.quotepath
-		core.repositoryFormatVersion
-		core.safecrlf
-		core.sharedRepository
-		core.symlinks
-		core.trustctime
-		core.warnAmbiguousRefs
-		core.whitespace
-		core.worktree
-		diff.autorefreshindex
-		diff.external
-		diff.mnemonicprefix
-		diff.renameLimit
-		diff.renameLimit.
-		diff.renames
-		fetch.unpackLimit
-		format.headers
-		format.numbered
-		format.pretty
-		format.suffix
-		gc.aggressiveWindow
-		gc.auto
-		gc.autopacklimit
-		gc.packrefs
-		gc.pruneexpire
-		gc.reflogexpire
-		gc.reflogexpireunreachable
-		gc.rerereresolved
-		gc.rerereunresolved
-		gitcvs.allbinary
-		gitcvs.dbTableNamePrefix
-		gitcvs.dbdriver
-		gitcvs.dbname
-		gitcvs.dbpass
-		gitcvs.dbuser
-		gitcvs.enabled
-		gitcvs.logfile
-		gitcvs.usecrlfattr
-		gui.blamehistoryctx
-		gui.commitmsgwidth
-		gui.copyblamethreshold
-		gui.diffcontext
-		gui.encoding
-		gui.fastcopyblame
-		gui.matchtrackingbranch
-		gui.newbranchtemplate
-		gui.pruneduringfetch
-		gui.spellingdictionary
-		gui.trustmtime
-		help.autocorrect
-		help.browser
-		help.format
-		http.lowSpeedLimit
-		http.lowSpeedTime
-		http.maxRequests
-		http.noEPSV
-		http.proxy
-		http.sslCAInfo
-		http.sslCAPath
-		http.sslCert
-		http.sslKey
-		http.sslVerify
-		i18n.commitEncoding
-		i18n.logOutputEncoding
-		instaweb.browser
-		instaweb.httpd
-		instaweb.local
-		instaweb.modulepath
-		instaweb.port
-		log.date
-		log.showroot
-		man.viewer
-		merge.conflictstyle
-		merge.log
-		merge.renameLimit
-		merge.stat
-		merge.tool
-		merge.verbosity
-		mergetool.keepBackup
-		pack.compression
-		pack.deltaCacheLimit
-		pack.deltaCacheSize
-		pack.depth
-		pack.indexVersion
-		pack.packSizeLimit
-		pack.threads
-		pack.window
-		pack.windowMemory
-		pull.octopus
-		pull.twohead
-		receive.denyCurrentBranch
-		receive.denyDeletes
-		receive.denyNonFastForwards
-		receive.fsckObjects
-		receive.unpackLimit
-		repack.usedeltabaseoffset
-		rerere.autoupdate
-		rerere.enabled
-		showbranch.default
-		status.relativePaths
-		status.showUntrackedFiles
-		tar.umask
-		transfer.unpackLimit
-		user.email
-		user.name
-		user.signingkey
-		web.browser
-		branch. remote.
-	"
-}
-
-_git_remote ()
-{
-	local subcommands="add rename rm show prune update"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-
-	case "$subcommand" in
-	rename|rm|show|prune)
-		__gitcomp "$(__git_remotes)"
-		;;
-	update)
-		local i c='' IFS=$'\n'
-		for i in $(git --git-dir="$(__gitdir)" config --list); do
-			case "$i" in
-			remotes.*)
-				i="${i#remotes.}"
-				c="$c ${i/=*/}"
-				;;
-			esac
-		done
-		__gitcomp "$c"
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-}
-
-_git_reset ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--merge --mixed --hard --soft"
-		return
-		;;
-	esac
-	__gitcomp "$(__git_refs)"
-}
-
-_git_revert ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--edit --mainline --no-edit --no-commit --signoff"
-		return
-		;;
-	esac
-	__gitcomp "$(__git_refs)"
-}
-
-_git_rm ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "--cached --dry-run --ignore-unmatch --quiet"
-		return
-		;;
-	esac
-	COMPREPLY=()
-}
-
-_git_shortlog ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--max-count= --max-age= --since= --after=
-			--min-age= --before= --until=
-			--no-merges
-			--author= --committer= --grep=
-			--all-match
-			--not --all
-			--numbered --summary
-			"
-		return
-		;;
-	esac
-	__git_complete_revlist
-}
-
-_git_show ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--pretty=*)
-		__gitcomp "$__git_log_pretty_formats
-			" "" "${cur##--pretty=}"
-		return
-		;;
-	--*)
-		__gitcomp "--pretty=
-			$__git_diff_common_options
-			"
-		return
-		;;
-	esac
-	__git_complete_file
-}
-
-_git_show_branch ()
-{
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	case "$cur" in
-	--*)
-		__gitcomp "
-			--all --remotes --topo-order --current --more=
-			--list --independent --merge-base --no-name
-			--sha1-name --topics --reflog
-			"
-		return
-		;;
-	esac
-	__git_complete_revlist
-}
-
-_git_stash ()
-{
-	local subcommands='save list show apply clear drop pop create branch'
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-	else
-		local cur="${COMP_WORDS[COMP_CWORD]}"
-		case "$subcommand,$cur" in
-		save,--*)
-			__gitcomp "--keep-index"
-			;;
-		apply,--*)
-			__gitcomp "--index"
-			;;
-		show,--*|drop,--*|pop,--*|branch,--*)
-			COMPREPLY=()
-			;;
-		show,*|apply,*|drop,*|pop,*|branch,*)
-			__gitcomp "$(git --git-dir="$(__gitdir)" stash list \
-					| sed -n -e 's/:.*//p')"
-			;;
-		*)
-			COMPREPLY=()
-			;;
-		esac
-	fi
-}
-
-_git_submodule ()
-{
-	__git_has_doubledash && return
-
-	local subcommands="add status init update summary foreach sync"
-	if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
-		local cur="${COMP_WORDS[COMP_CWORD]}"
-		case "$cur" in
-		--*)
-			__gitcomp "--quiet --cached"
-			;;
-		*)
-			__gitcomp "$subcommands"
-			;;
-		esac
-		return
-	fi
-}
-
-_git_svn ()
-{
-	local subcommands="
-		init fetch clone rebase dcommit log find-rev
-		set-tree commit-diff info create-ignore propget
-		proplist show-ignore show-externals
-		"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-	else
-		local remote_opts="--username= --config-dir= --no-auth-cache"
-		local fc_opts="
-			--follow-parent --authors-file= --repack=
-			--no-metadata --use-svm-props --use-svnsync-props
-			--log-window-size= --no-checkout --quiet
-			--repack-flags --user-log-author --localtime $remote_opts
-			"
-		local init_opts="
-			--template= --shared= --trunk= --tags=
-			--branches= --stdlayout --minimize-url
-			--no-metadata --use-svm-props --use-svnsync-props
-			--rewrite-root= $remote_opts
-			"
-		local cmt_opts="
-			--edit --rmdir --find-copies-harder --copy-similarity=
-			"
-
-		local cur="${COMP_WORDS[COMP_CWORD]}"
-		case "$subcommand,$cur" in
-		fetch,--*)
-			__gitcomp "--revision= --fetch-all $fc_opts"
-			;;
-		clone,--*)
-			__gitcomp "--revision= $fc_opts $init_opts"
-			;;
-		init,--*)
-			__gitcomp "$init_opts"
-			;;
-		dcommit,--*)
-			__gitcomp "
-				--merge --strategy= --verbose --dry-run
-				--fetch-all --no-rebase $cmt_opts $fc_opts
-				"
-			;;
-		set-tree,--*)
-			__gitcomp "--stdin $cmt_opts $fc_opts"
-			;;
-		create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
-		show-externals,--*)
-			__gitcomp "--revision="
-			;;
-		log,--*)
-			__gitcomp "
-				--limit= --revision= --verbose --incremental
-				--oneline --show-commit --non-recursive
-				--authors-file=
-				"
-			;;
-		rebase,--*)
-			__gitcomp "
-				--merge --verbose --strategy= --local
-				--fetch-all $fc_opts
-				"
-			;;
-		commit-diff,--*)
-			__gitcomp "--message= --file= --revision= $cmt_opts"
-			;;
-		info,--*)
-			__gitcomp "--url"
-			;;
-		*)
-			COMPREPLY=()
-			;;
-		esac
-	fi
-}
-
-_git_tag ()
-{
-	local i c=1 f=0
-	while [ $c -lt $COMP_CWORD ]; do
-		i="${COMP_WORDS[c]}"
-		case "$i" in
-		-d|-v)
-			__gitcomp "$(__git_tags)"
-			return
-			;;
-		-f)
-			f=1
-			;;
-		esac
-		c=$((++c))
-	done
-
-	case "${COMP_WORDS[COMP_CWORD-1]}" in
-	-m|-F)
-		COMPREPLY=()
-		;;
-	-*|tag)
-		if [ $f = 1 ]; then
-			__gitcomp "$(__git_tags)"
-		else
-			COMPREPLY=()
-		fi
-		;;
-	*)
-		__gitcomp "$(__git_refs)"
-		;;
-	esac
-}
-
-_git ()
-{
-	local i c=1 command __git_dir
-
-	while [ $c -lt $COMP_CWORD ]; do
-		i="${COMP_WORDS[c]}"
-		case "$i" in
-		--git-dir=*) __git_dir="${i#--git-dir=}" ;;
-		--bare)      __git_dir="." ;;
-		--version|-p|--paginate) ;;
-		--help) command="help"; break ;;
-		*) command="$i"; break ;;
-		esac
-		c=$((++c))
-	done
-
-	if [ -z "$command" ]; then
-		case "${COMP_WORDS[COMP_CWORD]}" in
-		--*)   __gitcomp "
-			--paginate
-			--no-pager
-			--git-dir=
-			--bare
-			--version
-			--exec-path
-			--work-tree=
-			--help
-			"
-			;;
-		*)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
-		esac
-		return
-	fi
-
-	local expansion=$(__git_aliased_command "$command")
-	[ "$expansion" ] && command="$expansion"
-
-	case "$command" in
-	am)          _git_am ;;
-	add)         _git_add ;;
-	apply)       _git_apply ;;
-	archive)     _git_archive ;;
-	bisect)      _git_bisect ;;
-	bundle)      _git_bundle ;;
-	branch)      _git_branch ;;
-	checkout)    _git_checkout ;;
-	cherry)      _git_cherry ;;
-	cherry-pick) _git_cherry_pick ;;
-	clean)       _git_clean ;;
-	clone)       _git_clone ;;
-	commit)      _git_commit ;;
-	config)      _git_config ;;
-	describe)    _git_describe ;;
-	diff)        _git_diff ;;
-	fetch)       _git_fetch ;;
-	format-patch) _git_format_patch ;;
-	gc)          _git_gc ;;
-	grep)        _git_grep ;;
-	help)        _git_help ;;
-	init)        _git_init ;;
-	log)         _git_log ;;
-	ls-files)    _git_ls_files ;;
-	ls-remote)   _git_ls_remote ;;
-	ls-tree)     _git_ls_tree ;;
-	merge)       _git_merge;;
-	mergetool)   _git_mergetool;;
-	merge-base)  _git_merge_base ;;
-	mv)          _git_mv ;;
-	name-rev)    _git_name_rev ;;
-	pull)        _git_pull ;;
-	push)        _git_push ;;
-	rebase)      _git_rebase ;;
-	remote)      _git_remote ;;
-	reset)       _git_reset ;;
-	revert)      _git_revert ;;
-	rm)          _git_rm ;;
-	send-email)  _git_send_email ;;
-	shortlog)    _git_shortlog ;;
-	show)        _git_show ;;
-	show-branch) _git_show_branch ;;
-	stash)       _git_stash ;;
-	stage)       _git_add ;;
-	submodule)   _git_submodule ;;
-	svn)         _git_svn ;;
-	tag)         _git_tag ;;
-	whatchanged) _git_log ;;
-	*)           COMPREPLY=() ;;
-	esac
-}
-
-_gitk ()
-{
-	__git_has_doubledash && return
-
-	local cur="${COMP_WORDS[COMP_CWORD]}"
-	local g="$(git rev-parse --git-dir 2>/dev/null)"
-	local merge=""
-	if [ -f $g/MERGE_HEAD ]; then
-		merge="--merge"
-	fi
-	case "$cur" in
-	--*)
-		__gitcomp "--not --all $merge"
-		return
-		;;
-	esac
-	__git_complete_revlist
-}
-
-complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
-	|| complete -o default -o nospace -F _git git
-complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
-	|| complete -o default -o nospace -F _gitk gitk
diff --git a/completion/git_flow.bash b/completion/git_flow.bash
deleted file mode 100644
index c76d323..0000000
--- a/completion/git_flow.bash
+++ /dev/null
@@ -1,177 +0,0 @@
-#!bash
-#
-# git-flow-completion
-# ===================
-# 
-# Bash completion support for [git-flow](http://github.com/nvie/gitflow)
-# 
-# The contained completion routines provide support for completing:
-# 
-#  * git-flow init and version
-#  * feature, hotfix and release branches
-#  * remote feature branch names (for `git-flow feature track`)
-# 
-# 
-# Installation
-# ------------
-# 
-# To achieve git-flow completion nirvana:
-# 
-#  0. Install git-completion.
-# 
-#  1. Install this file. Either:
-# 
-#     a. Place it in a `bash-completion.d` folder:
-# 
-#        * /etc/bash-completion.d
-#        * /usr/local/etc/bash-completion.d
-#        * ~/bash-completion.d
-# 
-#     b. Or, copy it somewhere (e.g. ~/.git-flow-completion.sh) and put the following line in
-#        your .bashrc:
-# 
-#            source ~/.git-flow-completion.sh
-# 
-#  2. If you are using Git < 1.7.1: Edit git-completion.sh and add the following line to the giant
-#     $command case in _git:
-# 
-#         flow)        _git_flow ;;
-# 
-# 
-# The Fine Print
-# --------------
-# 
-# Copyright (c) 2010 [Justin Hileman](http://justinhileman.com)
-# 
-# Distributed under the [MIT License](http://creativecommons.org/licenses/MIT/)
-
-_git_flow ()
-{
-	local subcommands="init feature release hotfix"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-
-	case "$subcommand" in
-	feature)
-		__git_flow_feature
-		return
-		;;
-	release)
-		__git_flow_release
-		return
-		;;
-	hotfix)
-		__git_flow_hotfix
-		return
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-}
-
-__git_flow_feature ()
-{
-	local subcommands="list start finish publish track diff rebase checkout pull"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-
-	case "$subcommand" in
-	pull)
-		__gitcomp "$(__git_remotes)"
-		return
-		;;
-	checkout|finish|diff|rebase)
-		__gitcomp "$(__git_flow_list_features)"
-		return
-		;;
-	publish)
-		__gitcomp "$(comm -23 <(__git_flow_list_features) <(__git_flow_list_remote_features))"
-		return
-		;;
-	track)
-		__gitcomp "$(__git_flow_list_remote_features)"
-		return
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-}
-
-__git_flow_list_features ()
-{
-	git flow feature list 2> /dev/null | tr -d ' |*'
-}
-
-__git_flow_list_remote_features ()
-{
-	git branch -r 2> /dev/null | grep "origin/$(__git_flow_feature_prefix)" | awk '{ sub(/^origin\/$(__git_flow_feature_prefix)/, "", $1); print }'
-}
-
-__git_flow_feature_prefix ()
-{
-	git config gitflow.prefix.feature 2> /dev/null || echo "feature/"
-}
-
-__git_flow_release ()
-{
-	local subcommands="list start finish"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-	
-	case "$subcommand" in
-	finish)
-		__gitcomp "$(__git_flow_list_releases)"
-		return
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-
-}
-
-__git_flow_list_releases ()
-{
-	git flow release list 2> /dev/null
-}
-
-__git_flow_hotfix ()
-{
-	local subcommands="list start finish"
-	local subcommand="$(__git_find_subcommand "$subcommands")"
-	if [ -z "$subcommand" ]; then
-		__gitcomp "$subcommands"
-		return
-	fi
-
-	case "$subcommand" in
-	finish)
-		__gitcomp "$(__git_flow_list_hotfixes)"
-		return
-		;;
-	*)
-		COMPREPLY=()
-		;;
-	esac
-}
-
-__git_flow_list_hotfixes ()
-{
-	git flow hotfix list 2> /dev/null
-}
-
-# temporarily wrap __git_find_on_cmdline() for backwards compatibility
-if [ -z "`type -t __git_find_subcommand`" ]; then
-	alias __git_find_subcommand=__git_find_on_cmdline
-fi
\ No newline at end of file
diff --git a/completion/rake.bash b/completion/rake.bash
deleted file mode 100644
index 5793bd0..0000000
--- a/completion/rake.bash
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-# Bash completion support for Rake, Ruby Make.
-
-export COMP_WORDBREAKS=${COMP_WORDBREAKS/\:/}
-
-_rakecomplete() {
-    if [ -f Rakefile ]; then
-        recent=`ls -t .rake_tasks~ Rakefile **/*.rake 2> /dev/null | head -n 1`
-        if [[ $recent != '.rake_tasks~' ]]; then
-            rake --silent --tasks | cut -d " " -f 2 > .rake_tasks~
-        fi
-        COMPREPLY=($(compgen -W "`cat .rake_tasks~`" -- ${COMP_WORDS[COMP_CWORD]}))
-        return 0
-    fi
-}
-
-complete -o default -o nospace -F _rakecomplete rake
diff --git a/functions/base.bash b/functions/base.bash
deleted file mode 100644
index bbb6f2f..0000000
--- a/functions/base.bash
+++ /dev/null
@@ -1,36 +0,0 @@
-#!/bin/bash
-
-function rh {
-  history | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
-}
-  
-function ips {
-  ifconfig | grep "inet " | awk '{ print $2 }'
-}
-
-
-# View man documentation in Preview
-pman () {
-   man -t "${1}" | open -f -a /Applications/Preview.app/
-}
-
-
-pcurl() {
-  curl "${1}" | open -f -a /Applications/Preview.app/
-}
-
-pri() {
-  ri -T "${1}" | open -f -a /Applications/Preview.app/
-}
-
-
-# disk usage per directory
-usage ()
-{
-  if [ $1 ]
-  then
-    du -hd $1
-  else
-    du -hd 1
-  fi
-}
\ No newline at end of file
diff --git a/functions/git.bash b/functions/git.bash
deleted file mode 100644
index 50f4459..0000000
--- a/functions/git.bash
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-function git_remote {
-  echo "Running: git remote add origin ${GIT_HOSTING}:$1.git"
-  git remote add origin $GIT_HOSTING:$1.git
-}
-
-function git_first_push {
-  echo "Running: git push origin master:refs/heads/master"
-  git push origin master:refs/heads/master
-}
-
-function git_remove_missing_files() {
-  git ls-files -d -z | xargs -0 git update-index --remove
-}
\ No newline at end of file
diff --git a/functions/javascript.bash b/functions/javascript.bash
deleted file mode 100644
index f37859d..0000000
--- a/functions/javascript.bash
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-function rails_jquery {
-  curl -o public/javascripts/rails.js http://github.com/rails/jquery-ujs/raw/master/src/rails.js
-}
-
-function jquery_install {
-  curl -o public/javascripts/jquery.js http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
-}
-
-function  jquery_ui_install {
-  curl -o public/javascripts/jquery_ui.js http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.5/jquery-ui.min.js
-}
\ No newline at end of file
diff --git a/functions/nginx.bash b/functions/nginx.bash
deleted file mode 100644
index 7aa1653..0000000
--- a/functions/nginx.bash
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/bin/bash
-
-function nginx_reload() {
-  FILE="${NGINX_PATH}/logs/nginx.pid"
-  if [ -e $FILE ]; then
-    echo "Reloading NGINX..."
-    PID=`cat $NGINX_PATH/logs/nginx.pid`
-    sudo kill -HUP $PID
-  else
-    echo "Nginx pid file not found"
-    return 0
-  fi
-}
-
-function nginx_stop() {
-  FILE="${NGINX_PATH}/logs/nginx.pid"
-  if [ -e $FILE ]; then
-    echo "Stopping NGINX..."
-    PID=`cat $NGINX_PATH/logs/nginx.pid`
-    sudo kill -INT $PID
-  else
-    echo "Nginx pid file not found"
-    return 0
-  fi
-}
-
-function nginx_start() {
-  FILE="${NGINX_PATH}/sbin/nginx"
-  if [ -e $FILE ]; then
-    echo "Starting NGINX..."
-    sudo $NGINX_PATH/sbin/nginx
-  else
-    echo "Couldn't start nginx"
-  fi
-}
-
-function nginx_restart() {
-  FILE="${NGINX_PATH}/logs/nginx.pid"
-  if [ -e $FILE ]; then
-    echo "Stopping NGINX..."
-    PID=`cat $NGINX_PATH/logs/nginx.pid`
-    sudo kill -INT $PID
-    sleep 1
-    echo "Starting NGINX..."
-    sudo $NGINX_PATH/sbin/nginx
-  else
-    echo "Nginx pid file not found"
-    return 0
-  fi
-}
\ No newline at end of file
diff --git a/lib/aliases.bash b/lib/aliases.bash
index 50acc51..4152374 100644
--- a/lib/aliases.bash
+++ b/lib/aliases.bash
@@ -17,4 +17,7 @@
 # Shell History
 alias h='history'
 
-# 
\ No newline at end of file
+# Directory
+alias	md='mkdir -p'
+alias	rd=rmdir
+alias d='dirs -v'
\ No newline at end of file
diff --git a/lib/appearance.bash b/lib/appearance.bash
index 69ca55e..4b1f568 100644
--- a/lib/appearance.bash
+++ b/lib/appearance.bash
@@ -8,4 +8,4 @@
 export LSCOLORS='Gxfxcxdxdxegedabagacad'
 
 # Load the theme
-source "$BASH/themes/$BASH_THEME/$BASH_THEME.bash"
\ No newline at end of file
+source "$BASH/themes/$BASH_THEME/$BASH_THEME.theme.bash"
\ No newline at end of file
diff --git a/plugins/base.bash b/plugins/base.bash
deleted file mode 100644
index c256247..0000000
--- a/plugins/base.bash
+++ /dev/null
@@ -1,11 +0,0 @@
-#!/bin/bash
-
-# Desktop Programs
-alias fireworks="open -a '/Applications/Adobe Fireworks CS3/Adobe Fireworks CS3.app'"
-alias photoshop="open -a '/Applications/Adobe Photoshop CS3/Adobe Photoshop.app'"
-alias preview="open -a '/Applications/Preview.app'"
-alias xcode="open -a '/Developer/Applications/Xcode.app'"
-alias filemerge="open -a '/Developer/Applications/Utilities/FileMerge.app'"
-alias safari="open -a safari"
-alias firefox="open -a firefox"
-alias dashcode="open -a dashcode"
\ No newline at end of file
diff --git a/plugins/git.bash b/plugins/git.bash
deleted file mode 100644
index d62edc6..0000000
--- a/plugins/git.bash
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-
-# Aliases
-alias g='git'
-alias gst='git status'
-alias gl='git pull'
-alias gup='git fetch && git rebase'
-alias gp='git push'
-alias gd='git diff | mate'
-alias gdv='git diff -w "$@" | vim -R -'
-alias gc='git commit -v'
-alias gca='git commit -v -a'
-alias gb='git branch'
-alias gba='git branch -a'
-alias gcount='git shortlog -sn'
-alias gcp='git cherry-pick'
\ No newline at end of file
diff --git a/plugins/osx.bash b/plugins/osx.bash
deleted file mode 100644
index a2ad79b..0000000
--- a/plugins/osx.bash
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-function tab() {
-  osascript 2>/dev/null <<EOF
-    tell application "System Events"
-      tell process "Terminal" to keystroke "t" using command down
-    end
-    tell application "Terminal"
-      activate
-      do script with command "cd \"$PWD\"; $*" in window 1
-    end tell
-EOF
-}
\ No newline at end of file
diff --git a/plugins/rails.bash b/plugins/rails.bash
deleted file mode 100644
index 056e2a3..0000000
--- a/plugins/rails.bash
+++ /dev/null
@@ -1,17 +0,0 @@
-#!/bin/bash
-
-# Rails Commands
-alias r='rails'
-alias rg='rails g'
-alias rs='rails s'
-alias rc='rails c'
-alias rn='rails new'
-alias rd='rails dbconsole'
-alias rp='rails plugin'
-alias ra='rails application'
-alias rd='rails destroy'
-
-alias ss='script/server'
-alias sc='script/console'
-alias restart_app='touch tmp/restart.txt'
-alias devlog='tail -f log/development.log'
\ No newline at end of file
diff --git a/plugins/ruby.bash b/plugins/ruby.bash
deleted file mode 100644
index 203fb99..0000000
--- a/plugins/ruby.bash
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-function remove_gem {
-  gem list | grep $1 | awk '{ print $1; }' | xargs sudo gem uninstall
-}
\ No newline at end of file
diff --git a/plugins/rvm.bash b/plugins/rvm.bash
deleted file mode 100644
index 020bb3f..0000000
--- a/plugins/rvm.bash
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-switch () {
-  rvm $1
-  local v=$(rvm_version)
-  rvm wrapper $1 textmate
-  echo "Switch to Ruby version: "$v
-}
-
-rvm_default () {
-  rvm --default $1
-  rvm wrapper $1 textmate
-}
-
-function rvm_version () {
-  ruby --version
-}
diff --git a/plugins/subversion.bash b/plugins/subversion.bash
deleted file mode 100644
index 83c9b17..0000000
--- a/plugins/subversion.bash
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/bash
-rm_svn(){
-  find $1 -name .svn -print0 | xargs -0 rm -rf
-}
-
-svn_add(){
-	svn status | grep '^\?' | sed -e 's/? *//' | sed -e 's/ /\ /g' | xargs svn add
-}
\ No newline at end of file
diff --git a/plugins/textmate.bash b/plugins/textmate.bash
deleted file mode 100644
index 4aa494a..0000000
--- a/plugins/textmate.bash
+++ /dev/null
@@ -1,6 +0,0 @@
-#!/bin/bash
-
-# Textmate
-alias e='mate . &'
-alias et='mate app config db lib public script test spec config.ru Gemfile Rakefile README &'
-alias em="emacs"
\ No newline at end of file
diff --git a/plugins/vim.bash b/plugins/vim.bash
deleted file mode 100644
index 28681b0..0000000
--- a/plugins/vim.bash
+++ /dev/null
@@ -1,4 +0,0 @@
-#!/bin/bash
-
-# VIM
-alias v='mvim --remote-silent'
\ No newline at end of file
diff --git a/template/bash_profile.bash-template b/template/bash_profile.bash-template
deleted file mode 100644
index 3dd62a2..0000000
--- a/template/bash_profile.bash-template
+++ /dev/null
@@ -1,30 +0,0 @@
-#!/bin/bash
-
-# Load RVM
-[[ -s $HOME/.rvm/scripts/rvm ]] && source $HOME/.rvm/scripts/rvm
-
-# Add rvm gems and nginx to the path
-export PATH=$PATH:~/.gem/ruby/1.8/bin:/opt/nginx/sbin
-
-# Path to the bash it configuration
-export BASH=$HOME/.bash_it
-
-# Lock and Load a custom theme file
-# location /.bash_it/themes/
-export BASH_THEME='bobby'
-
-# Your place for hosting Git repos. I use this for private repos.
-export GIT_HOSTING='git@git.domain.org'
-
-# Set my editor and git editor
-export EDITOR="/usr/bin/mate -w" 
-export GIT_EDITOR='/usr/bin/mate -w'
-
-# Set the path nginx
-export NGINX_PATH='/opt/nginx'
-
-# Don't check mail when opening terminal.
-unset MAILCHECK
-
-# Load Bash It
-source $BASH/bash_it.sh
diff --git a/themes/base.bash b/themes/base.bash
deleted file mode 100644
index eaf0e83..0000000
--- a/themes/base.bash
+++ /dev/null
@@ -1,42 +0,0 @@
-#!/bin/bash
-
-# Normal Colors
-GREEN=$'\e[0;32m'
-RED=$'\e[0;31m'
-BLUE=$'\e[0;34m'
-WHITE=$'\e[1;37m'
-BLACK=$'\e[0;30m'
-YELLOW=$'\e[0;33m'
-PURPLE=$'\e[0;35m'
-CYAN=$'\e[0;36m'
-GRAY=$'\e[1;30m'
-PINK=$'\e[37;1;35m'
-ORANGE=$'\e[33;40m'
-
-# Revert color back to the normal color
-NORMAL=$'\e[00m'
-
-# LIGHT COLORS
-LIGHT_BLUE=$'\e[1;34m'
-LIGHT_GREEN=$'\e[1;32m'
-LIGHT_CYAN=$'\e[1;36m'
-LIGHT_RED=$'\e[1;31m'
-LIGHT_PURPLE=$'\e[1;35m'
-LIGHT_YELLOW=$'\e[1;33m'
-LIGHT_GRAY=$'\e[0;37m'
-
-
-# Stolen from Steve Losh
-function prompt_char {
-    git branch >/dev/null 2>/dev/null && echo '±' && return
-    hg root >/dev/null 2>/dev/null && echo '☿' && return
-    echo '○'
-}
-
-function parse_git_dirty {
-  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
-}
-
-function parse_git_branch {
-  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/"
-}
\ No newline at end of file
diff --git a/themes/bobby/bobby.bash b/themes/bobby/bobby.bash
deleted file mode 100644
index 724eb2c..0000000
--- a/themes/bobby/bobby.bash
+++ /dev/null
@@ -1,2 +0,0 @@
-#!/bin/bash
-export PS1='${LIGHT_BLUE}$(prompt_char)${LIGHT_GREEN} $(parse_git_branch) ${ORANGE}\h ${NORMAL}in ${GREEN}\w ${NORMAL}→ '
\ No newline at end of file
