Merge remote-tracking branch 'upstream/master'
diff --git a/.gitignore b/.gitignore
index 33e5fca..32e62de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,4 @@
-aliases/enabled
-plugins/enabled
+*/enabled/*
 .DS_Store
 custom/*.bash
 !custom/example.bash
diff --git a/README.md b/README.md
index c8412c9..0c9c303 100644
--- a/README.md
+++ b/README.md
@@ -1,46 +1,53 @@
 # 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](https://github.com/robbyrussell/oh-my-zsh). :)
+**Bash it** is a mash up of my own bash commands and scripts, other bash stuff I have found. 
 
-Includes some autocompletion tools, theming support, aliases, custom functions, a few stolen pieces from Steve Losh, and more.
+(And a shameless ripoff of [oh-my-zsh](https://github.com/robbyrussell/oh-my-zsh). :)
+
+Includes autocompletion, themes, aliases, custom functions, a few stolen pieces from Steve Losh, and more.
 
 ## Install
 
-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.
+1. Check a clone of this repo: `git clone http://github.com/revans/bash-it.git ~/.bash_it`
+2. Run `~/.bash_it/install.sh` (it automatically backs up your `~/.bash_profile`)
+3. Edit your `~/.bash_profile` file in order to customize bash-it.
 
-	git clone http://github.com/revans/bash-it.git bash_it
-
-	cp ~/.bash_profile ~/.bash_profile_original
-	cp <path/to/cloned/repo>/template/bash_profile.template.bash ~/.bash_profile
+**NOTE:**
+The install script will also prompt you asking if you use [Jekyll](https://github.com/mojombo/jekyll). 
+This is to set up the `.jekyllconfig` file, which stores info necessary to use the Jekyll plugin.
 
 
 ## Help Screens
 
-	bash-it (will show all the help commands)
-	aliases-help
-	rails-help
-	git-help
-    plugins-help
+```
+bash-it (will show all the help commands)
+aliases-help
+rails-help
+git-help
+plugins-help
+```
 
 ## Your Custom scripts, aliases, and functions
 
-For custom scripts, and aliases, you can create the following files and they will be ignored by the git repo:
+For custom scripts, and aliases, just create the following files (they'll be ignored by the git repo):
 
 * `aliases/custom.aliases.bash`
 * `lib/custom.bash`
 * `plugins/custom.plugins.bash`
 
-and anything in the custom directory will be ignored with the exception of `custom/example.bash`.
+Anything in the custom directory will be ignored, with the exception of `custom/example.bash`.
 
 ## Themes
 
-There are a few bash-it themes, but I'm hoping the community will jump in and create their own custom prompts and share their creations with everyone else by submitting a pull request to me (revans).
+There are a few bash it themes.  If you've created your own custom prompts, I'd love it if you shared with everyone else!  Just submit a Pull Request to me (revans).
 
 ## Help out
 
-I think all of us have our own custom scripts that we have added over time and so following in the footsteps of oh-my-zsh, bash-it was created as a framework for those who choose to use bash as their shell. As a community, I'm excited to see what everyone else has in their custom toolbox and am hoping that they'll share it with everyone by submitting a pull request to bash-it.
+I think everyone has their own custom scripts accumulated over time.  And so, following in the footsteps of oh-my-zsh, bash it is a framework for easily customizing your bash shell. Everyone's got a custom toolbox, so let's start making them even better, **as a community!**
 
-So, if you have contributions to bash-it, please send me a pull request and I'll take a look at it and commit it to the repo as long as it looks good. If you do change an existing command, please give an explanation as to why. That will help a lot when I merge your changes in. Thanks, and happing bashing!
+Send me a pull request and I'll merge it as long as it looks good. If you change an existing command, please give an explanation why. That will help a lot when I merge your changes in. 
+
+Thanks, and happing bashing!
 
 
 ## Contributors
diff --git a/aliases/available/bundler.aliases.bash b/aliases/available/bundler.aliases.bash
new file mode 100644
index 0000000..12484f6
--- /dev/null
+++ b/aliases/available/bundler.aliases.bash
@@ -0,0 +1,21 @@
+#!/bin/bash
+
+# Bundler Commands
+alias be="bundle exec"
+alias bi="bundle install"
+alias bl="bundle list"
+alias bu="bundle update"
+alias bp="bundle package"
+
+
+function bundler-help() {
+  echo "Bundler Aliases Usage"
+  echo
+  echo "  be          = bundle exec"
+  echo "  bi          = bundle install"
+  echo "  bl          = bundle list"
+  echo "  bu          = bundle update"
+  echo "  bp          = bundle package"
+  echo
+}
+
diff --git a/aliases/available/emacs.aliases.bash b/aliases/available/emacs.aliases.bash
index 5b32876..5042b17 100644
--- a/aliases/available/emacs.aliases.bash
+++ b/aliases/available/emacs.aliases.bash
@@ -1,3 +1,11 @@
 #!/bin/bash
 
-alias em="open -a emacs"
\ No newline at end of file
+case $OSTYPE in
+  linux*)
+    alias em='emacs'
+    alias e='emacsclient -n'
+    ;;
+  darwin*)
+    alias em="open -a emacs"
+    ;;
+esac
diff --git a/aliases/available/general.aliases.bash b/aliases/available/general.aliases.bash
index 79bd7aa..cfd456f 100644
--- a/aliases/available/general.aliases.bash
+++ b/aliases/available/general.aliases.bash
@@ -12,7 +12,12 @@
 
 if [ $(uname) = "Linux" ]
 then
-	alias ls="ls --color=always"
+  alias ls="ls --color=always"
+fi
+which gshuf &> /dev/null
+if [ $? -eq 1 ]
+then
+  alias shuf=gshuf
 fi
 
 alias c='clear'
@@ -32,42 +37,46 @@
 
 alias piano="pianobar"
 
-alias ..='cd ..'        # Go up one directory
-alias ...='cd ../..'    # Go up two directories
-alias -- -="cd -"       # Go back
+alias ..='cd ..'         # Go up one directory
+alias ...='cd ../..'     # Go up two directories
+alias ....='cd ../../..' # Go up two directories
+alias -- -="cd -"        # Go back
 
 # Shell History
 alias h='history'
 
 # Tree
-alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
+if [ ! -x "$(which tree)" ]
+then
+  alias tree="find . -print | sed -e 's;[^/]*/;|____;g;s;____|; |;g'"
+fi
 
 # Directory
 alias	md='mkdir -p'
 alias	rd=rmdir
 
 function aliases-help() {
-  echo "Generic Alias Usage"
-  echo
-  echo "  sl      = ls"
-  echo "  ls      = ls -G"
-  echo "  la      = ls -AF"
-  echo "  ll      = ls -al"
-  echo "  l       = ls -a"
-  echo "  c/k/cls = clear"
-  echo "  ..      = cd .."
-  echo "  ...     = cd ../.."
-  echo "  -       = cd -"
-  echo "  h       = history"
-  echo "  md      = mkdir -p"
-  echo "  rd      = rmdir"
-  echo "  editor  = $EDITOR"
-  echo "  pager   = $PAGER"
-  echo "  piano   = pianobar"
-  echo "  q       = exit"
-  echo "  irc     = $IRC_CLIENT"
-  echo "  md      = mkdir -p"
-  echo "  rd      = rmdir"
-  echo "  rb      = ruby"
-  echo
+echo "Generic Alias Usage"
+echo
+echo "  sl      = ls"
+echo "  ls      = ls -G"
+echo "  la      = ls -AF"
+echo "  ll      = ls -al"
+echo "  l       = ls -a"
+echo "  c/k/cls = clear"
+echo "  ..      = cd .."
+echo "  ...     = cd ../.."
+echo "  -       = cd -"
+echo "  h       = history"
+echo "  md      = mkdir -p"
+echo "  rd      = rmdir"
+echo "  editor  = $EDITOR"
+echo "  pager   = $PAGER"
+echo "  piano   = pianobar"
+echo "  q       = exit"
+echo "  irc     = $IRC_CLIENT"
+echo "  md      = mkdir -p"
+echo "  rd      = rmdir"
+echo "  rb      = ruby"
+echo
 }
diff --git a/aliases/available/jekyll.aliases.bash b/aliases/available/jekyll.aliases.bash
deleted file mode 100644
index e52c035..0000000
--- a/aliases/available/jekyll.aliases.bash
+++ /dev/null
@@ -1,20 +0,0 @@
-# Open the root of your site in your vim or builtin cd to it
-
-if [[ $EDITOR = "vim" ]]
-then 
-	alias newentry="builtin cd $JEKYLL_LOCAL_ROOT && $EDITOR ."
-else 
-	alias newentry="builtin cd $JEKYLL_LOCAL_ROOT"
-fi
-
-# Build and locally serve the site
-
-alias testsite="builtin cd $JEKYLL_LOCAL_ROOT && jekyll --server --auto"
-
-# Build but don't locally serve the site
-
-alias buildsite="builtin cd $JEKYLL_LOCAL_ROOT && rm -rf _site/ && jekyll"
-
-# Rsync the site to the remote server
-
-alias deploysite="builtin cd $JEKYLL_LOCAL_ROOT && rsync -rz _site/ $JEKYLL_REMOTE_ROOT"
diff --git a/aliases/available/textmate.aliases.bash b/aliases/available/textmate.aliases.bash
index ecd616f..4e696a5 100644
--- a/aliases/available/textmate.aliases.bash
+++ b/aliases/available/textmate.aliases.bash
@@ -1,5 +1,9 @@
 #!/bin/bash
 
-# Textmate
-alias e='mate . &'
-alias et='mate app config db lib public script test spec config.ru Gemfile Rakefile README &'
\ No newline at end of file
+case $OSTYPE in
+  darwin*)
+    # Textmate
+    alias e='mate . &'
+    alias et='mate app config db lib public script test spec config.ru Gemfile Rakefile README &'
+    ;;
+esac
diff --git a/bash_it.sh b/bash_it.sh
index 3dd3d7a..7844f37 100644
--- a/bash_it.sh
+++ b/bash_it.sh
@@ -4,60 +4,65 @@
 # Reload Library
 alias reload='source ~/.bash_profile'
 
-# Load the framework
+# Only set $BASH_IT if it's not already set
+if [ -z "$BASH_IT" ];
+then
+    # Setting $BASH to maintain backwards compatibility
+    # TODO: warn users that they should upgrade their .bash_profile
+    export BASH_IT=$BASH
+    export BASH=`bash -c 'echo $BASH'`
+fi
+
+# For backwards compatibility, look in old BASH_THEME location
+if [ -z "$BASH_IT_THEME" ];
+then
+    # TODO: warn users that they should upgrade their .bash_profile
+    export BASH_IT_THEME="$BASH_THEME";
+    unset $BASH_THEME;
+fi
 
 # Load colors first so they can be use in base theme
-source "${BASH}/themes/colors.theme.bash"
-source "${BASH}/themes/base.theme.bash"
+source "${BASH_IT}/themes/colors.theme.bash"
+source "${BASH_IT}/themes/base.theme.bash"
 
-# Library
-LIB="${BASH}/lib/*.bash"
+# library
+LIB="${BASH_IT}/lib/*.bash"
 for config_file in $LIB
 do
   source $config_file
 done
 
-# Tab Completion
-COMPLETION="${BASH}/completion/*.bash"
-for config_file in $COMPLETION
+# Load enabled aliases, completion, plugins
+for file_type in "aliases" "completion" "plugins"
 do
-  source $config_file
+  if [ ! -d "${BASH_IT}/${file_type}/enabled" ]
+  then
+    continue
+  fi
+  FILES="${BASH_IT}/${file_type}/enabled/*.bash"
+  for config_file in $FILES
+  do
+    if [ -e "${config_file}" ]; then
+      source $config_file
+    fi
+  done
 done
 
-# Plugins
-if [ ! -d "${BASH}/plugins/enabled" ]
+# Load any custom aliases that the user has added
+if [ -e "${BASH_IT}/aliases/custom.aliases.bash" ]
 then
