diff --git a/bash_it.sh b/bash_it.sh
index a030069..7734c10 100644
--- a/bash_it.sh
+++ b/bash_it.sh
@@ -56,6 +56,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/plugins/available/jekyll.plugins.bash b/plugins/available/jekyll.plugins.bash
index aebe69b..8efdd11 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 "$EDITOR" ]
+  then
+    nano "${POSTS[$POST_TO_EDIT]}"
+  else
+    "$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
+
+  "$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
 }
