Added -v (--verbose) flags to list subaction of all subcommands.
diff --git a/git-flow b/git-flow
index 99c9510..bfbd76e 100755
--- a/git-flow
+++ b/git-flow
@@ -202,6 +202,9 @@
 	has $BASE $ALL_MERGES
 }
 
+# helper functions for common reuse
+max() { if [ "$1" -gt "$2" ]; then echo "$1"; else echo "$2"; fi; }
+
 # convenience functions for checking whether flags have been set or not
 flag() { eval FLAG=\$FLAGS_$1; [ $FLAG -eq $FLAGS_TRUE ]; }
 noflag() { eval FLAG=\$FLAGS_$1; [ $FLAG -ne $FLAGS_TRUE ]; }
diff --git a/git-flow-feature b/git-flow-feature
index 57d5872..6cb635a 100644
--- a/git-flow-feature
+++ b/git-flow-feature
@@ -28,8 +28,6 @@
 	cmd_list "$@"
 }
 
-max() { if [ "$1" -gt "$2" ]; then echo "$1"; else echo "$2"; fi; }
-
 cmd_list() {
 	DEFINE_boolean verbose false 'verbose (more) output' v
 	parse_args "$@"
@@ -113,7 +111,7 @@
 
 require_name() {
 	if [ "$NAME" = "" ]; then
-		echo "Missing argument <name>"
+		warn "Missing argument <name>"
 		usage
 		exit 1
 	fi
diff --git a/git-flow-hotfix b/git-flow-hotfix
index 51ca9e1..d3c70ad 100644
--- a/git-flow-hotfix
+++ b/git-flow-hotfix
@@ -17,7 +17,7 @@
 FLAG_FETCH=1
 
 usage() {
-	echo "usage: git flow hotfix [list]"
+	echo "usage: git flow hotfix [list] [-v]"
 	echo "       git flow hotfix start <version> [<base>]"
 	echo "       git flow hotfix finish <version> [<base>]"
 	# TODO
@@ -37,12 +37,53 @@
 }
 
 cmd_list() {
+	DEFINE_boolean verbose false 'verbose (more) output' v
+	parse_args "$@"
+
 	HOTFIX_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$HOTFIX_BRANCHES" ]; then
 		warn "No hotfix branches exist."
 		exit 0
 	fi
-	echo "$HOTFIX_BRANCHES" | sed "s?^$PREFIX??g"
+
+	CURRENT_BRANCH=$(git branch | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g')
+	SHORT_NAMES=$(echo "$HOTFIX_BRANCHES" | sed "s?^$PREFIX??g")
+	# determine column width first
+	width=0
+	for branch in $SHORT_NAMES; do
+		len=$(($(echo "$branch" | wc -c) - 1))
+		width=$(max $width $len)
+	done
+	width=$(($width + 3))
+
+	for branch in $SHORT_NAMES; do
+		fullname="$PREFIX$branch"
+		base=$(git merge-base "$fullname" "$MASTER_BRANCH")
+		master_sha=$(git rev-parse "$MASTER_BRANCH")
+		branch_sha=$(git rev-parse "$fullname")
+		if [ "$fullname" = "$CURRENT_BRANCH" ]; then
+			printf "* "
+		else
+			printf "  "
+		fi
+		if flag verbose; then
+			printf "%-${width}s" "$branch"
+			if [ "$branch_sha" = "$master_sha" ]; then
+				printf "(no commits yet)"
+			else
+				tagname=$(git name-rev --tags --no-undefined --name-only $base)
+				if [ "$tagname" != "" ]; then
+					nicename="$tagname"
+				else
+					nicename="$(git rev-parse --short $base)"
+				fi
+				printf "(based on $nicename)"
+			fi
+		else
+			printf "%s" "$branch"
+		fi
+		echo
+	done
 }
 
 cmd_help() {
@@ -51,18 +92,22 @@
 }
 
 parse_args() {
-	# TODO: When we have a nice structured way of parsing flags with getopt,
-	# implement the following flags:
-	# --fetch, to set FLAG_FETCH=1
-	# --no-fetch, to set FLAG_FETCH=0
+	# parse options
+	FLAGS "$@" || exit $?
+	eval set -- "${FLAGS_ARGV}"
+
+	# read arguments into global variables
 	VERSION="$1"
 	BASE="${2:-$MASTER_BRANCH}"
+	BRANCH=$PREFIX$VERSION
+}
+
+require_version_arg() {
 	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
+		warn "Missing argument <version>"
 		usage
 		exit 1
 	fi
-	BRANCH=$PREFIX$VERSION
 }
 
 cmd_start() {
diff --git a/git-flow-release b/git-flow-release
index c7c9a08..8cdeadb 100644
--- a/git-flow-release
+++ b/git-flow-release
@@ -17,7 +17,7 @@
 FLAG_FETCH=1
 
 usage() {
-	echo "usage: git flow release [list]"
+	echo "usage: git flow release [list] [-v]"
 	echo "       git flow release start <version>"
 	echo "       git flow release finish <version>"
 	# TODO
@@ -38,12 +38,48 @@
 }
 
 cmd_list() {
+	DEFINE_boolean verbose false 'verbose (more) output' v
+	parse_args "$@"
+
 	RELEASE_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$RELEASE_BRANCHES" ]; then
 		warn "No release branches exist."
 		exit 0
 	fi
-	echo "$RELEASE_BRANCHES" | sed "s?^$PREFIX??g"
+
+	CURRENT_BRANCH=$(git branch | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g')
+	SHORT_NAMES=$(echo "$RELEASE_BRANCHES" | sed "s?^$PREFIX??g")
+	# determine column width first
+	width=0
+	for branch in $SHORT_NAMES; do
+		len=$(($(echo "$branch" | wc -c) - 1))
+		width=$(max $width $len)
+	done
+	width=$(($width + 3))
+
+	for branch in $SHORT_NAMES; do
+		fullname="$PREFIX$branch"
+		base=$(git merge-base "$fullname" "$DEVELOP_BRANCH")
+		develop_sha=$(git rev-parse "$DEVELOP_BRANCH")
+		branch_sha=$(git rev-parse "$fullname")
+		if [ "$fullname" = "$CURRENT_BRANCH" ]; then
+			printf "* "
+		else
+			printf "  "
+		fi
+		if flag verbose; then
+			printf "%-${width}s" "$branch"
+			if [ "$branch_sha" = "$develop_sha" ]; then
+				printf "(no commits yet)"
+			else
+				nicename="$(git rev-parse --short $base)"
+				printf "(based on $nicename)"
+			fi
+		else
+			printf "%s" "$branch"
+		fi
+		echo
+	done
 }
 
 cmd_help() {
@@ -52,21 +88,26 @@
 }
 
 parse_args() {
-	# TODO: When we have a nice structured way of parsing flags with getopt,
-	# implement the following flags:
-	# --fetch, to set FLAG_FETCH=1
-	# --no-fetch, to set FLAG_FETCH=0
+	# parse options
+	FLAGS "$@" || exit $?
+	eval set -- "${FLAGS_ARGV}"
+
+	# read arguments into global variables
 	VERSION="$1"
+	BRANCH="$PREFIX$VERSION"
+}
+
+require_version_arg() {
 	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
+		warn "Missing argument <version>"
 		usage
 		exit 1
 	fi
-	BRANCH=$PREFIX$VERSION
 }
 
 cmd_start() {
 	parse_args "$@"
+	require_version_arg
 
 	# sanity checks
 	gitflow_require_clean_working_tree
@@ -95,6 +136,7 @@
 
 cmd_finish() {
 	parse_args "$@"
+	require_version_arg
 
 	# sanity checks
 	gitflow_require_clean_working_tree
diff --git a/git-flow-support b/git-flow-support
index 4c33b2d..11d5a11 100644
--- a/git-flow-support
+++ b/git-flow-support
@@ -16,8 +16,11 @@
 PREFIX=$(git config --get gitflow.prefix.support || echo support/)
 FLAG_FETCH=1
 
+warn "note: The support subcommand is still very EXPERIMENTAL!"
+warn "note: DO NOT use it in a production situation."
+
 usage() {
-	echo "usage: git flow support [list]"
+	echo "usage: git flow support [list] [-v]"
 	echo "       git flow support start <version> [<base>]"
 }
 
@@ -26,12 +29,53 @@
 }
 
 cmd_list() {
+	DEFINE_boolean verbose false 'verbose (more) output' v
+	parse_args "$@"
+
 	SUPPORT_BRANCHES="$(echo "$LOCAL_BRANCHES" | grep "^$PREFIX")"
 	if [ -z "$SUPPORT_BRANCHES" ]; then
 		warn "No support branches exist."
 		exit 0
 	fi
-	echo "$SUPPORT_BRANCHES" | sed "s?^$PREFIX??g"
+
+	CURRENT_BRANCH=$(git branch | grep '^\* ' | grep -v 'no branch' | sed 's/^* //g')
+	SHORT_NAMES=$(echo "$SUPPORT_BRANCHES" | sed "s?^$PREFIX??g")
+	# determine column width first
+	width=0
+	for branch in $SHORT_NAMES; do
+		len=$(($(echo "$branch" | wc -c) - 1))
+		width=$(max $width $len)
+	done
+	width=$(($width + 3))
+
+	for branch in $SHORT_NAMES; do
+		fullname="$PREFIX$branch"
+		base=$(git merge-base "$fullname" "$MASTER_BRANCH")
+		master_sha=$(git rev-parse "$MASTER_BRANCH")
+		branch_sha=$(git rev-parse "$fullname")
+		if [ "$fullname" = "$CURRENT_BRANCH" ]; then
+			printf "* "
+		else
+			printf "  "
+		fi
+		if flag verbose; then
+			printf "%-${width}s" "$branch"
+			if [ "$branch_sha" = "$master_sha" ]; then
+				printf "(no commits yet)"
+			else
+				tagname=$(git name-rev --tags --no-undefined --name-only $base)
+				if [ "$tagname" != "" ]; then
+					nicename="$tagname"
+				else
+					nicename="$(git rev-parse --short $base)"
+				fi
+				printf "(based on $nicename)"
+			fi
+		else
+			printf "%s" "$branch"
+		fi
+		echo
+	done
 }
 
 cmd_help() {
@@ -40,22 +84,27 @@
 }
 
 parse_args() {
-	# TODO: When we have a nice structured way of parsing flags with getopt,
-	# implement the following flags:
-	# --fetch, to set FLAG_FETCH=1
-	# --no-fetch, to set FLAG_FETCH=0
+	# parse options
+	FLAGS "$@" || exit $?
+	eval set -- "${FLAGS_ARGV}"
+
+	# read arguments into global variables
 	VERSION="$1"
 	BASE="${2:-${VERSION_PREFIX}${VERSION}}"
+	BRANCH=$PREFIX$VERSION
+}
+
+require_version_arg() {
 	if [ "$VERSION" = "" ]; then
-		echo "Missing argument <version>."
+		warn "Missing argument <version>"
 		usage
 		exit 1
 	fi
-	BRANCH=$PREFIX$VERSION
 }
 
 cmd_start() {
 	parse_args "$@"
+	require_version_arg
 
 	# sanity checks
 	gitflow_require_clean_working_tree
@@ -64,13 +113,12 @@
 	if [ $FLAG_FETCH -eq 1 ]; then
 		git fetch -q $ORIGIN $BASE
 	fi
-	gitflow_require_branches_equal $BRANCH $ORIGIN/$BRANCH
 
 	# create branch
-	git checkout -b $BRANCH $BASE
+	git checkout -b "$BRANCH" "$BASE"
 
 	# publish branch
-	git push $ORIGIN $BRANCH:refs/heads/$BRANCH
+	#git push $ORIGIN $BRANCH:refs/heads/$BRANCH
 
 	git config branch.$BRANCH.remote $ORIGIN
 	git config branch.$BRANCH.merge refs/heads/$BRANCH