-  mkdir "${BASH}/plugins/enabled"
-  ln -s ${BASH}/plugins/available/* "${BASH}/plugins/enabled"
+  source "${BASH_IT}/aliases/custom.aliases.bash"
 fi
-PLUGINS="${BASH}/plugins/enabled/*.bash"
-for config_file in $PLUGINS
-do
-  source $config_file
-done
-
-# Aliases
-if [ ! -d "${BASH}/aliases/enabled" ]
-then
-  mkdir "${BASH}/aliases/enabled"
-  ln -s ${BASH}/aliases/available/* "${BASH}/aliases/enabled"
-fi
-FUNCTIONS="${BASH}/aliases/enabled/*.bash"
-for config_file in $FUNCTIONS
-do
-  source $config_file
-done
-
-source "${BASH}/aliases/custom.aliases.bash"
 
 # Custom
-CUSTOM="${BASH}/custom/*.bash"
+CUSTOM="${BASH_IT}/custom/*.bash"
 for config_file in $CUSTOM
 do
-  source $config_file
+  if [ -e "${config_file}" ]; then
+    source $config_file
+  fi
 done
 
-
 unset config_file
 if [[ $PROMPT ]]; then
     export PS1=$PROMPT
@@ -68,6 +73,13 @@
 [ -s /usr/bin/gloobus-preview ] && PREVIEW="gloobus-preview"
 [ -s /Applications/Preview.app ] && PREVIEW="/Applications/Preview.app"
 
+# Load all the Jekyll stuff
+
+if [ -e $HOME/.jekyllconfig ]
+then
+  . $HOME/.jekyllconfig
+fi
+
 
 #
 # Custom Help
diff --git a/completion/brew.completion.bash b/completion/available/brew.completion.bash
similarity index 100%
rename from completion/brew.completion.bash
rename to completion/available/brew.completion.bash
diff --git a/completion/available/gem.completion.bash b/completion/available/gem.completion.bash
new file mode 100644
index 0000000..de986e0
--- /dev/null
+++ b/completion/available/gem.completion.bash
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+# Completion for gem
+
+_installcomp() {
+  if [ -z "$REMOTE_GEMS" ]
+  then
+    REMOTE_GEMS=( $(gem list --remote --no-versions | tr '\n' ' ') )
+  fi
+  
+  local cur=${COMP_WORDS[COMP_CWORD]}
+  COMPREPLY=( $(compgen -W "${REMOTE_GEMS[*]}" -- $cur) )
+}
+
+_uninstallcomp() {
+  if [ -z "$LOCAL_GEMS" ]
+  then
+    LOCAL_GEMS=( $(gem list --no-versions | sed 's/\*\*\* LOCAL GEMS \*\*\*//' | tr '\n' ' ') )
+  fi
+  
+  local cur=${COMP_WORDS[COMP_CWORD]}
+  COMPREPLY=( $(compgen -W "${LOCAL_GEMS[*]}" -- $cur) )
+}
+
+_gem() {
+  local cur=${COMP_WORDS[COMP_CWORD]}
+  local prev=${COMP_WORDS[COMP_CWORD-1]}
+  case $prev in
+    install)
+      _installcomp
+      return 0
+      ;;
+    uninstall)
+      _uninstallcomp
+      return 0
+      ;;
+  esac
+  local commands=(build cert check cleanup contents dependency environment fetch generate_index help install list lock outdated owner pristine push query rdoc search server sources specification stale uninstall unpack update which)
+  COMPREPLY=( $(compgen -W "${commands[*]}" -- $cur) )
+}
+
+complete -F _gem gem
diff --git a/completion/git.completion.bash b/completion/available/git.completion.bash
similarity index 100%
rename from completion/git.completion.bash
rename to completion/available/git.completion.bash
diff --git a/completion/git_flow.completion.bash b/completion/available/git_flow.completion.bash
similarity index 100%
rename from completion/git_flow.completion.bash
rename to completion/available/git_flow.completion.bash
diff --git a/completion/rake.completion.bash b/completion/available/rake.completion.bash
similarity index 100%
rename from completion/rake.completion.bash
rename to completion/available/rake.completion.bash
diff --git a/completion/ssh.completion.bash b/completion/available/ssh.completion.bash
similarity index 100%
rename from completion/ssh.completion.bash
rename to completion/available/ssh.completion.bash
diff --git a/completion/todo.completion.bash b/completion/available/todo.completion.bash
similarity index 100%
rename from completion/todo.completion.bash
rename to completion/available/todo.completion.bash
diff --git a/install.sh b/install.sh
new file mode 100755
index 0000000..a80a749
--- /dev/null
+++ b/install.sh
@@ -0,0 +1,88 @@
+#!/usr/bin/env bash
+BASH_IT="$HOME/.bash_it"
+
+cp $HOME/.bash_profile $HOME/.bash_profile.bak
+
+echo "Your original .bash_profile has been backed up to .bash_profile.bak"
+
+cp $HOME/.bash_it/template/bash_profile.template.bash $HOME/.bash_profile
+
+echo "Copied the template .bash_profile into ~/.bash_profile, edit this file to customize bash-it"
+
+while true
+do
+  read -p "Do you use Jekyll? (If you don't know what Jekyll is, answer 'n') [Y/N] " RESP
+
+  case $RESP
+    in
+    [yY])
+      cp $HOME/.bash_it/template/jekyllconfig.template.bash $HOME/.jekyllconfig
+      echo "Copied the template .jekyllconfig into your home directory. Edit this file to customize bash-it for using the Jekyll plugins"
+      break
+      ;;
+    [nN])
+      break
+      ;;
+    *)
+      echo "Please enter Y or N"
+  esac
+done
+
+function load_all() {
+  file_type=$1
+  [ ! -d "$BASH_IT/$file_type/enabled" ] && mkdir "$BASH_IT/${file_type}/enabled"
+  ln -s $BASH_IT/${file_type}/available/* "${BASH_IT}/${file_type}/enabled"
+}
+
+function load_some() {
+    file_type=$1
+    for file in `ls $BASH_IT/${file_type}/available`
+    do
+      if [ ! -d "$BASH_IT/$file_type/enabled" ]
+      then
+        mkdir "$BASH_IT/$file_type/enabled"
+      fi
+      while true
+      do
+        read -p "Would you like to enable the ${file%.*.*} $file_type? [Y/N] " RESP
+        case $RESP in
+        [yY])
+          ln -s "$BASH_IT/$file_type/available/$file" "$BASH_IT/$file_type/enabled"
+          break
+          ;;
+        [nN])
+          break
+          ;;
+        *)
+          echo "Please choose y or n."
+          ;;
+        esac
+      done
+    done
+}
+
+for type in "aliases" "plugins" "completion"
+do
+  while true
+  do
+    read -p "Would you like to enable all, some, or no $type? Some of these may make bash slower to start up (especially completion). (all/some/none) " RESP
+    case $RESP
+    in
+    some)
+      load_some $type
+      break
+      ;;
+    all)
+      load_all $type
+      break
+      ;;
+    none)
+      break
+      ;;
+    *)
+      echo "Unknown choice. Please enter some, all, or none"
+      continue
+      ;;
+    esac
+  done
+done
diff --git a/lib/appearance.bash b/lib/appearance.bash
index f723511..28a131a 100644
--- a/lib/appearance.bash
+++ b/lib/appearance.bash
@@ -8,6 +8,6 @@
 export LSCOLORS='Gxfxcxdxdxegedabagacad'
 
 # Load the theme
-if [[ $BASH_THEME ]]; then
-    source "$BASH/themes/$BASH_THEME/$BASH_THEME.theme.bash"
-fi
\ No newline at end of file
+if [[ $BASH_IT_THEME ]]; then
+    source "$BASH_IT/themes/$BASH_IT_THEME/$BASH_IT_THEME.theme.bash"
+fi
diff --git a/plugins/available/base.plugin.bash b/plugins/available/base.plugin.bash
index e361e04..7a6dc80 100644
--- a/plugins/available/base.plugin.bash
+++ b/plugins/available/base.plugin.bash
@@ -15,6 +15,19 @@
   echo "Your public IP is: ${bold_green} $res ${normal}"
 }
 
+pass() {
+  which gshuf &> /dev/null
+  if [ $? -eq 1 ]
+  then
+    echo "Error: shuf isn't installed!"
+    return 1
+  fi
+
+  pass=$(shuf -n4 /usr/share/dict/words | tr '\n' ' ')
+  echo "With spaces (easier to memorize): $pass"
+  echo "Without (use this as the pass): $(echo $pass | tr -d ' ')"
+}
+
 # Function for previewing markdown files in the browser
 
 function pmdown() {
diff --git a/plugins/available/battery.plugin.bash b/plugins/available/battery.plugin.bash
index 4946c2c..7c15812 100644
--- a/plugins/available/battery.plugin.bash
+++ b/plugins/available/battery.plugin.bash
@@ -69,11 +69,11 @@
   local F_C='▸'
   # Depleted char
   local D_C='▹'
-  local DEPLETED_COLOR='\[${normal}\]'
-  local FULL_COLOR='\[${green}\]'
-  local HALF_COLOR='\[${yellow}\]'
-  local DANGER_COLOR='\[${red}\]'
-  local BATTERY_OUTPUT='${DEPLETED_COLOR}${D_C}${D_C}${D_C}${D_C}${D_C}'
+  local DEPLETED_COLOR="${normal}"
+  local FULL_COLOR="${green}"
+  local HALF_COLOR="${yellow}"
+  local DANGER_COLOR="${red}"
+  local BATTERY_OUTPUT="${DEPLETED_COLOR}${D_C}${D_C}${D_C}${D_C}${D_C}"
   local BATTERY_PERC=$(battery_percentage)
 
   case $BATTERY_PERC in
@@ -123,7 +123,7 @@
       echo "${HALF_COLOR}${F_C}${DEPLETED_COLOR}${D_C}${D_C}${D_C}${D_C}${normal}"
       ;;
     *)
-      echo "${DANGER_COLOR}UNPLG\[${normal}\]"
+      echo "${DANGER_COLOR}UNPLG${normal}"
       ;;
   esac
 }
diff --git a/plugins/available/dirs.plugins.bash b/plugins/available/dirs.plugins.bash
old mode 100644
new mode 100755
index dfa9a32..9353c5b
--- a/plugins/available/dirs.plugins.bash
+++ b/plugins/available/dirs.plugins.bash
@@ -50,3 +50,35 @@
   echo "8	: Chance to stack location 8."
   echo "9	: Chance to stack location 9."
 }
+
+
+# ADD BOOKMARKing functionality
+# usage:
+
+if [ ! -f ~/.dirs ]; then  # if doesn't exist, create it
+    touch ~/.dirs
+else
+    source ~/.dirs
+fi
+
+alias L='cat ~/.dirs'
+
+G () {				# goes to distination dir otherwise , stay in the dir
+    cd ${1:-$(pwd)} ;
+}
+
+S () {				# SAVE a BOOKMARK
+    sed "/$@/d" ~/.dirs > ~/.dirs1;
+    \mv ~/.dirs1 ~/.dirs;
+    echo "$@"=\"`pwd`\" >> ~/.dirs;
+    source ~/.dirs ;
+}
+
+R () {				# remove a BOOKMARK
+    sed "/$@/d" ~/.dirs > ~/.dirs1;
+    \mv ~/.dirs1 ~/.dirs;
+}
+
+alias U='source ~/.dirs' 	# Update BOOKMARK stack
+# set the bash option so that no '$' is required when using the above facility
+shopt -s cdable_vars
diff --git a/plugins/available/extract.plugin.bash b/plugins/available/extract.plugin.bash
new file mode 100644
index 0000000..1c3e9b1
--- /dev/null
+++ b/plugins/available/extract.plugin.bash
@@ -0,0 +1,25 @@
+extract () {
+  if [ $# -ne 1 ]
+  then
+    echo "Error: No file specified."
+    return 1
+  fi
+	if [ -f $1 ] ; then
+		case $1 in
+			*.tar.bz2) tar xvjf $1   ;;
+			*.tar.gz)  tar xvzf $1   ;;
+			*.bz2)     bunzip2 $1    ;;
+			*.rar)     unrar x $1    ;;
+			*.gz)      gunzip $1     ;;
+			*.tar)     tar xvf $1    ;;
+			*.tbz2)    tar xvjf $1   ;;
+			*.tgz)     tar xvzf $1   ;;
+			*.zip)     unzip $1      ;;
+			*.Z)       uncompress $1 ;;
+			*.7z)      7z x $1       ;;
+			*)         echo "'$1' cannot be extracted via extract" ;;
+		esac
+	else
+		echo "'$1' is not a valid file"
+	fi
+}
diff --git a/plugins/available/jekyll.plugins.bash b/plugins/available/jekyll.plugins.bash
index aebe69b..eff85ce 100644
--- a/plugins/available/jekyll.plugins.bash
+++ b/plugins/available/jekyll.plugins.bash
@@ -1,208 +1,346 @@
 #!/bin/bash
 
 editpost() {
-	builtin cd "$JEKYLL_LOCAL_ROOT/_posts"
+  unset SITE
+  if [ -z "$1" ]
+  then
+    echo "Error: no site specified."
+    echo "The site is the name of the directory your project is in."
+    return 1
+  fi
 
-	COUNTER=1
-	NUMBER="$RANDOM"
-	TMPFILE="/tmp/editpost-$NUMBER"
+  for site in ${SITES[@]}
+  do
+    if [ "$(basename $site)" = "$1" ]
+    then
+      SITE=$site
+      break
+    fi
+  done
 
-	for POST in *
-	do
-		DATE=`echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"`
-		TITLE=`cat $POST | grep -oE "title: (.+)"`
-		TITLE=`echo $TITLE | sed 's/title: //'`
-		echo "$COUNTER) 	$DATE	$TITLE" >> "$TMPFILE"	
-		POSTS[$COUNTER]=$POST
-		COUNTER=`expr $COUNTER + 1`
-	done
-	less $TMPFILE	
-	read -p "Number of post to edit: " POST_TO_EDIT
-	if [ -z "$EDITOR" ]
-	then
-		nano "${POSTS[$POST_TO_EDIT]}"
-	else
-		"$EDITOR" "${POSTS[$POST_TO_EDIT]}"
-	fi
+  if [ -z "$SITE" ]
+  then
+    echo "No such site."
+    return 1
+  fi
+
+  builtin cd "$SITE/_posts"
+
+  COUNTER=1
+  NUMBER="$RANDOM"
+  TMPFILE="/tmp/editpost-$NUMBER"
+
+  for POST in *
+  do
+    DATE=`echo $POST | grep -oE "[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}"`
+    TITLE=`cat $POST | grep -oE "title: (.+)"`
+    TITLE=`echo $TITLE | sed 's/title: //'`
+    echo "$COUNTER) 	$DATE	$TITLE" >> "$TMPFILE"	
+    POSTS[$COUNTER]=$POST
+    COUNTER=`expr $COUNTER + 1`
+  done
+  less $TMPFILE	
+  read -p "Number of post to edit: " POST_TO_EDIT
+  if [ -z "$JEKYLL_EDITOR" ]
+  then
+    nano "${POSTS[$POST_TO_EDIT]}"
+  else
+    "$JEKYLL_EDITOR" "${POSTS[$POST_TO_EDIT]}"
+  fi
 }
 
 newpost() {
+  unset SITE
+  if [ -z "$1" ]
+  then
+    echo "Error: no site specified."
+    echo "The site is the name of the directory your project is in."
+    return 1
+  fi
 
-	# 'builtin cd' into the local jekyll root
+  if [ -z "$SITE" ]
+  then
+    echo "No such site."
+    return 1
+  fi
 
-	builtin cd "$JEKYLL_LOCAL_ROOT/_posts"
+  loc=0
 
-	# Get the date for the new post's filename
+  for site in ${SITES[@]}
+  do
+    if [ "$(basename $site)" = "$1" ]
+    then
+      SITE=$site
+      JEKYLL_FORMATTING=${MARKUPS[$loc]}
+      break
+    fi
+    loc=$(($loc+1))
+  done
 
-	FNAME_DATE=$(date "+%Y-%m-%d")
+  # 'builtin cd' into the local jekyll root
 
-	# If the user is using markdown formatting, let them choose what type of post they want. Sort of like Tumblr. 
+  builtin cd "$SITE/_posts"
 
-	OPTIONS="Text Quote Image Audio Video Link"
-	
-	if [ $JEKYLL_FORMATTING = "markdown" -o $JEKYLL_FORMATTING = "textile" ]
-	then
-		select OPTION in $OPTIONS
-		do
-			if [[ $OPTION = "Text" ]] 
-			then
-				POST_TYPE="Text"
-				break
-			fi
+  # Get the date for the new post's filename
 
-			if [[ $OPTION = "Quote" ]]
-			then
-				POST_TYPE="Quote"
-				break
-			fi
-		
-			if [[ $OPTION = "Image" ]]
-			then
-				POST_TYPE="Image"
-				break
-			fi
+  FNAME_DATE=$(date "+%Y-%m-%d")
 
-			if [[ $OPTION = "Audio" ]]
-			then
-				POST_TYPE="Audio"
-				break
-			fi
+  # If the user is using markdown or textile formatting, let them choose what type of post they want. Sort of like Tumblr.
 
-			if [[ $OPTION = "Video" ]]
-			then
-				POST_TYPE="Video"
-				break
-			fi
+  OPTIONS="Text Quote Image Audio Video Link"
 
-			if [[ $OPTION = "Link" ]]
-			then
-				POST_TYPE="Link"
-				break
-			fi
-		done
-	fi
+  if [ $JEKYLL_FORMATTING = "markdown" -o $JEKYLL_FORMATTING = "textile" ]
+  then
+    select OPTION in $OPTIONS
+    do
+      if [[ $OPTION = "Text" ]] 
+      then
+        POST_TYPE="Text"
+        break
+      fi
 
-	# Get the title for the new post
+      if [[ $OPTION = "Quote" ]]
+      then
+        POST_TYPE="Quote"
+        break
+      fi
 
-	read -p "Enter title of the new post: " POST_TITLE
+      if [[ $OPTION = "Image" ]]
+      then
+        POST_TYPE="Image"
+        break
+      fi
 
-	# Convert the spaces in the title to hyphens for use in the filename
+      if [[ $OPTION = "Audio" ]]
+      then
+        POST_TYPE="Audio"
+        break
+      fi
 
-	FNAME_POST_TITLE=`echo $POST_TITLE | tr ' ' "-"`
+      if [[ $OPTION = "Video" ]]
+      then
+        POST_TYPE="Video"
+        break
+      fi
 
-	# Now, put it all together for the full filename
+      if [[ $OPTION = "Link" ]]
+      then
+        POST_TYPE="Link"
+        break
+      fi
+    done
+  fi
 
-	FNAME="$FNAME_DATE-$FNAME_POST_TITLE.$JEKYLL_FORMATTING"
+  # Get the title for the new post
 
-	# And, finally, create the actual post file. But we're not done yet...
+  read -p "Enter title of the new post: " POST_TITLE
 
-	touch "$FNAME"
+  # Convert the spaces in the title to hyphens for use in the filename
 
-	# Write a little stuff to the file for the YAML Front Matter
+  FNAME_POST_TITLE=`echo $POST_TITLE | tr ' ' "-"`
 
-	echo "---" >> $FNAME
+  # Now, put it all together for the full filename
 
-	# Now we have to get the date, again. But this time for in the header (YAML Front Matter) of
-	# the file
+  FNAME="$FNAME_DATE-$FNAME_POST_TITLE.$JEKYLL_FORMATTING"
 
-	YAML_DATE=$(date "+%B %d %Y %X")
+  # And, finally, create the actual post file. But we're not done yet...
 
-	# Echo the YAML Formatted date to the post file
+  touch "$FNAME"
 
-	echo "date: $YAML_DATE" >> $FNAME
+  # Write a little stuff to the file for the YAML Front Matter
 
-	# Echo the original post title to the YAML Front Matter header
+  echo "---" >> $FNAME
 
-	echo "title: $POST_TITLE" >> $FNAME
+  # Now we have to get the date, again. But this time for in the header (YAML Front Matter) of
+  # the file
 
-	# And, now, echo the "post" layout to the YAML Front Matter header
+  YAML_DATE=$(date "+%B %d %Y %X")
 
-	echo "layout: post" >> $FNAME
+  # Echo the YAML Formatted date to the post file
 
-	# Close the YAML Front Matter Header
+  echo "date: $YAML_DATE" >> $FNAME
 
-	echo "---" >> $FNAME
-	echo >> $FNAME
+  # Echo the original post title to the YAML Front Matter header
 
-	# Generate template text based on the post type
+  echo "title: $POST_TITLE" >> $FNAME
 
-	if [[ $JEKYLL_FORMATTING = "markdown" ]]
-	then
-		if [[ $POST_TYPE = "Text" ]]
-		then
-			true
-		fi
+  # And, now, echo the "post" layout to the YAML Front Matter header
 
-		if [[ $POST_TYPE = "Quote" ]]
-		then
-			echo "> Quote" >> $FNAME
-			echo >> $FNAME
-			echo "&mdash; Author" >> $FNAME
-		fi
+  echo "layout: post" >> $FNAME
 
-		if [[ $POST_TYPE = "Image" ]]
-		then
-			echo "![Alternate Text](/path/to/image/or/url)" >> $FNAME
-		fi
+  # Close the YAML Front Matter Header
 
-		if [[ $POST_TYPE = "Audio" ]]
-		then
-			echo "<html><audio src=\"/path/to/audio/file\" controls=\"controls\"></audio></html>" >> $FNAME
-		fi
+  echo "---" >> $FNAME
+  echo >> $FNAME
 
-		if [[ $POST_TYPE = "Video" ]]
-		then
-			echo "<html><video src=\"/path/to/video\" controls=\"controls\"></video></html>" >> $FNAME
-		fi
-	
-		if [[ $POST_TYPE = "Link" ]]
-		then
-			echo "[link][1]" >> $FNAME
-			echo >> $FNAME
-			echo "> Quote" >> $FNAME
-			echo >> $FNAME
-			echo "[1]: url" >> $FNAME
-		fi
-	fi
+  # Generate template text based on the post type
 
-	if [[ $JEKYLL_FORMATTING = "textile" ]]
-	then
-		if [[ $POST_TYPE = "Text" ]]
-		then
-			true
-		fi
+  if [[ $JEKYLL_FORMATTING = "markdown" ]]
+  then
+    if [[ $POST_TYPE = "Text" ]]
+    then
+      true
+    fi
 
-		if [[ $POST_TYPE = "Quote" ]]
-		then
-			echo "bq. Quote" >> $FNAME
-			echo >> $FNAME
-			echo "&mdash; Author" >> $FNAME
-		fi
+    if [[ $POST_TYPE = "Quote" ]]
+    then
+      echo "> Quote" >> $FNAME
+      echo >> $FNAME
+      echo "&mdash; Author" >> $FNAME
+    fi
 
-		if [[ $POST_TYPE = "Image" ]]
-		then
-			echo "!url(alt text)" >> $FNAME
-		fi
+    if [[ $POST_TYPE = "Image" ]]
+    then
+      echo "![Alternate Text](/path/to/image/or/url)" >> $FNAME
+    fi
 
-		if [[ $POST_TYPE = "Audio" ]]
-		then
-			echo "<html><audio src=\"/path/to/audio/file\" controls=\"controls\"></audio></html>" >> $FNAME
-		fi
+    if [[ $POST_TYPE = "Audio" ]]
+    then
+      echo "<html><audio src=\"/path/to/audio/file\" controls=\"controls\"></audio></html>" >> $FNAME
+    fi
 
-		if [[ $POST_TYPE = "Video" ]]
-		then
-			echo "<html><video src=\"/path/to/video\" controls=\"controls\"></video></html>" >> $FNAME
-		fi
+    if [[ $POST_TYPE = "Video" ]]
+    then
+      echo "<html><video src=\"/path/to/video\" controls=\"controls\"></video></html>" >> $FNAME
+    fi
 
-		if [[ $POST_TYPE = "Link" ]]
-		then
-			echo "\"Site\":url" >> $FNAME
-			echo >> $FNAME
-			echo "bq. Quote" >> $FNAME
-		fi
-	fi
+    if [[ $POST_TYPE = "Link" ]]
+    then
+      echo "[link][1]" >> $FNAME
+      echo >> $FNAME
+      echo "> Quote" >> $FNAME
+      echo >> $FNAME
+      echo "[1]: url" >> $FNAME
+    fi
+  fi
 
-	# Open the file in your favorite editor
+  if [[ $JEKYLL_FORMATTING = "textile" ]]
+  then
+    if [[ $POST_TYPE = "Text" ]]
+    then
+      true
+    fi
 
-	"$EDITOR" $FNAME
+    if [[ $POST_TYPE = "Quote" ]]
+    then
+      echo "bq. Quote" >> $FNAME
+      echo >> $FNAME
+      echo "&mdash; Author" >> $FNAME
+    fi
+
+    if [[ $POST_TYPE = "Image" ]]
+    then
+      echo "!url(alt text)" >> $FNAME
+    fi
+
+    if [[ $POST_TYPE = "Audio" ]]
+    then
+      echo "<html><audio src=\"/path/to/audio/file\" controls=\"controls\"></audio></html>" >> $FNAME
+    fi
+
+    if [[ $POST_TYPE = "Video" ]]
+    then
+      echo "<html><video src=\"/path/to/video\" controls=\"controls\"></video></html>" >> $FNAME
+    fi
+
+    if [[ $POST_TYPE = "Link" ]]
+    then
+      echo "\"Site\":url" >> $FNAME
+      echo >> $FNAME
+      echo "bq. Quote" >> $FNAME
+    fi
+  fi
+
+  # Open the file in your favorite editor
+
+  "$JEKYLL_EDITOR" $FNAME
+}
+
+function testsite() {
+  unset SITE
+  if [ -z "$1" ]
+  then
+    echo "Error: no site specified."
+    echo "The site is the name of the directory your project is in."
+    return 1
+  fi
+
+  for site in ${SITES[@]}
+  do
+    if [ "$(basename $site)" = "$1" ]
+    then
+      SITE=$site
+      break
+    fi
+  done
+
+  if [ -z "$SITE" ]
+  then
+    echo "No such site."
+    return 1
+  fi
+
+  builtin cd $SITE
+  jekyll --server --auto
+}
+
+function buildsite() {
+  unset SITE
+  if [ -z "$1" ]
+  then
+    echo "Error: no site specified."
+    echo "The site is the name of the directory your project is in."
+    return 1
+  fi
+
+  for site in ${SITES[@]}
+  do
+    if [ "$(basename $site)" = "$1" ]
+    then
+      SITE=$site
+      break
+    fi
+  done
+
+  if [ -z "$SITE" ]
+  then
+    echo "No such site."
+    return 1
+  fi
+
+  builtin cd $SITE
+  rm -rf _site
+  jekyll --no-server
+}
+
+function deploysite() {
+  unset SITE
+  if [ -z "$1" ]
+  then
+    echo "Error: no site specified."
+    echo "The site is the name of the directory your project is in."
+    return 1
+  fi
+
+  loc=0
+
+  for site in ${SITES[@]}
+  do
+    if [ "$(basename $site)" = "$1" ]
+    then
+      SITE=$site
+      REMOTE=${REMOTES[$loc]}
+      break
+    fi
+    loc=$(($loc+1))
+  done
+
+  if [ -z "$SITE" ]
+  then
+    echo "No such site."
+    return 1
+  fi
+
+  builtin cd $SITE
+  rsync -rz $REMOTE
 }
diff --git a/plugins/available/nvm.plugin.bash b/plugins/available/nvm.plugin.bash
new file mode 100644
index 0000000..a5145ec
--- /dev/null
+++ b/plugins/available/nvm.plugin.bash
@@ -0,0 +1,307 @@
+# Node Version Manager
+# Implemented as a bash function
+# To use source this file from your bash profile
+#
+# Implemented by Tim Caswell <tim@creationix.com>
+# with much bash help from Matthew Ranney
+
+export NVM_DIR=$HOME/.nvm
+
+if [ ! -d "$NVM_DIR" ]; then
+    mkdir $NVM_DIR
+fi
+
+# Auto detect the NVM_DIR
+if [ ! -d "$NVM_DIR" ]; then
+    export NVM_DIR=$(cd $(dirname ${BASH_SOURCE[0]:-$0}); pwd)
+fi
+
+# Emulate curl with wget, if necessary
+if [ ! `which curl` ]; then
+    if [ `which wget` ]; then
+        curl() {
+            ARGS="$* "
+            ARGS=${ARGS/-s /-q }
+            ARGS=${ARGS/-\# /}
+            ARGS=${ARGS/-C - /-c }
+            ARGS=${ARGS/-o /-O }
+
+            wget $ARGS
+        }
+    else
+        NOCURL='nocurl'
+        curl() { echo 'Need curl or wget to proceed.' >&2; }
+    fi
+fi
+
+# Expand a version using the version cache
+nvm_version()
+{
+    PATTERN=$1
+    VERSION=''
+    if [ -f "$NVM_DIR/alias/$PATTERN" ]; then
+        nvm_version `cat $NVM_DIR/alias/$PATTERN`
+        return
+    fi
+    # If it looks like an explicit version, don't do anything funny
+    if [[ "$PATTERN" == v*.*.* ]]; then
+        VERSION="$PATTERN"
+    fi
+    # The default version is the current one
+    if [ ! "$PATTERN" -o "$PATTERN" = 'current' ]; then
+        VERSION=`node -v 2>/dev/null`
+    fi
+    if [ "$PATTERN" = 'stable' ]; then
+        PATTERN='*.*[02468].'
+    fi
+    if [ "$PATTERN" = 'latest' ]; then
+        PATTERN='*.*.'
+    fi
+    if [ "$PATTERN" = 'all' ]; then
+        (cd $NVM_DIR; \ls -dG v* 2>/dev/null || echo "N/A")
+        return
+    fi
+    if [ ! "$VERSION" ]; then
+        VERSION=`(cd $NVM_DIR; \ls -d v${PATTERN}* 2>/dev/null) | sort -t. -k 2,1n -k 2,2n -k 3,3n | tail -n1`
+    fi
+    if [ ! "$VERSION" ]; then
+        echo "N/A"
+        return 13
+    elif [ -e "$NVM_DIR/$VERSION" ]; then
+        (cd $NVM_DIR; \ls -dG "$VERSION")
+    else
+        echo "$VERSION"
+    fi
+}
+
+nvm()
+{
+  if [ $# -lt 1 ]; then
+    nvm help
+    return
+  fi
+  case $1 in
+    "help" )
+      echo
+      echo "Node Version Manager"
+      echo
+      echo "Usage:"
+      echo "    nvm help                    Show this message"
+      echo "    nvm install <version>       Download and install a <version>"
+      echo "    nvm uninstall <version>     Uninstall a version"
+      echo "    nvm use <version>           Modify PATH to use <version>"
+      echo "    nvm ls                      List versions (installed versions are blue)"
+      echo "    nvm ls <version>            List versions matching a given description"
+      echo "    nvm deactivate              Undo effects of NVM on current shell"
+      echo "    nvm sync                    Update the local cache of available versions"
+      echo "    nvm alias [<pattern>]       Show all aliases beginning with <pattern>"
+      echo "    nvm alias <name> <version>  Set an alias named <name> pointing to <version>"
+      echo "    nvm unalias <name>          Deletes the alias named <name>"
+      echo "    nvm copy-packages <version> Install global NPM packages contained in <version> to current version"
+      echo
+      echo "Example:"
+      echo "    nvm install v0.4.0          Install a specific version number"
+      echo "    nvm use stable              Use the stable release"
+      echo "    nvm install latest          Install the latest, possibly unstable version"
+      echo "    nvm use 0.2                 Use the latest available 0.2.x release"
+      echo "    nvm alias default v0.4.0    Set v0.4.0 as the default"
+      echo
+    ;;
+    "install" )
+      if [ $# -ne 2 ]; then
+        nvm help
+        return
+      fi
+      [ "$NOCURL" ] && curl && return
+      VERSION=`nvm_version $2`
+      tarball=''
+      if [ "`curl -Is "http://nodejs.org/dist/$VERSION/node-$VERSION.tar.gz" | grep '200 OK'`" != '' ]; then
+        tarball="http://nodejs.org/dist/$VERSION/node-$VERSION.tar.gz"
+      elif [ "`curl -Is "http://nodejs.org/dist/node-$VERSION.tar.gz" | grep '200 OK'`" != '' ]; then
+        tarball="http://nodejs.org/dist/node-$VERSION.tar.gz"
+      fi
+      if (
+        [ ! -z $tarball ] && \
+        mkdir -p "$NVM_DIR/src" && \
+        cd "$NVM_DIR/src" && \
+        curl -C - -# $tarball -o "node-$VERSION.tar.gz" && \
+        tar -xzf "node-$VERSION.tar.gz" && \
+        cd "node-$VERSION" && \
+        ./configure --prefix="$NVM_DIR/$VERSION" && \
+        make && \
+        rm -f "$NVM_DIR/$VERSION" 2>/dev/null && \
+        make install
+        )
+      then
+        nvm use $VERSION
+        if ! which npm ; then
+          echo "Installing npm..."
+          # TODO: if node version 0.2.x add npm_install=0.2.19 before sh
+          curl http://npmjs.org/install.sh | clean=yes sh
+        fi
+      else
+        echo "nvm: install $VERSION failed!"
+      fi
+    ;;
+    "uninstall" )
+      [ $# -ne 2 ] && nvm help && return
+      if [[ $2 == `nvm_version` ]]; then
+        echo "nvm: Cannot uninstall currently-active node version, $2."
+        return
+      fi
+      VERSION=`nvm_version $2`
+      if [ ! -d $NVM_DIR/$VERSION ]; then
+        echo "$VERSION version is not installed yet"
+        return;
+      fi
+
+      # Delete all files related to target version.
+      (cd "$NVM_DIR" && \
+          rm -rf "node-$VERSION" 2>/dev/null && \
+          mkdir -p "$NVM_DIR/src" && \
+          cd "$NVM_DIR/src" && \
+          rm -f "node-$VERSION.tar.gz" 2>/dev/null && \
+          rm -rf "$NVM_DIR/$VERSION" 2>/dev/null)
+      echo "Uninstalled node $VERSION"
+
+      # Rm any aliases that point to uninstalled version.
+      for A in `grep -l $VERSION $NVM_DIR/alias/*`
+      do
+        nvm unalias `basename $A`
+      done
+
+      # Run sync in order to restore version stub file in $NVM_DIR.
+      nvm sync 1>/dev/null
+    ;;
+    "deactivate" )
+      if [[ $PATH == *$NVM_DIR/*/bin* ]]; then
+        export PATH=${PATH%$NVM_DIR/*/bin*}${PATH#*$NVM_DIR/*/bin:}
+        hash -r
+        echo "$NVM_DIR/*/bin removed from \$PATH"
+      else
+        echo "Could not find $NVM_DIR/*/bin in \$PATH"
+      fi
+      if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
+        export MANPATH=${MANPATH%$NVM_DIR/*/share/man*}${MANPATH#*$NVM_DIR/*/share/man:}
+        echo "$NVM_DIR/*/share/man removed from \$MANPATH"
+      else
+        echo "Could not find $NVM_DIR/*/share/man in \$MANPATH"
+      fi
+    ;;
+    "use" )
+      if [ $# -ne 2 ]; then
+        nvm help
+        return
+      fi
+      VERSION=`nvm_version $2`
+      if [ ! -d $NVM_DIR/$VERSION ]; then
+        echo "$VERSION version is not installed yet"
+        return;
+      fi
+      if [[ $PATH == *$NVM_DIR/*/bin* ]]; then
+        PATH=${PATH%$NVM_DIR/*/bin*}$NVM_DIR/$VERSION/bin${PATH#*$NVM_DIR/*/bin}
+      else
+        PATH="$NVM_DIR/$VERSION/bin:$PATH"
+      fi
+      if [[ $MANPATH == *$NVM_DIR/*/share/man* ]]; then
+        MANPATH=${MANPATH%$NVM_DIR/*/share/man*}$NVM_DIR/$VERSION/share/man${MANPATH#*$NVM_DIR/*/share/man}
+      else
+        MANPATH="$NVM_DIR/$VERSION/share/man:$MANPATH"
+      fi
+      export PATH
+      hash -r
+      export MANPATH
+      export NVM_PATH="$NVM_DIR/$VERSION/lib/node"
+      export NVM_BIN="$NVM_DIR/$VERSION/bin"
+      echo "Now using node $VERSION"
+    ;;
+    "ls" )
+      if [ $# -ne 1 ]; then
+        nvm_version $2
+        return
+      fi
+      nvm_version all
+      for P in {stable,latest,current}; do
+          echo -ne "$P: \t"; nvm_version $P
+      done
+      nvm alias
+      echo "# use 'nvm sync' to update from nodejs.org"
+    ;;
+    "alias" )
+      mkdir -p $NVM_DIR/alias
+      if [ $# -le 2 ]; then
+        (cd $NVM_DIR/alias && for ALIAS in `\ls $2* 2>/dev/null`; do
+            DEST=`cat $ALIAS`
+            VERSION=`nvm_version $DEST`
+            if [ "$DEST" = "$VERSION" ]; then
+                echo "$ALIAS -> $DEST"
+            else
+                echo "$ALIAS -> $DEST (-> $VERSION)"
+            fi
+        done)
+        return
+      fi
+      if [ ! "$3" ]; then
+          rm -f $NVM_DIR/alias/$2
+          echo "$2 -> *poof*"
+          return
+      fi
+      mkdir -p $NVM_DIR/alias
+      VERSION=`nvm_version $3`
+      if [ $? -ne 0 ]; then
+        echo "! WARNING: Version '$3' does not exist." >&2
+      fi
+      echo $3 > "$NVM_DIR/alias/$2"
+      if [ ! "$3" = "$VERSION" ]; then
+          echo "$2 -> $3 (-> $VERSION)"
+          echo "! WARNING: Moving target. Aliases to implicit versions may change without warning."
+      else
+        echo "$2 -> $3"
+      fi
+    ;;
+    "unalias" )
+      mkdir -p $NVM_DIR/alias
+      [ $# -ne 2 ] && nvm help && return
+      [ ! -f $NVM_DIR/alias/$2 ] && echo "Alias $2 doesn't exist!" && return
+      rm -f $NVM_DIR/alias/$2
+      echo "Deleted alias $2"
+    ;;
+    "sync" )
+        [ "$NOCURL" ] && curl && return
+        LATEST=`nvm_version latest`
+        STABLE=`nvm_version stable`
+        (cd $NVM_DIR
+        rm -f v* 2>/dev/null
+        printf "# syncing with nodejs.org..."
+        for VER in `curl -s http://nodejs.org/dist/ -o - | grep 'v[0-9].*' | sed -e 's/.*node-//' -e 's/\.tar\.gz.*//' -e 's/<[^>]*>//' -e 's/\/<[^>]*>.*//'`; do
+            touch $VER
+        done
+        echo " done."
+        )
+        [ "$STABLE" = `nvm_version stable` ] || echo "NEW stable: `nvm_version stable`"
+        [ "$LATEST" = `nvm_version latest` ] || echo "NEW latest: `nvm_version latest`"
+    ;;
+    "copy-packages" )
+        if [ $# -ne 2 ]; then
+          nvm help
+          return
+        fi
+        VERSION=`nvm_version $2`
+        ROOT=`nvm use $VERSION && npm -g root`
+        INSTALLS=`nvm use $VERSION > /dev/null && npm -g -p ll | grep "$ROOT\/[^/]\+$" | cut -d '/' -f 8 | cut -d ":" -f 2 | grep -v npm | tr "\n" " "`
+        npm install -g $INSTALLS
+    ;;
+    "clear-cache" )
+        rm -f $NVM_DIR/v* 2>/dev/null
+        echo "Cache cleared."
+    ;;
+    "version" )
+        nvm_version $2
+    ;;
+    * )
+      nvm help
+    ;;
+  esac
+}
+
+nvm ls default >/dev/null 2>&1 && nvm use default >/dev/null
diff --git a/plugins/available/osx.plugin.bash b/plugins/available/osx.plugin.bash
index e6271bd..cf55377 100644
--- a/plugins/available/osx.plugin.bash
+++ b/plugins/available/osx.plugin.bash
@@ -17,7 +17,7 @@
 function dock-switch() {
 
     if [ $(uname) = "Darwin" ]; then
-        
+
         if [ $1 = 3d ] ; then
             defaults write com.apple.dock no-glass -boolean NO
             killall Dock
@@ -28,10 +28,21 @@
 
         else
             echo "usage:"
-            echo "dock-switch 2d" 
+            echo "dock-switch 2d"
             echo "dock-switch 3d."
         fi
     else
-        echo "sorry. you're currently not using os x"
+        echo "Sorry, this only works on Mac OS X"
     fi
 }
