Merge branch 'release/0.3.1'
diff --git a/README.markdown b/README.markdown
index 0c1fda8..7e351a4 100644
--- a/README.markdown
+++ b/README.markdown
@@ -35,6 +35,24 @@
 
         flow)        _git_flow ;;
 
+Installation for zsh
+---------------------
+ 
+ To achieve git-flow completion nirvana:
+ 
+  0. Update your zsh's git-completion module to the newest verion.
+		From here. http://zsh.git.sourceforge.net/git/gitweb.cgi?p=zsh/zsh;a=blob_plain;f=Completion/Unix/Command/_git;hb=HEAD
+ 
+  1. Install this file. Either:
+ 
+     a. Place it in your .zshrc:
+ 
+     b. Or, copy it somewhere (e.g. ~/.git-flow-completion.zsh) and put the following line in
+        your .zshrc:
+ 
+            source ~/.git-flow-completion.zsh
+
+	  c. Or, use this file as a oh-my-zsh plugin.
 
 The Fine Print
 --------------
diff --git a/git-flow-completion.zsh b/git-flow-completion.zsh
new file mode 100644
index 0000000..db8dccf
--- /dev/null
+++ b/git-flow-completion.zsh
@@ -0,0 +1,332 @@
+#!zsh
+# 
+# Installation
+# ------------
+# 
+# To achieve git-flow completion nirvana:
+# 
+#  0. Update your zsh's git-completion module to the newest verion.
+#		From here. http://zsh.git.sourceforge.net/git/gitweb.cgi?p=zsh/zsh;a=blob_plain;f=Completion/Unix/Command/_git;hb=HEAD
+# 
+#  1. Install this file. Either:
+# 
+#     a. Place it in your .zshrc:
+# 
+#     b. Or, copy it somewhere (e.g. ~/.git-flow-completion.zsh) and put the following line in
+#        your .zshrc:
+# 
+#            source ~/.git-flow-completion.zsh
+#
+#	  c. Or, use this file as a oh-my-zsh plugin.
+#
+
+_git-flow ()
+{
+	local curcontext="$curcontext" state line
+	typeset -A opt_args
+
+	_arguments -C \
+    	':command:->command' \
+    	'*::options:->options'
+
+	case $state in
+		(command)
+		
+			local -a subcommands
+			subcommands=(
+				'init:Initialize a new git repo with support for the branching model.'
+				'feature:Manage your feature branches.'
+				'release:Manage your release branches.'
+				'hotfix:Manage your hotfix branches.'
+				'support:Manage your support branches.'
+				'version:Shows version information.'
+			)
+			_describe -t commands 'git flow' subcommands
+		;;
+		
+		(options)
+			case $line[1] in
+			
+				(init)
+					_arguments \
+            			-f'[Force setting of gitflow branches, even if already configured]'
+					;;
+			
+					(version)
+					;;
+			
+					(hotfix)
+						__git-flow-hotfix
+					;;
+			
+					(release)
+						__git-flow-release
+					;;
+			
+					(feature)
+						__git-flow-feature
+					;;
+      		esac
+      	;;
+  esac
+}
+
+__git-flow-release ()
+{
+	local curcontext="$curcontext" state line
+	typeset -A opt_args
+
+	_arguments -C \
+    	':command:->command' \
+    	'*::options:->options'
+
+	case $state in
+		(command)
+		
+			local -a subcommands
+			subcommands=(
+				'start:Start a new release branch'
+				'finish:Finish a release branche.'
+				'list:List all your release branches. (Alias to `git flow release`)'
+			)
+			_describe -t commands 'git flow release' subcommands
+			_arguments \
+    			-v'[Verbose (more) output]'
+		;;
+		
+		(options)
+			case $line[1] in
+			
+				(start)
+					_arguments \
+            			-F'[Fetch from origin before performing finish]'\
+						':version:__git_flow_version_list' 
+					;;
+			
+				(finish)
+					_arguments \
+        				-F'[Fetch from origin before performing finish]' \
+    					-s'[Sign the release tag cryptographically]'\
+    					-u'[Use the given GPG-key for the digital signature (implies -s)]'\
+    					-m'[Use the given tag message]'\
+    					-p'[Push to $ORIGIN after performing finish]'\
+						':version:__git_flow_version_list' 
+				;;
+				
+				*)
+					_arguments \
+            			-v'[Verbose (more) output]'
+					;;
+      		esac
+      ;;
+  esac
+}
+
+__git-flow-hotfix ()
+{
+	local curcontext="$curcontext" state line
+	typeset -A opt_args
+
+	_arguments -C \
+    	':command:->command' \
+    	'*::options:->options'
+
+	case $state in
+		(command)
+		
+			local -a subcommands
+			subcommands=(
+				'start:Start a new hotfix branch'
+				'finish:Finish a hotfix branche.'
+				'list:List all your hotfix branches. (Alias to `git flow hotfix`)'
+			)
+			_describe -t commands 'git flow hotfix' subcommands
+			_arguments \
+    			-v'[Verbose (more) output]'
+		;;
+		
+		(options)
+			case $line[1] in
+			
+				(start)
+					_arguments \
+            			-F'[Fetch from origin before performing finish]'\
+						':hotfix:__git_flow_version_list'\
+						':branch-name:__git_branch_names'
+					;;
+			
+				(finish)
+					_arguments \
+        				-F'[Fetch from origin before performing finish]' \
+    					-s'[Sign the release tag cryptographically]'\
+    					-u'[Use the given GPG-key for the digital signature (implies -s)]'\
+    					-m'[Use the given tag message]'\
+    					-p'[Push to $ORIGIN after performing finish]'\
+						':hotfix:__git_flow_hotfix_list' 
+				;;
+				
+				*)
+					_arguments \
+            			-v'[Verbose (more) output]'
+					;;
+      		esac
+      ;;
+  esac
+}
+
+__git-flow-feature ()
+{
+	local curcontext="$curcontext" state line
+	typeset -A opt_args
+
+	_arguments -C \
+    	':command:->command' \
+    	'*::options:->options'
+
+	case $state in
+		(command)
+		
+			local -a subcommands
+			subcommands=(
+				'start:Start a new hotfix branch'
+				'finish:Finish a hotfix branche.'
+				'list:List all your hotfix branches. (Alias to `git flow hotfix`)'
+				'publish: public'
+				'track: track'
+				'diff: diff'
+				'rebase: rebase'
+				'checkout: checkout'
+				'pull: pull'
+			)
+			_describe -t commands 'git flow hotfix' subcommands
+			_arguments \
+    			-v'[Verbose (more) output]'
+		;;
+		
+		(options)
+			case $line[1] in
+			
+				(start)
+					_arguments \
+            			-F'[Fetch from origin before performing finish]'\
+						':feature:__git_flow_feature_list'\
+						':branch-name:__git_branch_names'
+					;;
+			
+				(finish)
+					_arguments \
+        				-F'[Fetch from origin before performing finish]' \
+    					-r'[Rebase instead of merge]'\
+						':feature:__git_flow_feature_list' 
+				;;
+				
+				(publish)
+					_arguments \
+						':feature:__git_flow_feature_list'\
+					;;
+					
+				(track)
+					_arguments \
+						':feature:__git_flow_feature_list'\
+					;;	
+						
+				(diff)
+					_arguments \
+						':branch:__git_branch_names'\
+					;;	
+
+				(rebase)
+					_arguments \
+        				-i'[Do an interactive rebase]' \
+						':branch:__git_branch_names' 
+				;;
+
+				(checkout)
+					_arguments \
+						':branch:__git_flow_feature_list'\
+					;;
+
+				(pull)
+					_arguments \
+						':remote:__git_remotes'\
+						':branch:__git_branch_names'
+					;;
+																										
+				*)
+					_arguments \
+            			-v'[Verbose (more) output]'
+					;;
+      		esac
+      ;;
+  esac
+}
+
+__git_flow_version_list ()
+{
+  local expl
+  declare -a versions
+
+  versions=(${${(f)"$(_call_program versions git flow release list 2> /dev/null | tr -d ' |*')"}})
+  __git_command_successful || return
+
+  _wanted versions expl 'version' compadd $versions
+}
+
+__git_flow_feature_list ()
+{
+  local expl
+  declare -a features
+
+  features=(${${(f)"$(_call_program features git flow feature list 2> /dev/null | tr -d ' |*')"}})
+  __git_command_successful || return
+
+  _wanted features expl 'feature' compadd $features
+}
+
+__git_remotes () {
+  local expl gitdir remotes
+
+  gitdir=$(_call_program gitdir git rev-parse --git-dir 2>/dev/null)
+  __git_command_successful || return
+
+  remotes=(${${(f)"$(_call_program remotes git config --get-regexp '"^remote\..*\.url$"')"}//#(#b)remote.(*).url */$match[1]})
+  __git_command_successful || return
+
+  # TODO: Should combine the two instead of either or.
+  if (( $#remotes > 0 )); then
+    _wanted remotes expl remote compadd $* - $remotes
+  else
+    _wanted remotes expl remote _files $* - -W "($gitdir/remotes)" -g "$gitdir/remotes/*"
+  fi
+}
+
+__git_flow_hotfix_list ()
+{
+  local expl
+  declare -a hotfixes
+
+  hotfixes=(${${(f)"$(_call_program hotfixes git flow hotfix list 2> /dev/null | tr -d ' |*')"}})
+  __git_command_successful || return
+
+  _wanted hotfixes expl 'hotfix' compadd $hotfixes
+}
+
+__git_branch_names () {
+  local expl
+  declare -a branch_names
+
+  branch_names=(${${(f)"$(_call_program branchrefs git for-each-ref --format='"%(refname)"' refs/heads 2>/dev/null)"}#refs/heads/})
+  __git_command_successful || return
+
+  _wanted branch-names expl branch-name compadd $* - $branch_names
+}
+
+__git_command_successful () {
+  if (( ${#pipestatus:#0} > 0 )); then
+    _message 'not a git repository'
+    return 1
+  fi
+  return 0
+}
+
+zstyle ':completion:*:*:git:*' user-commands flow:'description for foo'
\ No newline at end of file