diff --git a/plugins/history-sync/README.md b/plugins/history-sync/README.md
new file mode 100644
index 000000000..d79a4dfbf
--- /dev/null
+++ b/plugins/history-sync/README.md
@@ -0,0 +1,23 @@
+## An oh-my-zsh plugin for gpg encrypted, internet synchronized zsh history using git.
+
+That is, if you'd like an easy way to securely synchronise your zsh_history across many computers connected to the internet, this plugin will help you. You could even automate it using something like cron for a daily or even hourly sync.
+
+### How do I use it?
+
+1. Create a git repo for housing your encrypted zsh_history file (local or remote)
+ - Mine is $HOME/.zsh_history_proj
+2. Activate history-sync plugin in your .zshrc
+ - git clone git@github.com:wulfgarpro/history-sync.git $HOME/.oh-my-zsh/plugins/.
+3. Export environment variables (or use defaults found in history-sync.plugin.zsh)
+
These are:
+ - ZSH_HISTORY_FILE
+ - ZSH_HISTORY_PROJ
+ - ZSH_HISTORY_FILE_ENC
+ - GIT_COMMIT_MSG
+4. Ensure your gpg/pgp setup is complete and you have a public/private key pair
+
i.e.:
+ - gpg --list-keys
+5. Run zhpl alias to pull
+6. Run zhps alias to push
+7. Run zhsync to pull/push
+
diff --git a/plugins/history-sync/history-sync.plugin.zsh b/plugins/history-sync/history-sync.plugin.zsh
new file mode 100644
index 000000000..1a1d103d7
--- /dev/null
+++ b/plugins/history-sync/history-sync.plugin.zsh
@@ -0,0 +1,105 @@
+###
+# James Fraser
+#
+###
+
+autoload -U colors
+colors
+
+ZSH_HISTORY_FILE=$HOME/.zsh_history
+ZSH_HISTORY_PROJ=$HOME/.zsh_history_proj
+ZSH_HISTORY_FILE_ENC=$ZSH_HISTORY_PROJ/zsh_history
+GIT_COMMIT_MSG="latest $(date)"
+
+function print_git_error_msg() {
+ echo "$bold_color$fg[red]Fix your git repo...${reset_color}";
+}
+
+function print_gpg_encrypt_error_msg() {
+ echo "$bold_color$fg[red]GPG failed to encrypt history file... exiting.${reset_color}";
+}
+
+function print_gpg_decrypt_error_msg() {
+ echo "$bold_color$fg[red]GPG failed to decrypt history file... exiting.${reset_color}";
+}
+
+# Pull current master and merge with .zsh_history
+function history_sync_pull() {
+ cp -a $HOME/{.zsh_history,.zsh_history.backup}
+ DIR=$CWD
+ cd $ZSH_HISTORY_PROJ && git pull
+ if [[ $? != 0 ]]; then
+ print_git_error_msg
+ cd $DIR
+ return
+ fi
+
+ # Decrypt
+ gpg --output zsh_history_decrypted --decrypt zsh_history
+ if [[ $? != 0 ]]; then
+ print_gpg_decrypt_error_msg
+ cd $DIR
+ return
+ fi
+
+ # Merge using sort unique
+ cat $HOME/.zsh_history zsh_history_decrypted | sort -u > $HOME/.zsh_history
+ rm zsh_history_decrypted
+ cd $DIR
+}
+
+# Push current history to master
+function history_sync_push() {
+ echo -n "Please enter GPG recipient name: "
+ read name
+
+# Encrypt
+ if [[ -n $name ]]; then
+ gpg -v -r $NAME --encrypt --sign --armor --output $ZSH_HISTORY_FILE_ENC $ZSH_HISTORY_FILE
+ if [[ $? != 0 ]]; then
+ print_gpg_encrypt_error_msg
+ return
+ fi
+
+ echo -n "$bold_color$fg[yellow]Do you want to commit current local history file? ${reset_color}"
+ read commit
+ if [[ -n $commit ]]; then
+ case $commit in
+ [Yy]* )
+ DIR=$CWD
+ cd $ZSH_HISTORY_PROJ && git add * && git commit -am $GIT_COMMIT_MSG
+ echo -n "$bold_color$fg[yellow]Do you want to push to remote? ${reset_color}"
+ read push
+ if [[ -n $push ]]; then
+ case $push in
+ [Yy]* )
+ git push
+ if [[ $? != 0 ]]; then
+ print_git_error_msg
+ cd $DIR
+ return
+ fi
+ cd $DIR
+ ;;
+ esac
+ fi
+
+ if [[ $? != 0 ]]; then
+ print_git_error_msg
+ cd $DIR
+ return
+ fi
+ ;;
+ [Nn]* )
+ ;;
+ * )
+ ;;
+ esac
+ fi
+ fi
+}
+
+alias zhpl=history_sync_pull
+alias zhps=history_sync_push
+alias zhsync="history_sync_pull && history_sync_push"
+