+
+# Download a file and open it in Preview
+
+function prevcurl() {
+  if [ ! $(uname) = "Darwin" ]
+  then
+    echo "This function only works with Mac OS X"
+    return 1
+  fi
+  curl "$*" | open -fa "Preview"
+}
diff --git a/plugins/available/tmuxinator.plugin.bash b/plugins/available/tmuxinator.plugin.bash
new file mode 100644
index 0000000..d8236fc
--- /dev/null
+++ b/plugins/available/tmuxinator.plugin.bash
@@ -0,0 +1,3 @@
+#!/bin/bash
+
+[[ -s $HOME/.tmuxinator/scripts/tmuxinator ]] && . $HOME/.tmuxinator/scripts/tmuxinator
diff --git a/template/bash_profile.template.bash b/template/bash_profile.template.bash
index 30ab0fc..34d99ac 100644
--- a/template/bash_profile.template.bash
+++ b/template/bash_profile.template.bash
@@ -7,11 +7,11 @@
 export PATH=$PATH:~/.gem/ruby/1.8/bin:/opt/nginx/sbin
 
 # Path to the bash it configuration
-export BASH=$HOME/.bash_it
+export BASH_IT=$HOME/.bash_it
 
 # Lock and Load a custom theme file
 # location /.bash_it/themes/
-export BASH_THEME='bobby'
+export BASH_IT_THEME='bobby'
 
 # Your place for hosting Git repos. I use this for private repos.
 export GIT_HOSTING='git@git.domain.com'
@@ -26,18 +26,6 @@
 # Don't check mail when opening terminal.
 unset MAILCHECK
 
-# Change this to the path of your local jekyll root to use the jekyll aliases
-
-export JEKYLL_LOCAL_ROOT="$HOME/Sites/jekyllsite"
-
-# And change this to the remote server and root
-
-export JEKYLL_REMOTE_ROOT="user@server:/path/to/jekyll/root"
-
-# And, for the last of the jekyll variables, this is the formatting you use, eg: markdown,
-# textile, etc. Basically whatever you use as the extension for posts, without the preceding dot
-
-export JEKYLL_FORMATTING="markdown"
 
 # Change this to your console based IRC client of choice.
 
@@ -52,4 +40,4 @@
 #export VCPROMPT_EXECUTABLE=~/.vcprompt/bin/vcprompt
 
 # Load Bash It
-source $BASH/bash_it.sh
+source $BASH_IT/bash_it.sh
diff --git a/template/jekyllconfig.template.bash b/template/jekyllconfig.template.bash
new file mode 100644
index 0000000..291bf85
--- /dev/null
+++ b/template/jekyllconfig.template.bash
@@ -0,0 +1,21 @@
+# This is a space-delimited list of your Jekyll project paths
+
+SITES="$HOME/sites/project_1 $HOME/sites/project_2"
+
+# This is another space-delimited list.
+# This one is of the remote user@host:path location of your jekyll site
+# NOTE: The locations of these must correspond to the locations
+# of the sites in the first list
+# For instance, the host for the first Jekyll site
+# must be first in this list, the second second, etc.
+
+REMOTES="user@host_1:path user@host_2:path"
+
+# list of markup syntaxes to use for the sites,
+# Same rules as above. Can be HTML, textile, or markdown
+
+MARKUPS="markdown textile"
+
+# If you want to use a different editor for Jekyll, change the value of this variable
+
+JEKYLL_EDITOR="$EDITOR"
diff --git a/themes/base.theme.bash b/themes/base.theme.bash
index 7087662..05db36e 100644
--- a/themes/base.theme.bash
+++ b/themes/base.theme.bash
@@ -6,76 +6,104 @@
 SCM_THEME_PROMPT_PREFIX=' |'
 SCM_THEME_PROMPT_SUFFIX='|'
 
-GIT='git'
+SCM_GIT='git'
 SCM_GIT_CHAR='±'
 
-HG='hg'
+SCM_HG='hg'
 SCM_HG_CHAR='☿'
 
-SVN='svn'
+SCM_SVN='svn'
 SCM_SVN_CHAR='⑆'
 
+SCM_NONE='NONE'
 SCM_NONE_CHAR='○'
 
 RVM_THEME_PROMPT_PREFIX=' |'
 RVM_THEME_PROMPT_SUFFIX='|'
 
+VIRTUALENV_THEME_PROMPT_PREFIX=' |'
+VIRTUALENV_THEME_PROMPT_SUFFIX='|'
+
 function scm {
-  if [[ -d .git ]]; then SCM=$GIT
-  elif [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$GIT
-  elif [[ -d .hg ]]; then SCM=$HG
-  elif [[ -d .svn ]]; then SCM=$SVN
-  else SCM='NONE'
+  if [[ -d .git ]]; then SCM=$SCM_GIT
+  elif [[ -n "$(git symbolic-ref HEAD 2> /dev/null)" ]]; then SCM=$SCM_GIT
+  elif [[ -d .hg ]]; then SCM=$SCM_HG
+  elif [[ -n "$(hg root 2> /dev/null)" ]]; then SCM=$SCM_HG
+  elif [[ -d .svn ]]; then SCM=$SCM_SVN
+  else SCM=$SCM_NONE
   fi
 }
 
-function scm_char {
+function scm_prompt_char {
   if [[ -z $SCM ]]; then scm; fi
-  [[ $SCM == $GIT ]] && echo $SCM_GIT_CHAR && return
-  [[ $SCM == $HG ]] && echo $SCM_HG_CHAR && return
-  [[ $SCM == $SVN ]] && echo $SCM_SVN_CHAR && return
-  echo $SCM_NONE_CHAR
+  if [[ $SCM == $SCM_GIT ]]; then SCM_CHAR=$SCM_GIT_CHAR
+  elif [[ $SCM == $SCM_HG ]]; then SCM_CHAR=$SCM_HG_CHAR
+  elif [[ $SCM == $SCM_SVN ]]; then SCM_CHAR=$SCM_SVN_CHAR
+  else SCM_CHAR=$SCM_NONE_CHAR
+  fi
+}
+
+function scm_prompt_vars {
+  scm
+  scm_prompt_char
+  SCM_DIRTY=0
+  SCM_STATE=''
+  [[ $SCM == $SCM_GIT ]] && git_prompt_vars && return
+  [[ $SCM == $SCM_HG ]] && hg_prompt_vars && return
+  [[ $SCM == $SCM_SVN ]] && svn_prompt_vars && return
 }
 
 function scm_prompt_info {
-  if [[ -z $SCM ]]; then scm; fi
-  [[ $SCM == $GIT ]] && git_prompt_info && return
-  [[ $SCM == $HG ]] && hg_prompt_info && return
-  [[ $SCM == $SVN ]] && svn_prompt_info && return
+  scm
+  scm_prompt_char
+  SCM_DIRTY=0
+  SCM_STATE=''
+  [[ $SCM == $SCM_GIT ]] && git_prompt_info && return
+  [[ $SCM == $SCM_HG ]] && hg_prompt_info && return
+  [[ $SCM == $SCM_SVN ]] && svn_prompt_info && return
 }
 
-# Stolen from Steve Losh
-# left in for backwards-compatibility
-function prompt_char {
-    char=$(scm_char);
-    echo -e "$char"
-}
-
-function git_prompt_info {
+function git_prompt_vars {
   if [[ -n $(git status -s 2> /dev/null |grep -v ^# |grep -v "working directory clean") ]]; then
-      state=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    SCM_DIRTY=1
+     SCM_STATE=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
   else
-      state=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    SCM_DIRTY=0
+     SCM_STATE=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
   fi
-  prefix=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
-  suffix=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
-  ref=$(git symbolic-ref HEAD 2> /dev/null) || return
-
-  echo -e "$prefix${ref#refs/heads/}$state$suffix"
+  SCM_PREFIX=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+  SCM_SUFFIX=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+  local ref=$(git symbolic-ref HEAD 2> /dev/null)
+  SCM_BRANCH=${ref#refs/heads/}
+  SCM_CHANGE=$(git rev-parse HEAD 2>/dev/null)
 }
 
-function svn_prompt_info {
+function svn_prompt_vars {
   if [[ -n $(svn status 2> /dev/null) ]]; then
-      state=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    SCM_DIRTY=1
+      SCM_STATE=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
   else
-      state=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    SCM_DIRTY=0
+      SCM_STATE=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
   fi
-  prefix=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
-  suffix=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
-  ref=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
+  SCM_PREFIX=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+  SCM_SUFFIX=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+  SCM_BRANCH=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
+  SCM_CHANGE=$(svn info 2> /dev/null | sed -ne 's#^Revision: ##p' )
+}
 
-  [[ -z $ref ]] && return
-  echo -e "$prefix$ref$state$suffix"
+function hg_prompt_vars {
+    if [[ -n $(hg status 2> /dev/null) ]]; then
+      SCM_DIRTY=1
+        SCM_STATE=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    else
+      SCM_DIRTY=0
+        SCM_STATE=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    fi
+    SCM_PREFIX=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+    SCM_SUFFIX=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+    SCM_BRANCH=$(hg summary 2> /dev/null | grep branch | awk '{print $2}')
+    SCM_CHANGE=$(hg summary 2> /dev/null | grep parent | awk '{print $2}')
 }
 
 function rvm_version_prompt {
@@ -84,3 +112,35 @@
     echo -e "$RVM_THEME_PROMPT_PREFIX$rvm$RVM_THEME_PROMPT_SUFFIX"
   fi
 }
+
+function virtualenv_prompt {
+  if which virtualenv &> /dev/null; then
+    virtualenv=$([ ! -z "$VIRTUAL_ENV" ] && echo "`basename $VIRTUAL_ENV`") || return
+    echo -e "$VIRTUALENV_THEME_PROMPT_PREFIX$virtualenv$VIRTUALENV_THEME_PROMPT_SUFFIX"
+  fi
+}
+
+# backwards-compatibility
+function git_prompt_info {
+  git_prompt_vars
+  echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX"
+}
+
+function svn_prompt_info {
+  svn_prompt_vars
+  echo -e "$SCM_PREFIX$SCM_BRANCH$SCM_STATE$SCM_SUFFIX"
+}
+
+function hg_prompt_info() {
+  hg_prompt_vars
+  echo -e "$SCM_PREFIX$SCM_BRANCH:${SCM_CHANGE#*:}$SCM_STATE$SCM_SUFFIX"
+}
+
+function scm_char {
+  scm_prompt_char
+  echo -e "$SCM_CHAR"
+}
+
+function prompt_char {
+    scm_char
+}
diff --git a/themes/bobby/bobby.theme.bash b/themes/bobby/bobby.theme.bash
index 8b48ddd..cb51fb8 100644
--- a/themes/bobby/bobby.theme.bash
+++ b/themes/bobby/bobby.theme.bash
@@ -4,15 +4,6 @@
 SCM_THEME_PROMPT_PREFIX=" |"
 SCM_THEME_PROMPT_SUFFIX="${green}|"
 
-
-# PROMPT="\[${bold_cyan}\]\[\$(scm_char)\]\[${green}\]\[\$(scm_prompt_info)\]\[${purple}\]\[\$(rvm_version_prompt)\] \[${yellow}\]\h \[${reset_color}\]in \[${green}\]\w \[${reset_color}\]\[\n\[${green}\]→\[${reset_color}\] "
-
-
-PROMPT="\n\[${yellow}\]\[\$(rvm_version_prompt)\] \[${purple}\]\h \[${reset_color}\]in \[${green}\]\w\n\[${bold_cyan}\]\[\$(scm_char)\]\[${green}\]\[\$(scm_prompt_info)\] \[\[${green}\]→\[${reset_color}\] "
-
-
-
-# git theming
 GIT_THEME_PROMPT_DIRTY=" ${red}✗"
 GIT_THEME_PROMPT_CLEAN=" ${bold_green}✓"
 GIT_THEME_PROMPT_PREFIX=" ${green}|"
@@ -21,3 +12,9 @@
 RVM_THEME_PROMPT_PREFIX="|"
 RVM_THEME_PROMPT_SUFFIX="|"
 
+function prompt_command() {
+    #PS1="${bold_cyan}$(scm_char)${green}$(scm_prompt_info)${purple}$(rvm_version_prompt) ${yellow}\h ${reset_color}in ${green}\w ${reset_color}\n${green}→${reset_color} "
+    PS1="\n${yellow}$(rvm_version_prompt) ${purple}\h ${reset_color}in ${green}\w\n${bold_cyan}$(scm_char)${green}$(scm_prompt_info) ${green}→${reset_color} "
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/candy/candy.theme.bash b/themes/candy/candy.theme.bash
index ef0ba26..64d31b8 100644
--- a/themes/candy/candy.theme.bash
+++ b/themes/candy/candy.theme.bash
@@ -1,2 +1,6 @@
 #!/bin/bash
-PROMPT="${green}\u@\h ${blue}\T ${reset_color}${white}\w${reset_color}\[\$(scm_prompt_info)\]${blue} →${bold_blue} \$${reset_color} "
\ No newline at end of file
+function prompt_command() {
+    PS1="${green}\u@\h ${blue}\T ${reset_color}${white}\w${reset_color}$(scm_prompt_info)\]${blue} →${bold_blue} ${reset_color} ";
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/clean/clean.theme.bash b/themes/clean/clean.theme.bash
index 2fc418f..9998d65 100644
--- a/themes/clean/clean.theme.bash
+++ b/themes/clean/clean.theme.bash
@@ -1,9 +1,3 @@
-if [ "$(whoami)" = root ]; then no_color=$red; else no_color=$white; fi
-
-PROMPT="${no_color}\u${reset_color}:${blue}\W/${reset_color} \[\$(scm_prompt_info)\]$ "
-RPROMPT='[\t]'
-
-
 # git theming
 ZSH_THEME_GIT_PROMPT_PREFIX="${bold_blue}(${yellow}%B"
 ZSH_THEME_GIT_PROMPT_SUFFIX="%b${bold_blue})${reset_color} "
@@ -13,4 +7,14 @@
 
 # LS colors, made with http://geoff.greer.fm/lscolors/
 export LSCOLORS="Gxfxcxdxbxegedabagacad"
-export LS_COLORS='no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=41;33;01:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.lzma=00;31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mng=01;35:*.mov=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.tga=01;35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl=01;35:*.wmv=01;35:*.aiff=00;32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32:'
\ No newline at end of file
+export LS_COLORS='no=00:fi=00:di=01;34:ln=00;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=41;33;01:ex=00;32:*.cmd=00;32:*.exe=01;32:*.com=01;32:*.bat=01;32:*.btm=01;32:*.dll=01;32:*.tar=00;31:*.tbz=00;31:*.tgz=00;31:*.rpm=00;31:*.deb=00;31:*.arj=00;31:*.taz=00;31:*.lzh=00;31:*.lzma=00;31:*.zip=00;31:*.zoo=00;31:*.z=00;31:*.Z=00;31:*.gz=00;31:*.bz2=00;31:*.tb2=00;31:*.tz2=00;31:*.tbz2=00;31:*.avi=01;35:*.bmp=01;35:*.fli=01;35:*.gif=01;35:*.jpg=01;35:*.jpeg=01;35:*.mng=01;35:*.mov=01;35:*.mpg=01;35:*.pcx=01;35:*.pbm=01;35:*.pgm=01;35:*.png=01;35:*.ppm=01;35:*.tga=01;35:*.tif=01;35:*.xbm=01;35:*.xpm=01;35:*.dl=01;35:*.gl=01;35:*.wmv=01;35:*.aiff=00;32:*.au=00;32:*.mid=00;32:*.mp3=00;32:*.ogg=00;32:*.voc=00;32:*.wav=00;32:'
+
+function prompt_command() {
+
+    if [ "$(whoami)" = root ]; then no_color=$red; else no_color=$white; fi
+
+    PS1="${no_color}\u${reset_color}:${blue}\W/${reset_color} \[\$(scm_prompt_info)\]$ "
+    RPROMPT='[\t]'
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/colors.theme.bash b/themes/colors.theme.bash
index 9aa253f..ff8776d 100644
--- a/themes/colors.theme.bash
+++ b/themes/colors.theme.bash
@@ -1,44 +1,44 @@
 #!/bin/bash
 
-black=$'\e[0;30m'
-red=$'\e[0;31m'
-green=$'\e[0;32m'
-yellow=$'\e[0;33m'
-blue=$'\e[0;34m'
-purple=$'\e[0;35m'
-cyan=$'\e[0;36m'
-white=$'\e[1;37m'
-orange=$'\e[33;40m'
+black="\[\e[0;30m\]"
+red="\[\e[0;31m\]"
+green="\[\e[0;32m\]"
+yellow="\[\e[0;33m\]"
+blue="\[\e[0;34m\]"
+purple="\[\e[0;35m\]"
+cyan="\[\e[0;36m\]"
+white="\[\e[1;37m\]"
+orange="\[\e[33;40m\]"
 
-bold_black=$'\e[1;30m'
-bold_red=$'\e[1;31m'
-bold_green=$'\e[1;32m'
-bold_yellow=$'\e[1;33m'
-bold_blue=$'\e[1;34m'
-bold_purple=$'\e[1;35m'
-bold_cyan=$'\e[1;36m'
-bold_white=$'\e[1;37m'
-bold_orange=$'\e[1;33;40m'
+bold_black="\[\e[1;30m\]"
+bold_red="\[\e[1;31m\]"
+bold_green="\[\e[1;32m\]"
+bold_yellow="\[\e[1;33m\]"
+bold_blue="\[\e[1;34m\]"
+bold_purple="\[\e[1;35m\]"
+bold_cyan="\[\e[1;36m\]"
+bold_white="\[\e[1;37m\]"
+bold_orange="\[\e[1;33;40m\]"
 
-underline_black=$'\e[4;30m'
-underline_red=$'\e[4;31m'
-underline_green=$'\e[4;32m'
-underline_yellow=$'\e[4;33m'
-underline_blue=$'\e[4;34m'
-underline_purple=$'\e[4;35m'
-underline_cyan=$'\e[4;36m'
-underline_white=$'\e[4;37m'
-underline_orange=$'\e[4;33;40m'
+underline_black="\[\e[4;30m\]"
+underline_red="\[\e[4;31m\]"
+underline_green="\[\e[4;32m\]"
+underline_yellow="\[\e[4;33m\]"
+underline_blue="\[\e[4;34m\]"
+underline_purple="\[\e[4;35m\]"
+underline_cyan="\[\e[4;36m\]"
+underline_white="\[\e[4;37m\]"
+underline_orange="\[\e[4;33;40m\]"
 
-background_black=$'\e[40m'
-background_red=$'\e[41m'
-background_green=$'\e[42m'
-background_yellow=$'\e[43m'
-background_blue=$'\e[44m'
-background_purple=$'\e[45m'
-background_cyan=$'\e[46m'
-background_white=$'\e[47m'
+background_black="\[\e[40m\]"
+background_red="\[\e[41m\]"
+background_green="\[\e[42m\]"
+background_yellow="\[\e[43m\]"
+background_blue="\[\e[44m\]"
+background_purple="\[\e[45m\]"
+background_cyan="\[\e[46m\]"
+background_white="\[\e[47m\]"
 
 
-normal=$'\e[00m'
-reset_color=$'\e[39m'
\ No newline at end of file
+normal="\[\e[00m\]"
+reset_color="\[\e[39m\]"
diff --git a/themes/demula/demula.theme.bash b/themes/demula/demula.theme.bash
index 0e6744a..bd48e12 100644
--- a/themes/demula/demula.theme.bash
+++ b/themes/demula/demula.theme.bash
@@ -33,22 +33,22 @@
 #*color7: #E5E5E5
 
 # ----------------------------------------------------------------- COLOR CONF
-D_DEFAULT_COLOR='\[${normal}\]'
-D_INTERMEDIATE_COLOR='\[${white}\]'
-D_USER_COLOR='\[${purple}\]'
-D_SUPERUSER_COLOR='\[${red}\]'
-D_MACHINE_COLOR='\[${cyan}\]'
-D_DIR_COLOR='\[${green}\]'
-D_SCM_COLOR='\[${yellow}\]'
-D_BRANCH_COLOR='\[${yellow}\]'
-D_CHANGES_COLOR='\[${white}\]'
-D_CMDFAIL_COLOR='\[${red}\]'
-D_VIMSHELL_COLOR='\[${cyan}\]'
+D_DEFAULT_COLOR="${normal}"
+D_INTERMEDIATE_COLOR="${white}"
+D_USER_COLOR="${purple}"
+D_SUPERUSER_COLOR="${red}"
+D_MACHINE_COLOR="${cyan}"
+D_DIR_COLOR="${green}"
+D_SCM_COLOR="${yellow}"
+D_BRANCH_COLOR="${yellow}"
+D_CHANGES_COLOR="${white}"
+D_CMDFAIL_COLOR="${red}"
+D_VIMSHELL_COLOR="${cyan}"
 
 # ------------------------------------------------------------------ FUNCTIONS
 case $TERM in
   xterm*)
-      TITLEBAR="\[\033]0;\w\007\]"
+      TITLEBAR="\033]0;\w\007"
       ;;
   *)
       TITLEBAR=""
@@ -84,10 +84,10 @@
 
 # -------------------------------------------------------------- PROMPT OUTPUT
 prompt() {
-  local SAVE_CURSOR='\[\033[s\]'
-  local RESTORE_CURSOR='\[\033[u\]'
-  local MOVE_CURSOR_RIGHTMOST='\[\033[500C\]'
-  local MOVE_CURSOR_5_LEFT='\[\033[5D\]'
+  local SAVE_CURSOR='\033[s'
+  local RESTORE_CURSOR='\033[u'
+  local MOVE_CURSOR_RIGHTMOST='\033[500C'
+  local MOVE_CURSOR_5_LEFT='\033[5D'
 
   if [ $(uname) = "Linux" ];
   then
diff --git a/themes/doubletime/doubletime.theme.bash b/themes/doubletime/doubletime.theme.bash
index 91844f0..c3bf453 100644
--- a/themes/doubletime/doubletime.theme.bash
+++ b/themes/doubletime/doubletime.theme.bash
@@ -1,13 +1,25 @@
 #!/bin/bash
 SCM_THEME_PROMPT_DIRTY=''
 SCM_THEME_PROMPT_CLEAN=''
-SCM_GIT_CHAR='${bold_cyan}±${normal}'
-SCM_SVN_CHAR='${bold_cyan}⑆${normal}'
-SCM_HG_CHAR='${bold_red}☿${normal}'
+SCM_GIT_CHAR="${bold_cyan}±${normal}"
+SCM_SVN_CHAR="${bold_cyan}⑆${normal}"
+SCM_HG_CHAR="${bold_red}☿${normal}"
 SCM_THEME_PROMPT_PREFIX=""
 SCM_THEME_PROMPT_SUFFIX=""
-RVM_THEME_PROMPT_PREFIX=" ("
-RVM_THEME_PROMPT_SUFFIX=")"
+if [ ! -z $RVM_THEME_PROMPT_COLOR ]; then
+    RVM_THEME_PROMPT_COLOR=$(eval echo $`echo ${RVM_THEME_PROMPT_COLOR}`);
+else
+    RVM_THEME_PROMPT_COLOR="${red}"
+fi
+RVM_THEME_PROMPT_PREFIX="(${RVM_THEME_PROMPT_COLOR}rb${normal}: "
+RVM_THEME_PROMPT_SUFFIX=") "
+if [ ! -z $VIRTUALENV_THEME_PROMPT_COLOR ]; then
+    VIRTUALENV_THEME_PROMPT_COLOR=$(eval echo $`echo ${VIRTUALENV_THEME_PROMPT_COLOR}`);
+else
+    VIRTUALENV_THEME_PROMPT_COLOR="${green}"
+fi
+VIRTUALENV_THEME_PROMPT_PREFIX="(${VIRTUALENV_THEME_PROMPT_COLOR}py${normal}: "
+VIRTUALENV_THEME_PROMPT_SUFFIX=") "
 
 if [ ! -z $THEME_PROMPT_HOST_COLOR ]; then
     THEME_PROMPT_HOST_COLOR=$(eval echo $`echo ${THEME_PROMPT_HOST_COLOR}`);
@@ -17,22 +29,16 @@
 
 doubletime_scm_prompt() {
   CHAR=$(scm_char)
-  if [ $CHAR = $SCM_NONE_CHAR ]
-  then
+  if [ $CHAR = $SCM_NONE_CHAR ]; then
     return
-  else
+  elif [ $CHAR = $SCM_GIT_CHAR ]; then
     echo "$(git_prompt_status)"
+  else
+    echo "[$(scm_prompt_info)]"
   fi
 }
 
-virtualenv_prompt() {
-  if [ ! -z "$VIRTUAL_ENV" ]
-  then
-    echo "(`basename $VIRTUAL_ENV`) "
-  fi
-}
-
-prompt_setter() {
+function prompt_setter() {
   # Save history
   history -a
   history -c
@@ -44,8 +50,8 @@
       clock=$THEME_PROMPT_CLOCK_FORMAT
   fi
   PS1="
-$clock $(scm_char) [\[$THEME_PROMPT_HOST_COLOR\]\u@${THEME_PROMPT_HOST}\[$reset_color\]] $(virtualenv_prompt)\w
-$(doubletime_scm_prompt)\[$reset_color\] $ "
+$clock $(scm_char) [$THEME_PROMPT_HOST_COLOR\u@${THEME_PROMPT_HOST}$reset_color] $(virtualenv_prompt)$(rvm_version_prompt)\w
+$(doubletime_scm_prompt)$reset_color $ "
   PS2='> '
   PS4='+ '
 }
diff --git a/themes/hawaii50/hawaii50.theme.bash b/themes/hawaii50/hawaii50.theme.bash
new file mode 100644
index 0000000..93cef46
--- /dev/null
+++ b/themes/hawaii50/hawaii50.theme.bash
@@ -0,0 +1,200 @@
+#!/bin/bash
+#
+# This theme was obviously inspired a lot by 
+#
+# - Demula theme
+#
+# which in itself was inspired by :
+#
+# - Ronacher's dotfiles (mitsuhikos) - http://github.com/mitsuhiko/dotfiles/tree/master/bash/
+# - Glenbot - http://theglenbot.com/custom-bash-shell-for-development/
+# - My extravagant zsh - http://stevelosh.com/blog/2010/02/my-extravagant-zsh-prompt/
+# - Monokai colors - http://monokai.nl/blog/2006/07/15/textmate-color-theme/
+# - Bash_it modern theme
+#
+# Hawaii50 theme supports :
+#
+# - configurable directory length
+# - hg, svn, git detection (I work in all of them)
+# - virtualenv, rvm + gemsets
+# 
+# Screenshot: http://i.imgur.com/4IAMJ.png 
+#
+# by Ryan Kanno <ryankanno@localkinegrinds.com>
+#
+# And yes, we code out in Hawaii. :D
+#
+# Note: I also am really new to this bash scripting game, so if you see things
+# that are flat out wrong, or if you think of something neat, just send a pull
+# request.  This probably only works on a Mac - as some functions are OS 
+# specific like getting ip, etc.
+#
+
+# IMPORTANT THINGS TO CHANGE ==================================================
+
+# Show IP in prompt
+# One thing to be weary about if you have slow Internets
+IP_ENABLED=1
+
+# virtual prompts
+VIRTUAL_PROMPT_ENABLED=1
+
+# COLORS ======================================================================
+ORANGE='\[\e[0;33m\]'
+
+DEFAULT_COLOR="${white}"
+
+USER_COLOR="${purple}"
+SUPERUSER_COLOR="${red}"
+MACHINE_COLOR=$ORANGE
+IP_COLOR=$ORANGE
+DIRECTORY_COLOR="${green}"
+
+VE_COLOR="${cyan}"
+RVM_COLOR="${cyan}"
+
+REF_COLOR="${purple}"
+
+# SCM prompts
+SCM_THEME_PROMPT_DIRTY=" ${bold_red}✗${normal}"
+SCM_THEME_PROMPT_CLEAN=" ${bold_green}✓${normal}"
+SCM_THEME_PROMPT_PREFIX=' on '
+SCM_THEME_PROMPT_SUFFIX=''
+
+# rvm prompts
+RVM_THEME_PROMPT_PREFIX=''
+RVM_THEME_PROMPT_SUFFIX=''
+
+# virtualenv prompts
+VIRTUALENV_THEME_PROMPT_PREFIX=''
+VIRTUALENV_THEME_PROMPT_SUFFIX=''
+
+VIRTUAL_THEME_PROMPT_PREFIX=' using '
+VIRTUAL_THEME_PROMPT_SUFFIX=''
+
+# Max length of PWD to display
+MAX_PWD_LENGTH=20
+
+# Max length of Git Hex to display
+MAX_GIT_HEX_LENGTH=5
+
+# IP address
+IP_SEPARATOR=', '
+
+# FUNCS =======================================================================
+
+function ip {
+    myip=$(curl -s checkip.dyndns.org | grep -Eo '[0-9\.]+')
+    echo -e "$(ips | sed -e :a -e '$!N;s/\n/${IP_SEPARATOR}/;ta' | sed -e 's/127\.0\.0\.1\${IP_SEPARATOR}//g'), ${myip}"
+}
+
+# Displays ip prompt 
+function ip_prompt_info() {
+    if [[ $IP_ENABLED == 1 ]]; then
+        echo -e " ${DEFAULT_COLOR}(${IP_COLOR}$(ip)${DEFAULT_COLOR})"
+    fi 
+}
+
+# Displays virtual info prompt (virtualenv/rvm)
+function virtual_prompt_info() {
+    local virtual_env_info=$(virtualenv_prompt)
+    local rvm_info=$(rvm_version_prompt)
+    local virtual_prompt=""
+
+    local prefix=${VIRTUAL_THEME_PROMPT_PREFIX}
+    local suffix=${VIRTUAL_THEME_PROMPT_SUFFIX}
+
+    # If no virtual info, just return
+    [[ -z "$virtual_env_info" && -z "$rvm_info" ]] && return
+
+    # If virtual_env info present, append to prompt
+    [[ -n "$virtual_env_info" ]] && virtual_prompt="virtualenv: ${VE_COLOR}$virtual_env_info${DEFAULT_COLOR}"
+
+    if [[ -n "$rvm_info" ]]
+    then
+        [[ -n "$virtual_env_info" ]] && virtual_prompt="$virtual_prompt, "
+        virtual_prompt="${virtual_prompt}rvm: ${RVM_COLOR}$rvm_info${DEFAULT_COLOR}"
+    fi
+    echo -e "$prefix$virtual_prompt$suffix"
+}
+
+# Parse git info
+function git_prompt_info() {
+    if [[ -n $(git status -s 2> /dev/null |grep -v ^# |grep -v "working directory clean") ]]; then
+        state=${GIT_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    else
+        state=${GIT_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    fi
+    prefix=${GIT_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+    suffix=${GIT_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+    ref=$(git symbolic-ref HEAD 2> /dev/null) || return
+    commit_id=$(git rev-parse HEAD 2>/dev/null) || return
+
+    echo -e "$prefix${REF_COLOR}${ref#refs/heads/}${DEFAULT_COLOR}:${commit_id:0:$MAX_GIT_HEX_LENGTH}$state$suffix"
+}
+
+# Parse hg info
+function hg_prompt_info() {
+    if [[ -n $(hg status 2> /dev/null) ]]; then
+        state=${HG_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    else
+        state=${HG_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    fi
+    prefix=${HG_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+    suffix=${HG_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+    branch=$(hg summary 2> /dev/null | grep branch | awk '{print $2}')
+    changeset=$(hg summary 2> /dev/null | grep parent | awk '{print $2}')
+
+    echo -e "$prefix${REF_COLOR}${branch}${DEFAULT_COLOR}:${changeset#*:}$state$suffix"
+}
+
+# Parse svn info
+function svn_prompt_info() {
+    if [[ -n $(svn status --ignore-externals -q 2> /dev/null) ]]; then
+        state=${SVN_THEME_PROMPT_DIRTY:-$SCM_THEME_PROMPT_DIRTY}
+    else
+        state=${SVN_THEME_PROMPT_CLEAN:-$SCM_THEME_PROMPT_CLEAN}
+    fi
+    prefix=${SVN_THEME_PROMPT_PREFIX:-$SCM_THEME_PROMPT_PREFIX}
+    suffix=${SVN_THEME_PROMPT_SUFFIX:-$SCM_THEME_PROMPT_SUFFIX}
+    ref=$(svn info 2> /dev/null | awk -F/ '/^URL:/ { for (i=0; i<=NF; i++) { if ($i == "branches" || $i == "tags" ) { print $(i+1); break }; if ($i == "trunk") { print $i; break } } }') || return
+    [[ -z $ref ]] && return
+
+    revision=$(svn info 2> /dev/null | sed -ne 's#^Revision: ##p' )
+
+    echo -e "$prefix${REF_COLOR}$ref${DEFAULT_COLOR}:$revision$state$suffix"
+}
+
+# Displays last X characters of pwd 
+function limited_pwd() {
+
+    # Replace $HOME with ~ if possible 
+    RELATIVE_PWD=${PWD/#$HOME/\~}
+
+    local offset=$((${#RELATIVE_PWD}-$MAX_PWD_LENGTH))
+
+    if [ $offset -gt "0" ]
+    then
+        local truncated_symbol="..."
+        TRUNCATED_PWD=${RELATIVE_PWD:$offset:$MAX_PWD_LENGTH}
+        echo -e "${truncated_symbol}/${TRUNCATED_PWD#*/}"
+    else
+        echo -e "${RELATIVE_PWD}"
+    fi
+}
+
+# Displays the current prompt
+function prompt() {
+    local UC=$USER_COLOR
+    [ $UID -eq "0" ] && UC=$SUPERUSER_COLOR
+
+    if [[ $VIRTUAL_PROMPT_ENABLED == 1 ]]; then
+        PS1="$(scm_char) ${UC}\u ${DEFAULT_COLOR}at ${MACHINE_COLOR}\h$(ip_prompt_info) ${DEFAULT_COLOR}in ${DIRECTORY_COLOR}$(limited_pwd)${DEFAULT_COLOR}$(virtual_prompt_info)$(scm_prompt_info)${reset_color} \$ "
+    else
+        PS1="$(scm_char) ${UC}\u ${DEFAULT_COLOR}at ${MACHINE_COLOR}\h$(ip_prompt_info) ${DEFAULT_COLOR}in ${DIRECTORY_COLOR}$(limited_pwd)${DEFAULT_COLOR}$(scm_prompt_info)${reset_color} \$ "
+    fi
+    PS2='> '
+    PS4='+ '
+}
+
+PROMPT_COMMAND=prompt
diff --git a/themes/minimal/minimal.theme.bash b/themes/minimal/minimal.theme.bash
index 8de4a6c..76cb24d 100644
--- a/themes/minimal/minimal.theme.bash
+++ b/themes/minimal/minimal.theme.bash
@@ -1,7 +1,12 @@
-prompt_setter() {
-  PS1="${cyan}\W${normal} "
+#!/usr/bin/env bash
+
+SCM_THEME_PROMPT_PREFIX="${cyan}(${green}"
+SCM_THEME_PROMPT_SUFFIX="${cyan})"
+SCM_THEME_PROMPT_DIRTY=" ${red}✗"
+SCM_THEME_PROMPT_CLEAN=" ${green}✓"
+
+prompt() {
+  PS1="$(scm_prompt_info)${reset_color} ${cyan}\W${reset_color} "
 }
 
-PROMPT_COMMAND=prompt_setter
-
-export PS3=">> "
+PROMPT_COMMAND=prompt
diff --git a/themes/modern-t/modern-t.theme.bash b/themes/modern-t/modern-t.theme.bash
index 55da6e1..12e5b04 100644
--- a/themes/modern-t/modern-t.theme.bash
+++ b/themes/modern-t/modern-t.theme.bash
@@ -1,11 +1,11 @@
 SCM_THEME_PROMPT_PREFIX=""
 SCM_THEME_PROMPT_SUFFIX=""
 
-SCM_THEME_PROMPT_DIRTY=' ${bold_red}✗${normal}'
-SCM_THEME_PROMPT_CLEAN=' ${bold_green}✓${normal}'
-SCM_GIT_CHAR='${bold_green}±${normal}'
-SCM_SVN_CHAR='${bold_cyan}⑆${normal}'
-SCM_HG_CHAR='${bold_red}☿${normal}'
+SCM_THEME_PROMPT_DIRTY=" ${bold_red}✗${normal}"
+SCM_THEME_PROMPT_CLEAN=" ${bold_green}✓${normal}"
+SCM_GIT_CHAR="${bold_green}±${normal}"
+SCM_SVN_CHAR="${bold_cyan}⑆${normal}"
+SCM_HG_CHAR="${bold_red}☿${normal}"
 
 case $TERM in
 	xterm*)
diff --git a/themes/modern/modern.theme.bash b/themes/modern/modern.theme.bash
index 3efe9ff..32c7cab 100644
--- a/themes/modern/modern.theme.bash
+++ b/themes/modern/modern.theme.bash
@@ -1,11 +1,11 @@
 SCM_THEME_PROMPT_PREFIX=""
 SCM_THEME_PROMPT_SUFFIX=""
 
-SCM_THEME_PROMPT_DIRTY=' ${bold_red}✗${normal}'
-SCM_THEME_PROMPT_CLEAN=' ${bold_green}✓${normal}'
-SCM_GIT_CHAR='${bold_green}±${normal}'
-SCM_SVN_CHAR='${bold_cyan}⑆${normal}'
-SCM_HG_CHAR='${bold_red}☿${normal}'
+SCM_THEME_PROMPT_DIRTY=" ${bold_red}✗${normal}"
+SCM_THEME_PROMPT_CLEAN=" ${bold_green}✓${normal}"
+SCM_GIT_CHAR="${bold_green}±${normal}"
+SCM_SVN_CHAR="${bold_cyan}⑆${normal}"
+SCM_HG_CHAR="${bold_red}☿${normal}"
 
 case $TERM in
 	xterm*)
diff --git a/themes/n0qorg/n0qorg.theme.bash b/themes/n0qorg/n0qorg.theme.bash
index fcaca43..2b9def6 100644
--- a/themes/n0qorg/n0qorg.theme.bash
+++ b/themes/n0qorg/n0qorg.theme.bash
@@ -5,7 +5,11 @@
 # host directory (branch*)»
 # for example:
 # ananas ~/Code/bash-it/themes (master*)»
-PROMPT="${bold_blue}\[\$(hostname)\]${normal} \w${normal} ${bold_white}\[\$(git_prompt_info)\]${normal}» "
+function prompt_command() {
+    PS1="${bold_blue}[$(hostname)]${normal} \w${normal} ${bold_white}[$(git_prompt_info)]${normal}» "
+}
+
+PROMPT_COMMAND=prompt_command;
 
 ## git-theme
 # feel free to change git chars.
diff --git a/themes/pete/pete.theme.bash b/themes/pete/pete.theme.bash
index 95f243a..7b6702c 100644
--- a/themes/pete/pete.theme.bash
+++ b/themes/pete/pete.theme.bash
@@ -5,7 +5,7 @@
   history -a
   history -c
   history -r
-  PS1="(\t) $(scm_char) [\[$blue\]\u\[$reset_color\]@\[$green\]\H\[$reset_color\]] \[$yellow\]\w\[$reset_color\]$(scm_prompt_info)$(rvm_version_prompt) $\[$reset_color\] "
+  PS1="(\t) $(scm_char) [$blue\u$reset_color@$green\H$reset_color] $yellow\w${reset_color}$(scm_prompt_info)$(rvm_version_prompt) $reset_color "
   PS2='> '
   PS4='+ '
 }
diff --git a/themes/rainbowbrite/rainbowbrite.theme.bash b/themes/rainbowbrite/rainbowbrite.theme.bash
new file mode 100644
index 0000000..e4424bb
--- /dev/null
+++ b/themes/rainbowbrite/rainbowbrite.theme.bash
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+# based off of n0qorg
+# looks like, if you're in a git repo:
+# ± ~/path/to (branch ✓) $
+# in glorious red / blue / yellow color scheme
+
+prompt_setter() {
+  # Save history
+  history -a
+  history -c
+  history -r
+  # displays user@server in purple
+  # PS1="$red$(scm_char) $purple\u@\h$reset_color:$blue\w$yellow$(scm_prompt_info)$(rvm_version_prompt) $black\$$reset_color "
+  # no user@server
+  PS1="$red$(scm_char) $blue\w$yellow$(scm_prompt_info)$(rvm_version_prompt) $black\$$reset_color "
+  PS2='> '
+  PS4='+ '
+}
+
+PROMPT_COMMAND=prompt_setter
+
+SCM_NONE_CHAR='·'
+SCM_THEME_PROMPT_DIRTY=" ${red}✗"
+SCM_THEME_PROMPT_CLEAN=" ${green}✓"
+SCM_THEME_PROMPT_PREFIX=" ("
+SCM_THEME_PROMPT_SUFFIX="${yellow})"
+RVM_THEME_PROMPT_PREFIX=" ("
+RVM_THEME_PROMPT_SUFFIX=")"
diff --git a/themes/sirup/sirup.theme.bash b/themes/sirup/sirup.theme.bash
index 5066587..146cc35 100644
--- a/themes/sirup/sirup.theme.bash
+++ b/themes/sirup/sirup.theme.bash
@@ -13,6 +13,10 @@
 
   [ "$full" != "" ] && echo "$full"
 }
+ 
+function prompt_command() {
+    # Check http://github.com/Sirupsen/dotfiles for screenshot
+    PS1="$blue\W/$bold_blue$(rvm_version_prompt)$bold_green$(__git_ps1 " (%s)") ${normal}$ "
+}
 
-# Check http://github.com/Sirupsen/dotfiles for screenshot
-PS1='\[$blue\]\W/\[$bold_blue\]$(rvm_version_prompt)\[$bold_green\]$(__git_ps1 " (%s)") \[${normal}\]$ '
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/standard/standard.theme.bash b/themes/standard/standard.theme.bash
index 5ba288c..87402c7 100644
--- a/themes/standard/standard.theme.bash
+++ b/themes/standard/standard.theme.bash
@@ -1,7 +1,3 @@
-PROMPT='\[${green}\]\u\[${normal}\]@\[${green}\]\h\[${normal}\]:\[${blue}\]\w\[${normal}\]\[${red}\]$(prompt_char)$(git_prompt_info)\[${normal}\]\$ '
-
-
-
 # scm themeing
 SCM_THEME_PROMPT_DIRTY="×"
 SCM_THEME_PROMPT_CLEAN="✓"
@@ -19,4 +15,10 @@
 	*)
 	TITLEBAR=""
 	;;
-esac
\ No newline at end of file
+esac
+
+function prompt_command() {
+    PROMPT='${green}\u${normal}@${green}\h${normal}:${blue}\w${normal}${red}$(prompt_char)$(git_prompt_info)${normal}\$ '
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/tylenol/tylenol.theme.bash b/themes/tylenol/tylenol.theme.bash
new file mode 100644
index 0000000..c915f56
--- /dev/null
+++ b/themes/tylenol/tylenol.theme.bash
@@ -0,0 +1,20 @@
+#!/bin/bash
+#
+# Based on 'bobby' theme with the addition of virtualenv_prompt
+#
+
+SCM_THEME_PROMPT_DIRTY=" ${red}✗"
+SCM_THEME_PROMPT_CLEAN=" ${green}✓"
+SCM_THEME_PROMPT_PREFIX=" ${yellow}|${reset_color}"
+SCM_THEME_PROMPT_SUFFIX="${yellow}|"
+
+RVM_THEME_PROMPT_PREFIX="|"
+RVM_THEME_PROMPT_SUFFIX="|"
+VIRTUALENV_THEME_PROMPT_PREFIX='|'
+VIRTUALENV_THEME_PROMPT_SUFFIX='|'
+
+function prompt_command() {
+    PS1="\n${green}$(virtualenv_prompt)${red}$(rvm_version_prompt) ${reset_color}\h ${orange}in ${reset_color}\w\n${yellow}$(scm_char)$(scm_prompt_info) ${yellow}→${white} "
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/zitron/zitron.theme.bash b/themes/zitron/zitron.theme.bash
index c072686..3ec4d97 100644
--- a/themes/zitron/zitron.theme.bash
+++ b/themes/zitron/zitron.theme.bash
@@ -1,12 +1,6 @@
 #!/bin/bash
 # zitron theme by Florian Baumann <flo@noqqe.de>
 
-## look-a-like
-# user:host:pwd git-branch(*)$
-# for example:
-# noqqe:deathstar:themes master*$
-PROMPT="${no_color}\u:\[\$(hostname)\]${normal}:${bold_yellow}\W/${normal} \[\$(git_prompt_info)\]${reset_color}$ "
-
 ## git-theme
 # feel free to change git chars.
 GIT_THEME_PROMPT_DIRTY="${bold_yellow}*${normal}"
@@ -18,3 +12,13 @@
 # thanks a lot to http://geoff.greer.fm/lscolors/
 export LSCOLORS="Gxfxcxdxbxegedabagacad"
 export LS_COLORS="no=00:fi=00:di=01;33:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;34:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:"
+
+function prompt_command() {
+    ## look-a-like
+    # user:host:pwd git-branch(*)$
+    # for example:
+    # noqqe:deathstar:themes master*$
+    PS1="${no_color}\u:$(hostname)${normal}:${bold_yellow}\W/${normal} $(git_prompt_info)${reset_color}$ "
+}
+
+PROMPT_COMMAND=prompt_command;
diff --git a/themes/zork/zork.theme.bash b/themes/zork/zork.theme.bash
index 54615d7..f541c0d 100644
--- a/themes/zork/zork.theme.bash
+++ b/themes/zork/zork.theme.bash
@@ -1,11 +1,11 @@
 SCM_THEME_PROMPT_PREFIX=""
 SCM_THEME_PROMPT_SUFFIX=""
 
-SCM_THEME_PROMPT_DIRTY=' ${bold_red}✗${normal}'
-SCM_THEME_PROMPT_CLEAN=' ${bold_green}✓${normal}'
-SCM_GIT_CHAR='${bold_green}±${normal}'
-SCM_SVN_CHAR='${bold_cyan}⑆${normal}'
-SCM_HG_CHAR='${bold_red}☿${normal}'
+SCM_THEME_PROMPT_DIRTY=" ${bold_red}✗${normal}"
+SCM_THEME_PROMPT_CLEAN=" ${bold_green}✓${normal}"
+SCM_GIT_CHAR="${bold_green}±${normal}"
+SCM_SVN_CHAR="${bold_cyan}⑆${normal}"
+SCM_HG_CHAR="${bold_red}☿${normal}"
 
 #Mysql Prompt
 export MYSQL_PS1="(\u@\h) [\d]> "