Merge branch 'develop'
diff --git a/bin/build.sh b/bin/build.sh
index 94beda1..60cb17c 100755
--- a/bin/build.sh
+++ b/bin/build.sh
@@ -104,8 +104,6 @@
 
 # Build migration tools
 echo "Going to build PredictionIO Migration Tools..."
-cd $BASE/tools/migration/0.4/settings04
-$SBT $CLEAN update pack
 cd $BASE/tools/migration/0.5/appdata
 $SBT $CLEAN update pack
 
diff --git a/bin/change-version.py b/bin/change-version.py
index 3543559..1ae8b57 100755
--- a/bin/change-version.py
+++ b/bin/change-version.py
@@ -31,6 +31,7 @@
     'commons/build.sbt',
     'dist/bin/*',
     'dist/bin/*/*',
+    'dist/conf/init.json',
     'dist/conf/predictionio.conf',
     'output/build.sbt',
     'process/commons/hadoop/scalding/build.sbt',
diff --git a/bin/common.sh b/bin/common.sh
index 1ec89cc..a99e0f3 100644
--- a/bin/common.sh
+++ b/bin/common.sh
@@ -2,7 +2,7 @@
 
 # This script should be sourced with $BASE set to the base of the repository
 
-VERSION=0.5.0
+VERSION=0.5.1
 
 # Play framework related
 PLAY_OPTS=
diff --git a/bin/package-updater.sh b/bin/package-updater.sh
new file mode 100755
index 0000000..1b2dbe4
--- /dev/null
+++ b/bin/package-updater.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env sh
+
+# PredictionIO Updater Package Script
+
+# NOTE: Run this script after bin/build.sh to package things up as an updater
+
+# Get the absolute path of the build script
+SCRIPT="$0"
+while [ -h "$SCRIPT" ] ; do
+	SCRIPT=`readlink "$SCRIPT"`
+done
+
+# Get the base directory of the repo
+DIR=`dirname $SCRIPT`/..
+cd $DIR
+BASE=`pwd`
+
+. "$BASE/bin/common.sh"
+
+UPDATER_NAME="PredictionIO-$VERSION-updater"
+
+cd "$BASE/tools/softwaremanager/target"
+rm -rf $UPDATER_NAME
+rm -f "$UPDATER_NAME.zip"
+cp -R pack $UPDATER_NAME
+zip -q -r "$UPDATER_NAME.zip" "$UPDATER_NAME"
+
+echo "Packaging finished at $BASE/tools/softwaremanager/target/$UPDATER_NAME.zip"
diff --git a/bin/package.sh b/bin/package.sh
index 911a3f1..bc5e5cb 100755
--- a/bin/package.sh
+++ b/bin/package.sh
@@ -55,7 +55,6 @@
 cp "$BASE/process/engines/itemrec/evaluations/scala/paramgen/target/scala-2.10/PredictionIO-Process-ItemRec-Evaluations-ParamGen-assembly-$VERSION.jar" "$PACKAGE_DIR/lib"
 cp "$BASE/process/engines/itemsim/algorithms/hadoop/scalding/target/scala-2.9.2/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-$VERSION.jar" "$PACKAGE_DIR/lib"
 cp -n $BASE/tools/conncheck/target/pack/lib/* $PACKAGE_DIR/lib
-cp -n $BASE/tools/migration/0.4/settings04/target/pack/lib/* $PACKAGE_DIR/lib
 cp -n $BASE/tools/migration/0.5/appdata/target/pack/lib/* $PACKAGE_DIR/lib
 cp -n $BASE/tools/settingsinit/target/pack/lib/* $PACKAGE_DIR/lib
 cp -n $BASE/tools/softwaremanager/target/pack/lib/* $PACKAGE_DIR/lib
diff --git a/commons/build.sbt b/commons/build.sbt
index 696cb7c..396d3af 100644
--- a/commons/build.sbt
+++ b/commons/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Commons"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
diff --git a/dist/bin/backup b/dist/bin/backup
index b336709..82525c9 100755
--- a/dist/bin/backup
+++ b/dist/bin/backup
@@ -129,24 +129,24 @@
 JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.3.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-io-2.4.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/kryo-2.21.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
 JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scopt_2.10-3.1.0.jar"
diff --git a/dist/bin/common.sh b/dist/bin/common.sh
index 6550f87..38a496e 100644
--- a/dist/bin/common.sh
+++ b/dist/bin/common.sh
@@ -2,7 +2,7 @@
 
 # This script should be sourced with $BASE set to the base of the repository
 
-VERSION=0.5.0
+VERSION=0.5.1
 
 # Play framework related
 PLAY_OPTS=""
diff --git a/dist/bin/conncheck b/dist/bin/conncheck
index 43a1031..7399063 100755
--- a/dist/bin/conncheck
+++ b/dist/bin/conncheck
@@ -144,8 +144,8 @@
 JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-connection-check-tool_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-connection-check-tool_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/slf4j-api-1.6.0.jar"
diff --git a/dist/bin/migration/appdata b/dist/bin/migration/appdata
index 5725211..432b442 100755
--- a/dist/bin/migration/appdata
+++ b/dist/bin/migration/appdata
@@ -144,8 +144,8 @@
 JARS="${JARS}:${PROG_HOME}/../lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/../lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/../lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/../lib/predictionio-0.4-to-0.5-appdata-migration_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/../lib/predictionio-commons_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/../lib/predictionio-0.4-to-0.5-appdata-migration_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/../lib/predictionio-commons_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/../lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/../lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/../lib/slf4j-api-1.6.0.jar"
diff --git a/dist/bin/restore b/dist/bin/restore
index c8ad021..0383feb 100755
--- a/dist/bin/restore
+++ b/dist/bin/restore
@@ -129,24 +129,24 @@
 JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.3.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-io-2.4.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/kryo-2.21.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
 JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scopt_2.10-3.1.0.jar"
diff --git a/dist/bin/settings04 b/dist/bin/settings04
deleted file mode 100755
index f169668..0000000
--- a/dist/bin/settings04
+++ /dev/null
@@ -1,147 +0,0 @@
-#!/bin/sh
-#/*--------------------------------------------------------------------------
-# *  Copyright 2012 Taro L. Saito
-# *
-# *  Licensed under the Apache License, Version 2.0 (the "License");
-# *  you may not use this file except in compliance with the License.
-# *  You may obtain a copy of the License at
-# *
-# *     http://www.apache.org/licenses/LICENSE-2.0
-# *
-# *  Unless required by applicable law or agreed to in writing, software
-# *  distributed under the License is distributed on an "AS IS" BASIS,
-# *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# *  See the License for the specific language governing permissions and
-# *  limitations under the License.
-# *--------------------------------------------------------------------------*/
-
-if [ -z "$PROG_HOME" ] ; then
-  ## resolve links - $0 may be a link to PROG_HOME
-  PRG="$0"
-
-  # need this for relative symlinks
-  while [ -h "$PRG" ] ; do
-    ls=`ls -ld "$PRG"`
-    link=`expr "$ls" : '.*-> \(.*\)$'`
-    if expr "$link" : '/.*' > /dev/null; then
-      PRG="$link"
-    else
-      PRG="`dirname "$PRG"`/$link"
-    fi
-  done
-
-  saveddir=`pwd`
-
-  PROG_HOME=`dirname "$PRG"`/..
-
-  # make it fully qualified
-  PROG_HOME=`cd "$PROG_HOME" && pwd`
-
-  cd "$saveddir"
-fi
-
-
-cygwin=false
-mingw=false
-darwin=false
-case "`uname`" in
-  CYGWIN*) cygwin=true;;
-  MINGW*) mingw=true;;
-  Darwin*) darwin=true
-           if [ -z "$JAVA_VERSION" ] ; then
-             JAVA_VERSION="CurrentJDK"
-           else
-            echo "Using Java version: $JAVA_VERSION" 1>&2
-           fi
-           if [ -z "$JAVA_HOME" ] ; then
-             JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/${JAVA_VERSION}/Home
-           fi
-           JVM_OPT="$JVM_OPT -Xdock:name=${PROG_NAME} -Xdock:icon=$PROG_HOME/icon-mac.png -Dcom.apple.macos.useScreenMenuBar=true"
-           JAVACMD="`which java`"
-           ;;
-esac
-
-# Resolve JAVA_HOME from javac command path
-if [ -z "$JAVA_HOME" ]; then
-  javaExecutable="`which javac`"
-  if [ -n "$javaExecutable" -a ! "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
-    # readlink(1) is not available as standard on Solaris 10.
-    readLink=`which readlink`
-    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
-      javaExecutable="`readlink -f \"$javaExecutable\"`"
-      javaHome="`dirname \"$javaExecutable\"`"
-      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
-      JAVA_HOME="$javaHome"
-      export JAVA_HOME
-    fi
-  fi
-fi
-
-
-if [ -z "$JAVACMD" ] ; then
-  if [ -n "$JAVA_HOME"  ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD="$JAVA_HOME/jre/sh/java"
-    else
-      JAVACMD="$JAVA_HOME/bin/java"
-    fi
-  else
-    JAVACMD="`which java`"
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly."
-  echo "  We cannot execute $JAVACMD"
-  exit 1
-fi
-
-if [ -z "$JAVA_HOME" ] ; then
-  echo "Warning: JAVA_HOME environment variable is not set."
-fi
-
-CLASSPATH_SUFFIX=""
-
-# For Cygwin, switch paths to Windows-mixed format before running java
-if $cygwin; then
-  [ -n "$PROG_HOME" ] &&
-    PROG_HOME=`cygpath -am "$PROG_HOME"`
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME=`cygpath -am "$JAVA_HOME"`
-  CLASSPATH_SUFFIX=";"
-#  [ -n "$HOME" ] &&
-#    HOME=`cygpath --path --windows "$HOME"`
-fi
-
-# For Migwn, ensure paths are in UNIX format before anything is touched
-if $mingw ; then
-  [ -n "$PROG_HOME" ] &&
-    PROG_HOME="`(cd "$PROG_HOME"; pwd)`"
-  [ -n "$JAVA_HOME" ] &&
-    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
-  # TODO classpath?
-fi
-
-
-PROG_NAME=settings04
-
-JARS="${PROG_HOME}/lib/predictionio-0.3-to-0.4-settings-migration_2.10-0.4.jar:"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.10.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-concurrent_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-core_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-effect_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/slf4j-api-1.6.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/specs2_2.10-1.13.jar"
-
-exec "$JAVACMD" ${JVM_OPT} -cp "${JARS}" -Dprog.home="${PROG_HOME}" io.prediction.tools.migration.Settings04 $@
-
diff --git a/dist/bin/settingsinit b/dist/bin/settingsinit
index db3c46c..12f0ccc 100755
--- a/dist/bin/settingsinit
+++ b/dist/bin/settingsinit
@@ -126,26 +126,30 @@
 
 PROG_NAME=settingsinit
 
-JARS="${PROG_HOME}/lib/predictionio-settings-initialization_2.10-0.5.0.jar:"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/jline-2.9.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.10.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
+JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-settings-initialization_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-concurrent_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-core_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-effect_2.10-7.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/slf4j-api-1.6.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/slf4j-nop-1.6.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/specs2_2.10-1.13.jar"
 
 JVM_OPT="$JVM_OPT -Dconfig.file=${PROG_HOME}/conf/predictionio.conf -Dio.prediction.base=$PROG_HOME"
 
diff --git a/dist/bin/start-admin.sh b/dist/bin/start-admin.sh
index 6cc0eed..4f45744 100755
--- a/dist/bin/start-admin.sh
+++ b/dist/bin/start-admin.sh
@@ -17,15 +17,19 @@
 
 LIB_DIR="$BASE/lib"
 
-JARS="$LIB_DIR/predictionio-admin_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/akka-actor_2.10.jar"
 JARS="${JARS}:$LIB_DIR/akka-slf4j_2.10.jar"
+JARS="${JARS}:$LIB_DIR/asm-4.0.jar"
+JARS="${JARS}:$LIB_DIR/asm-commons-4.0.jar"
+JARS="${JARS}:$LIB_DIR/asm-tree-4.0.jar"
 JARS="${JARS}:$LIB_DIR/async-http-client.jar"
-JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/commons-codec-1.7.jar"
+JARS="${JARS}:$LIB_DIR/bijection-core_2.10-0.3.0.jar"
+JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/chill_2.10-0.2.2.jar"
+JARS="${JARS}:$LIB_DIR/commons-codec-1.8.jar"
 JARS="${JARS}:$LIB_DIR/commons-lang3.jar"
 JARS="${JARS}:$LIB_DIR/commons-logging.jar"
 JARS="${JARS}:$LIB_DIR/config.jar"
@@ -42,16 +46,21 @@
 JARS="${JARS}:$LIB_DIR/jta.jar"
 JARS="${JARS}:$LIB_DIR/jul-to-slf4j.jar"
 JARS="${JARS}:$LIB_DIR/junit-4.11.jar"
+JARS="${JARS}:$LIB_DIR/kryo-2.17.jar"
 JARS="${JARS}:$LIB_DIR/logback-classic.jar"
 JARS="${JARS}:$LIB_DIR/logback-core.jar"
-JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.10.1.jar"
+JARS="${JARS}:$LIB_DIR/minlog-1.2.jar"
+JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:$LIB_DIR/netty.jar"
 JARS="${JARS}:$LIB_DIR/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/objenesis-1.2.jar"
 JARS="${JARS}:$LIB_DIR/play-exceptions.jar"
 JARS="${JARS}:$LIB_DIR/play-iteratees_2.10.jar"
+JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/predictionio-admin_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/predictionio-commons_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/predictionio-output_2.10-${VERSION}.jar"
+JARS="${JARS}:$LIB_DIR/reflectasm-1.07-shaded.jar"
 JARS="${JARS}:$LIB_DIR/sbt-link.jar"
 JARS="${JARS}:$LIB_DIR/scala-arm_2.10.jar"
 JARS="${JARS}:$LIB_DIR/scala-io-core_2.10.jar"
@@ -59,13 +68,9 @@
 JARS="${JARS}:$LIB_DIR/scala-library.jar"
 JARS="${JARS}:$LIB_DIR/scala-reflect.jar"
 JARS="${JARS}:$LIB_DIR/scala-stm_2.10.0.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-concurrent_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-core_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-effect_2.10.jar"
 JARS="${JARS}:$LIB_DIR/signpost-commonshttp4.jar"
 JARS="${JARS}:$LIB_DIR/signpost-core.jar"
 JARS="${JARS}:$LIB_DIR/slf4j-api.jar"
-JARS="${JARS}:$LIB_DIR/specs2_2.10.jar"
 JARS="${JARS}:$LIB_DIR/templates_2.10.jar"
 
 mkdir -p $ADMIN_DIR
diff --git a/dist/bin/start-api.sh b/dist/bin/start-api.sh
index a2273ec..0266371 100755
--- a/dist/bin/start-api.sh
+++ b/dist/bin/start-api.sh
@@ -17,14 +17,18 @@
 
 LIB_DIR="$BASE/lib"
 
-JARS="$LIB_DIR/predictionio-api_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/akka-actor_2.10.jar"
 JARS="${JARS}:$LIB_DIR/akka-slf4j_2.10.jar"
+JARS="${JARS}:$LIB_DIR/asm-4.0.jar"
+JARS="${JARS}:$LIB_DIR/asm-commons-4.0.jar"
+JARS="${JARS}:$LIB_DIR/asm-tree-4.0.jar"
 JARS="${JARS}:$LIB_DIR/async-http-client.jar"
-JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.5.0.jar"
+JARS="${JARS}:$LIB_DIR/bijection-core_2.10-0.3.0.jar"
+JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/chill_2.10-0.2.2.jar"
 JARS="${JARS}:$LIB_DIR/commons-codec-1.7.jar"
 JARS="${JARS}:$LIB_DIR/commons-lang3.jar"
 JARS="${JARS}:$LIB_DIR/commons-logging.jar"
@@ -42,16 +46,21 @@
 JARS="${JARS}:$LIB_DIR/jta.jar"
 JARS="${JARS}:$LIB_DIR/jul-to-slf4j.jar"
 JARS="${JARS}:$LIB_DIR/junit-4.11.jar"
+JARS="${JARS}:$LIB_DIR/kryo-2.17.jar"
 JARS="${JARS}:$LIB_DIR/logback-classic.jar"
 JARS="${JARS}:$LIB_DIR/logback-core.jar"
-JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.10.1.jar"
+JARS="${JARS}:$LIB_DIR/minlog-1.2.jar"
+JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:$LIB_DIR/netty.jar"
 JARS="${JARS}:$LIB_DIR/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/objenesis-1.2.jar"
 JARS="${JARS}:$LIB_DIR/play-exceptions.jar"
 JARS="${JARS}:$LIB_DIR/play-iteratees_2.10.jar"
+JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/predictionio-api_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/predictionio-commons_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/predictionio-output_2.10-${VERSION}.jar"
+JARS="${JARS}:$LIB_DIR/reflectasm-1.07-shaded.jar"
 JARS="${JARS}:$LIB_DIR/sbt-link.jar"
 JARS="${JARS}:$LIB_DIR/scala-arm_2.10.jar"
 JARS="${JARS}:$LIB_DIR/scala-io-core_2.10.jar"
@@ -59,13 +68,9 @@
 JARS="${JARS}:$LIB_DIR/scala-library.jar"
 JARS="${JARS}:$LIB_DIR/scala-reflect.jar"
 JARS="${JARS}:$LIB_DIR/scala-stm_2.10.0.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-concurrent_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-core_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-effect_2.10.jar"
 JARS="${JARS}:$LIB_DIR/signpost-commonshttp4.jar"
 JARS="${JARS}:$LIB_DIR/signpost-core.jar"
 JARS="${JARS}:$LIB_DIR/slf4j-api.jar"
-JARS="${JARS}:$LIB_DIR/specs2_2.10.jar"
 JARS="${JARS}:$LIB_DIR/templates_2.10.jar"
 
 mkdir -p $API_DIR
diff --git a/dist/bin/start-scheduler.sh b/dist/bin/start-scheduler.sh
index 3416353..d13bbc7 100755
--- a/dist/bin/start-scheduler.sh
+++ b/dist/bin/start-scheduler.sh
@@ -17,20 +17,24 @@
 
 LIB_DIR="$BASE/lib"
 
-JARS="$LIB_DIR/predictionio-scheduler_2.10-${VERSION}.jar"
 JARS="${JARS}:$LIB_DIR/akka-actor_2.10.jar"
 JARS="${JARS}:$LIB_DIR/akka-slf4j_2.10.jar"
 JARS="${JARS}:$LIB_DIR/antlr.jar"
+JARS="${JARS}:$LIB_DIR/asm-4.0.jar"
+JARS="${JARS}:$LIB_DIR/asm-commons-4.0.jar"
 JARS="${JARS}:$LIB_DIR/asm-commons.jar"
-JARS="${JARS}:$LIB_DIR/asm.jar"
+JARS="${JARS}:$LIB_DIR/asm-tree-4.0.jar"
 JARS="${JARS}:$LIB_DIR/asm-tree.jar"
 JARS="${JARS}:$LIB_DIR/asm-util.jar"
+JARS="${JARS}:$LIB_DIR/asm.jar"
 JARS="${JARS}:$LIB_DIR/async-http-client.jar"
+JARS="${JARS}:$LIB_DIR/bijection-core_2.10-0.3.0.jar"
 JARS="${JARS}:$LIB_DIR/c3p0-0.9.1.1.jar"
-JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.5.0.jar"
+JARS="${JARS}:$LIB_DIR/casbah-commons_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-core_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-gridfs_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/casbah-query_2.10-2.6.2.jar"
+JARS="${JARS}:$LIB_DIR/chill_2.10-0.2.2.jar"
 JARS="${JARS}:$LIB_DIR/classutil_2.10-1.0.1.jar"
 JARS="${JARS}:$LIB_DIR/commons-codec-1.7.jar"
 JARS="${JARS}:$LIB_DIR/commons-io-2.4.jar"
@@ -51,32 +55,33 @@
 JARS="${JARS}:$LIB_DIR/joda-time.jar"
 JARS="${JARS}:$LIB_DIR/jta.jar"
 JARS="${JARS}:$LIB_DIR/jul-to-slf4j.jar"
+JARS="${JARS}:$LIB_DIR/kryo-2.17.jar"
 JARS="${JARS}:$LIB_DIR/logback-classic.jar"
 JARS="${JARS}:$LIB_DIR/logback-core.jar"
-JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.10.1.jar"
+JARS="${JARS}:$LIB_DIR/minlog-1.2.jar"
+JARS="${JARS}:$LIB_DIR/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:$LIB_DIR/mysql-connector-java-5.1.22.jar"
 JARS="${JARS}:$LIB_DIR/netty.jar"
 JARS="${JARS}:$LIB_DIR/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/objenesis-1.2.jar"
 JARS="${JARS}:$LIB_DIR/play-exceptions.jar"
 JARS="${JARS}:$LIB_DIR/play-iteratees_2.10.jar"
-JARS="${JARS}:$LIB_DIR/predictionio-commons_2.10-${VERSION}.jar"
+JARS="${JARS}:$LIB_DIR/play_2.10.jar"
+JARS="${JARS}:$LIB_DIR/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:$LIB_DIR/predictionio-scheduler_2.10-0.5.1.jar"
 JARS="${JARS}:$LIB_DIR/quartz-2.1.7.jar"
+JARS="${JARS}:$LIB_DIR/reflectasm-1.07-shaded.jar"
 JARS="${JARS}:$LIB_DIR/sbt-link.jar"
 JARS="${JARS}:$LIB_DIR/scala-arm_2.10.jar"
 JARS="${JARS}:$LIB_DIR/scala-io-core_2.10.jar"
 JARS="${JARS}:$LIB_DIR/scala-io-file_2.10.jar"
 JARS="${JARS}:$LIB_DIR/scala-library.jar"
 JARS="${JARS}:$LIB_DIR/scala-reflect.jar"
-JARS="${JARS}:$LIB_DIR/scalasti_2.10-1.0.0.jar"
 JARS="${JARS}:$LIB_DIR/scala-stm_2.10.0.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-concurrent_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-core_2.10.jar"
-JARS="${JARS}:$LIB_DIR/scalaz-effect_2.10.jar"
+JARS="${JARS}:$LIB_DIR/scalasti_2.10-1.0.0.jar"
 JARS="${JARS}:$LIB_DIR/signpost-commonshttp4.jar"
 JARS="${JARS}:$LIB_DIR/signpost-core.jar"
 JARS="${JARS}:$LIB_DIR/slf4j-api.jar"
-JARS="${JARS}:$LIB_DIR/specs2_2.10.jar"
 JARS="${JARS}:$LIB_DIR/stringtemplate.jar"
 JARS="${JARS}:$LIB_DIR/templates_2.10.jar"
 
diff --git a/dist/bin/updatecheck b/dist/bin/updatecheck
index d74dd77..4f49536 100755
--- a/dist/bin/updatecheck
+++ b/dist/bin/updatecheck
@@ -129,23 +129,24 @@
 JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.3.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
+JARS="${JARS}:${PROG_HOME}/lib/commons-io-2.4.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/kryo-2.21.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
 JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scopt_2.10-3.1.0.jar"
diff --git a/dist/bin/upgrade b/dist/bin/upgrade
index 53f985b..7d633ed 100755
--- a/dist/bin/upgrade
+++ b/dist/bin/upgrade
@@ -129,24 +129,24 @@
 JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.3.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
 JARS="${JARS}:${PROG_HOME}/lib/commons-io-2.4.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/kryo-2.21.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
 JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-software-manager_2.10-0.5.1.jar"
 JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scopt_2.10-3.1.0.jar"
diff --git a/dist/bin/users b/dist/bin/users
index 0df0e49..73934de 100755
--- a/dist/bin/users
+++ b/dist/bin/users
@@ -126,26 +126,31 @@
 
 PROG_NAME=users
 
-JARS="${PROG_HOME}/lib/predictionio-users-tool_2.10-0.5.0.jar:"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.5.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.7.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-commons-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/asm-tree-4.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/bijection-core_2.10-0.3.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-commons_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-core_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-gridfs_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/casbah-query_2.10-2.6.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/chill_2.10-0.2.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/commons-codec-1.8.jar"
 JARS="${JARS}:${PROG_HOME}/lib/config-1.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/jline-2.9.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-convert-1.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/joda-time-2.1.jar"
-JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.10.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/kryo-2.17.jar"
+JARS="${JARS}:${PROG_HOME}/lib/minlog-1.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/mongo-java-driver-2.11.2.jar"
 JARS="${JARS}:${PROG_HOME}/lib/nscala-time_2.10-0.2.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.0.jar"
+JARS="${JARS}:${PROG_HOME}/lib/objenesis-1.2.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-commons_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/predictionio-users-tool_2.10-0.5.1.jar"
+JARS="${JARS}:${PROG_HOME}/lib/reflectasm-1.07.jar"
 JARS="${JARS}:${PROG_HOME}/lib/scala-library-2.10.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-concurrent_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-core_2.10-7.0.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/scalaz-effect_2.10-7.0.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/slf4j-api-1.6.0.jar"
 JARS="${JARS}:${PROG_HOME}/lib/slf4j-nop-1.6.0.jar"
-JARS="${JARS}:${PROG_HOME}/lib/specs2_2.10-1.13.jar"
 
 JVM_OPT="$JVM_OPT -Dconfig.file=${PROG_HOME}/conf/predictionio.conf -Dio.prediction.base=$PROG_HOME"
 
diff --git a/dist/conf/init.json b/dist/conf/init.json
index ab02db9..48e844e 100644
--- a/dist/conf/init.json
+++ b/dist/conf/init.json
@@ -1,7 +1,7 @@
 {
     "systeminfos": {
         "version": {
-            "value": "0.5.0",
+            "value": "0.5.1",
             "description": "PredictionIO version"
         }
     },
diff --git a/dist/conf/predictionio.conf b/dist/conf/predictionio.conf
index f3295be..71f47f2 100644
--- a/dist/conf/predictionio.conf
+++ b/dist/conf/predictionio.conf
@@ -75,30 +75,30 @@
 io.prediction.commons.modeldata.training.db.port=27017
 
 # PredictionIO Algorithms
-pdio-knnitembased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-pdio-latestrank.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-pdio-randomrank.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-itembased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-parallelals.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-knnuserbased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-thresholduserbased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-slopeone.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-alswr.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-svdsgd.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-svdplusplus.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
+pdio-knnitembased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+pdio-latestrank.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+pdio-randomrank.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-itembased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-parallelals.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-knnuserbased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-thresholduserbased.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-slopeone.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-alswr.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-svdsgd.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-svdplusplus.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
 
 # PredictionIO generic scalding job
-io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
+io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
 
 # Itemrec Scala Mahout Algorithms
-io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.5.0.jar
+io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.5.1.jar
 
 # Mahout core job
 io.prediction.algorithms.mahout-core-job.jar=${io.prediction.base}/vendors/mahout-0.8-snapshot/mahout-core-0.8-SNAPSHOT-job.jar
 
 # PredictionIO Offline Evaluation
-io.prediction.evaluations.scalding.itemrec.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-Hadoop-Scalding-assembly-0.5.0.jar
-io.prediction.evaluations.itemrec.topkitems.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-TopKItems-assembly-0.5.0.jar
-io.prediction.evaluations.itemrec.trainingtestsplit.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-Scala-TrainingTestSplitTime-assembly-0.5.0.jar
-io.prediction.evaluations.itemrec.paramgen.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-ParamGen-assembly-0.5.0.jar
+io.prediction.evaluations.scalding.itemrec.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-Hadoop-Scalding-assembly-0.5.1.jar
+io.prediction.evaluations.itemrec.topkitems.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-TopKItems-assembly-0.5.1.jar
+io.prediction.evaluations.itemrec.trainingtestsplit.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-Scala-TrainingTestSplitTime-assembly-0.5.1.jar
+io.prediction.evaluations.itemrec.paramgen.jar=${io.prediction.base}/lib/PredictionIO-Process-ItemRec-Evaluations-ParamGen-assembly-0.5.1.jar
 
diff --git a/dist/conf/versions.json b/dist/conf/versions.json
index 46ddddc..64a5bf9 100644
--- a/dist/conf/versions.json
+++ b/dist/conf/versions.json
@@ -1,9 +1,13 @@
 {
-    "latest": "0.5.0",
+    "latest": "0.5.1",
     "versions": {
         "0.5.0": {
             "binaries": "http://download.prediction.io/PredictionIO-0.5.0.zip",
             "sources": "http://download.prediction.io/PredictionIO-0.5.0-sources.zip"
+        },
+        "0.5.1": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.5.1.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.5.1-sources.zip"
         }
     }
 }
diff --git a/output/build.sbt b/output/build.sbt
index 2da03c2..edbefdd 100644
--- a/output/build.sbt
+++ b/output/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Output"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
@@ -9,7 +9,7 @@
 scalacOptions in (Compile, doc) ++= Opts.doc.title("PredictionIO Output API Documentation")
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "com.github.nscala-time" %% "nscala-time" % "0.2.0",
   "junit" % "junit" % "4.11",
   "org.specs2" %% "specs2" % "1.14" % "test"
diff --git a/process/commons/hadoop/scalding/build.sbt b/process/commons/hadoop/scalding/build.sbt
index 00b34c5..df14d3a 100644
--- a/process/commons/hadoop/scalding/build.sbt
+++ b/process/commons/hadoop/scalding/build.sbt
@@ -2,7 +2,7 @@
 
 organization := "io.prediction"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -31,7 +31,7 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/build.sbt
index 080960b..c8fb995 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/build.sbt
@@ -4,7 +4,7 @@
 
 packageOptions += Package.ManifestAttributes(java.util.jar.Attributes.Name.MAIN_CLASS -> "com.twitter.scalding.Tool")
 
-version in ThisBuild := "0.5.0"
+version in ThisBuild := "0.5.1"
 
 scalaVersion in ThisBuild := "2.9.2"
 
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/generic/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/generic/build.sbt
index 481a495..8ab8d8b 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/generic/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/generic/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Algorithms Hadoop Scalding Generic"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/knnitembased/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/knnitembased/build.sbt
index 0410b38..ada17d9 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/knnitembased/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/knnitembased/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Algorithms Hadoop Scalding KNNItemBased"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/latestrank/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/latestrank/build.sbt
index df8dc1d..18bd9e9 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/latestrank/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/latestrank/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Algorithms Hadoop Scalding LatestRank"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/mahout/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/mahout/build.sbt
index 7cec06b..056e4c8 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/mahout/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/mahout/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Algorithms Hadoop Scalding Mahout"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/hadoop/scalding/randomrank/build.sbt b/process/engines/itemrec/algorithms/hadoop/scalding/randomrank/build.sbt
index c9753b2..fd98214 100644
--- a/process/engines/itemrec/algorithms/hadoop/scalding/randomrank/build.sbt
+++ b/process/engines/itemrec/algorithms/hadoop/scalding/randomrank/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Algorithms Hadoop Scalding RandomRank"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/algorithms/scala/mahout/build.sbt b/process/engines/itemrec/algorithms/scala/mahout/build.sbt
index 3672d77..7d8291a 100644
--- a/process/engines/itemrec/algorithms/scala/mahout/build.sbt
+++ b/process/engines/itemrec/algorithms/scala/mahout/build.sbt
@@ -4,7 +4,7 @@
 
 packageOptions += Package.ManifestAttributes(java.util.jar.Attributes.Name.MAIN_CLASS -> "io.prediction.commons.mahout.itemrec.MahoutJob")
 
-version in ThisBuild:= "0.5.0"
+version in ThisBuild:= "0.5.1"
 
 scalaVersion in ThisBuild:= "2.10.0"
 
diff --git a/process/engines/itemrec/algorithms/scala/mahout/commons/build.sbt b/process/engines/itemrec/algorithms/scala/mahout/commons/build.sbt
index afa239d..cbe440d 100644
--- a/process/engines/itemrec/algorithms/scala/mahout/commons/build.sbt
+++ b/process/engines/itemrec/algorithms/scala/mahout/commons/build.sbt
@@ -1,7 +1,7 @@
 name := "PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-Commons"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1"
 )
 
 // Mahout's dependencies
diff --git a/process/engines/itemrec/evaluations/hadoop/scalding/build.sbt b/process/engines/itemrec/evaluations/hadoop/scalding/build.sbt
index 975cbc7..5214fcb 100644
--- a/process/engines/itemrec/evaluations/hadoop/scalding/build.sbt
+++ b/process/engines/itemrec/evaluations/hadoop/scalding/build.sbt
@@ -4,7 +4,7 @@
 
 packageOptions += Package.ManifestAttributes(java.util.jar.Attributes.Name.MAIN_CLASS -> "com.twitter.scalding.Tool")
 
-version in ThisBuild := "0.5.0"
+version in ThisBuild := "0.5.1"
 
 scalaVersion in ThisBuild := "2.9.2"
 
diff --git a/process/engines/itemrec/evaluations/hadoop/scalding/metrics/map/build.sbt b/process/engines/itemrec/evaluations/hadoop/scalding/metrics/map/build.sbt
index 0ee09d9..cbf7e7a 100644
--- a/process/engines/itemrec/evaluations/hadoop/scalding/metrics/map/build.sbt
+++ b/process/engines/itemrec/evaluations/hadoop/scalding/metrics/map/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Evaluations Hadoop Scalding Metrics MAP"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/evaluations/hadoop/scalding/trainingtestsplit/build.sbt b/process/engines/itemrec/evaluations/hadoop/scalding/trainingtestsplit/build.sbt
index 5a43af7..6fecc3d 100644
--- a/process/engines/itemrec/evaluations/hadoop/scalding/trainingtestsplit/build.sbt
+++ b/process/engines/itemrec/evaluations/hadoop/scalding/trainingtestsplit/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemRec Evaluations Hadoop Scalding TrainingTestSplit"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/process/engines/itemrec/evaluations/scala/paramgen/build.sbt b/process/engines/itemrec/evaluations/scala/paramgen/build.sbt
index 19358ca..3b8a80f 100644
--- a/process/engines/itemrec/evaluations/scala/paramgen/build.sbt
+++ b/process/engines/itemrec/evaluations/scala/paramgen/build.sbt
@@ -4,12 +4,12 @@
 
 name := "PredictionIO-Process-ItemRec-Evaluations-ParamGen"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.10.0"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "ch.qos.logback" % "logback-classic" % "1.0.9",
   "ch.qos.logback" % "logback-core" % "1.0.9",
   "com.typesafe" % "config" % "1.0.0",
diff --git a/process/engines/itemrec/evaluations/scala/topkitems/build.sbt b/process/engines/itemrec/evaluations/scala/topkitems/build.sbt
index 292eba1..29c448d 100644
--- a/process/engines/itemrec/evaluations/scala/topkitems/build.sbt
+++ b/process/engines/itemrec/evaluations/scala/topkitems/build.sbt
@@ -4,13 +4,13 @@
 
 name := "PredictionIO-Process-ItemRec-Evaluations-TopKItems"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.10.0"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-output" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-output" % "0.5.1",
   "ch.qos.logback" % "logback-classic" % "1.0.9",
   "ch.qos.logback" % "logback-core" % "1.0.9",
   "com.github.scala-incubator.io" %% "scala-io-core" % "0.4.2",
diff --git a/process/engines/itemrec/evaluations/scala/trainingtestsplit/build.sbt b/process/engines/itemrec/evaluations/scala/trainingtestsplit/build.sbt
index 3ab5c43..55d3225 100644
--- a/process/engines/itemrec/evaluations/scala/trainingtestsplit/build.sbt
+++ b/process/engines/itemrec/evaluations/scala/trainingtestsplit/build.sbt
@@ -4,12 +4,12 @@
 
 name := "PredictionIO-Process-ItemRec-Evaluations-Scala-TrainingTestSplitTime"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion in ThisBuild := "2.9.2"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1"
 )
 
 libraryDependencies += "com.twitter" % "scalding-args_2.9.2" % "0.8.4"
diff --git a/process/engines/itemsim/algorithms/hadoop/scalding/build.sbt b/process/engines/itemsim/algorithms/hadoop/scalding/build.sbt
index e47d47f..6c03b0c 100644
--- a/process/engines/itemsim/algorithms/hadoop/scalding/build.sbt
+++ b/process/engines/itemsim/algorithms/hadoop/scalding/build.sbt
@@ -4,7 +4,7 @@
 
 packageOptions += Package.ManifestAttributes(java.util.jar.Attributes.Name.MAIN_CLASS -> "com.twitter.scalding.Tool")
 
-version in ThisBuild := "0.5.0"
+version in ThisBuild := "0.5.1"
 
 scalaVersion in ThisBuild := "2.9.2"
 
diff --git a/process/engines/itemsim/algorithms/hadoop/scalding/itemsimcf/build.sbt b/process/engines/itemsim/algorithms/hadoop/scalding/itemsimcf/build.sbt
index 33bb5e9..7482bc2 100644
--- a/process/engines/itemsim/algorithms/hadoop/scalding/itemsimcf/build.sbt
+++ b/process/engines/itemsim/algorithms/hadoop/scalding/itemsimcf/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Process ItemSim Algorithms Hadoop Scalding ItemSimCF"
 
-version := "0.5.0"
+version := "0.5.1"
 
 scalaVersion := "2.9.2"
 
@@ -18,8 +18,8 @@
 )
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
-  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
+  "io.prediction" %% "predictionio-process-commons-hadoop-scalding" % "0.5.1"
 )
 
 resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
diff --git a/servers/admin/project/Build.scala b/servers/admin/project/Build.scala
index 30a6830..d7b5367 100644
--- a/servers/admin/project/Build.scala
+++ b/servers/admin/project/Build.scala
@@ -5,11 +5,11 @@
 object ApplicationBuild extends Build {
 
     val appName         = "predictionio-admin"
-    val appVersion      = "0.5.0"
+    val appVersion      = "0.5.1"
 
     val appDependencies = Seq(
-      "io.prediction" %% "predictionio-commons" % "0.5.0",
-      "io.prediction" %% "predictionio-output" % "0.5.0",
+      "io.prediction" %% "predictionio-commons" % "0.5.1",
+      "io.prediction" %% "predictionio-output" % "0.5.1",
       "com.github.nscala-time" %% "nscala-time" % "0.2.0",
       "commons-codec" % "commons-codec" % "1.8"
     )
diff --git a/servers/api/project/Build.scala b/servers/api/project/Build.scala
index 67c7816..7e9bae2 100644
--- a/servers/api/project/Build.scala
+++ b/servers/api/project/Build.scala
@@ -5,11 +5,11 @@
 object ApplicationBuild extends Build {
 
   val appName         = "predictionio-api"
-  val appVersion      = "0.5.0"
+  val appVersion      = "0.5.1"
 
   val appDependencies = Seq(
-    "io.prediction" %% "predictionio-commons" % "0.5.0",
-    "io.prediction" %% "predictionio-output" % "0.5.0"
+    "io.prediction" %% "predictionio-commons" % "0.5.1",
+    "io.prediction" %% "predictionio-output" % "0.5.1"
   )
 
   val main = play.Project(appName, appVersion, appDependencies).settings(
diff --git a/servers/scheduler/conf/application.conf b/servers/scheduler/conf/application.conf
index 1f5b4a1..e18912f 100644
--- a/servers/scheduler/conf/application.conf
+++ b/servers/scheduler/conf/application.conf
@@ -86,23 +86,23 @@
 io.prediction.commons.settings.db.port=27017
 
 # PredictionIO Algorithms
-pdio-knnitembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-pdio-latestrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-pdio-randomrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-itembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-parallelals.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-knnuserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-thresholduserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-slopeone.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-alswr.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-svdsgd.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
-mahout-svdplusplus.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
+pdio-knnitembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+pdio-latestrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+pdio-randomrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-itembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-parallelals.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-knnuserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-thresholduserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-slopeone.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-alswr.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-svdsgd.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
+mahout-svdplusplus.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
 
 # PredictionIO generic scalding job
-io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.0.jar
+io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.5.1.jar
 
 # Itemrec Scala Mahout Algorithms
-io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.itemrec.base}/algorithms/scala/mahout/target/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.5.0.jar
+io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.itemrec.base}/algorithms/scala/mahout/target/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.5.1.jar
 
 # Mahout core job
 io.prediction.algorithms.mahout-core-job.jar=${io.prediction.base}/vendors/mahout-0.8-snapshot/mahout-core-0.8-SNAPSHOT-job.jar
diff --git a/servers/scheduler/project/Build.scala b/servers/scheduler/project/Build.scala
index 3b32f6e..66d342e 100644
--- a/servers/scheduler/project/Build.scala
+++ b/servers/scheduler/project/Build.scala
@@ -5,11 +5,11 @@
 object ApplicationBuild extends Build {
 
     val appName         = "predictionio-scheduler"
-    val appVersion      = "0.5.0"
+    val appVersion      = "0.5.1"
 
     val appDependencies = Seq(
       "commons-io" % "commons-io" % "2.4",
-      "io.prediction" %% "predictionio-commons" % "0.5.0",
+      "io.prediction" %% "predictionio-commons" % "0.5.1",
       "mysql" % "mysql-connector-java" % "5.1.22",
       "org.clapper" %% "scalasti" % "1.0.0",
       "org.quartz-scheduler" % "quartz" % "2.1.7",
diff --git a/tools/conncheck/build.sbt b/tools/conncheck/build.sbt
index 761913b..5c3da4c 100644
--- a/tools/conncheck/build.sbt
+++ b/tools/conncheck/build.sbt
@@ -1,13 +1,13 @@
 name := "PredictionIO Connection Check Tool"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
 scalaVersion := "2.10.0"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "org.slf4j" % "slf4j-nop" % "1.6.0"
 )
 
diff --git a/tools/migration/0.5/appdata/build.sbt b/tools/migration/0.5/appdata/build.sbt
index 4f5bb1f..d5bbe66 100644
--- a/tools/migration/0.5/appdata/build.sbt
+++ b/tools/migration/0.5/appdata/build.sbt
@@ -1,13 +1,13 @@
 name := "PredictionIO 0.4 to 0.5 appdata Migration"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
 scalaVersion := "2.10.0"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "org.mongodb" %% "casbah" % "2.6.2",
   "org.slf4j" % "slf4j-nop" % "1.6.0"
 )
diff --git a/tools/settingsinit/build.sbt b/tools/settingsinit/build.sbt
index c103d4e..49032c9 100644
--- a/tools/settingsinit/build.sbt
+++ b/tools/settingsinit/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Settings Initialization"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
@@ -9,7 +9,7 @@
 scalacOptions ++= Seq("-deprecation")
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0"
+  "io.prediction" %% "predictionio-commons" % "0.5.1"
 )
 
 resolvers ++= Seq(
diff --git a/tools/softwaremanager/build.sbt b/tools/softwaremanager/build.sbt
index e32a6be..20f8171 100644
--- a/tools/softwaremanager/build.sbt
+++ b/tools/softwaremanager/build.sbt
@@ -1,6 +1,6 @@
 name := "PredictionIO Software Manager"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
@@ -9,12 +9,14 @@
 scalacOptions ++= Seq("-deprecation")
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "com.github.scopt" %% "scopt" % "3.1.0",
   "commons-io" % "commons-io" % "2.4",
   "org.slf4j" % "slf4j-nop" % "1.6.0"
 )
 
+libraryDependencies += "org.specs2" %% "specs2" % "2.1.1" % "test"
+
 resolvers ++= Seq(
   "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"
 )
diff --git a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Backup.scala b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Backup.scala
index f6dc246..dcca44d 100644
--- a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Backup.scala
+++ b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Backup.scala
@@ -27,7 +27,7 @@
 
   def main(args: Array[String]) {
     val parser = new scopt.OptionParser[BackupConfig]("backup") {
-      head("PredictionIO Backup Utility", "0.5.0")
+      head("PredictionIO Backup Utility", "0.5.1")
       help("help") text("prints this usage text")
       arg[String]("<backup directory>") action { (x, c) =>
         c.copy(backupDir = x)
diff --git a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Restore.scala b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Restore.scala
index 26bb91f..d0bfce0 100644
--- a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Restore.scala
+++ b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Restore.scala
@@ -27,7 +27,7 @@
 
   def main(args: Array[String]) {
     val parser = new scopt.OptionParser[RestoreConfig]("restore") {
-      head("PredictionIO Restore Utility", "0.5.0")
+      head("PredictionIO Restore Utility", "0.5.1")
       help("help") text("prints this usage text")
       opt[Unit]("upgrade") action { (_, c) =>
         c.copy(upgrade = true)
diff --git a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/UpdateCheck.scala b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/UpdateCheck.scala
index abb3cb3..97d763a 100644
--- a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/UpdateCheck.scala
+++ b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/UpdateCheck.scala
@@ -6,6 +6,8 @@
 import scala.sys.process._
 import scala.util.parsing.json.JSON
 
+import org.apache.commons.io.FileUtils._
+
 case class UpdateCheckConfig(localVersion: String = "", answer: String = "")
 
 object UpdateCheck {
@@ -14,7 +16,7 @@
 
   def main(args: Array[String]) {
     val parser = new scopt.OptionParser[UpdateCheckConfig]("updatecheck") {
-      head("PredictionIO Update Checker", "0.5.0")
+      head("PredictionIO Update Checker", "0.5.1")
       help("help") text("prints this usage text")
       opt[String]("localVersion") action { (x, c) =>
         c.copy(localVersion = x)
@@ -30,7 +32,7 @@
 
       val installed = systemInfos.get("version") map { _.value } getOrElse {
         println("Cannot detect any previous version. Possible causes:")
-        println("- PredictionIO version <= 0.4.2")
+        println("- PredictionIO version < 0.5.0")
         println("- misconfiguration (wrong settings database pointers)")
         println("- settings database has been corrupted")
         println()
@@ -75,7 +77,7 @@
       if (latest != installed) {
         val answer = updateCheckConfig.answer
         val choice = if (answer == "") {
-          println("Your PredictionIO is not the latest version. Do you want to download the latest binaries?")
+          println("Your PredictionIO is not the latest version. Do you want to download and install the latest binaries?")
           val input = readLine("Enter 'YES' to proceed: ")
           input match {
             case "YES" => "y"
@@ -87,6 +89,15 @@
             val binaries = versions.binaries(latest) map { b =>
               println(s"Retrieving ${b}...")
               s"curl -O ${b}".!
+              val filename = b.split('/').reverse.head
+              val dirname = filename.split('.').dropRight(1).mkString(".")
+              val extractedDir = getFile(dirname)
+              if (extractedDir.exists) { deleteDirectory(extractedDir) }
+              s"unzip ${filename}".!
+              if (localVersion != "")
+                s"${dirname}/bin/upgrade --localVersion ${localVersion} ${config.base} ${dirname}".!
+              else
+                s"${dirname}/bin/upgrade ${config.base} ${dirname}".!
             }
           }
           case "n" => println(s"Your PredictionIO is not the latest version. A new version ${latest} is available.")
diff --git a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Upgrade.scala b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Upgrade.scala
index d35f3c6..a3767d9 100644
--- a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Upgrade.scala
+++ b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Upgrade.scala
@@ -1,7 +1,5 @@
 package io.prediction.tools.softwaremanager
 
-import io.prediction.commons._
-
 import scala.collection.JavaConversions._
 import scala.sys.process._
 
@@ -10,17 +8,25 @@
 import com.typesafe.config._
 import org.apache.commons.io.FileUtils._
 
-case class UpgradeConfig(current: File = new File("."), latest: File = new File("."), nomigrate: Boolean = false)
+case class UpgradeConfig(
+  current: File = new File("."),
+  latest: File = new File("."),
+  nomigrate: Boolean = false,
+  localVersion: String = "")
 
 /** Upgrades previous version to current version. */
 object Upgrade {
   def main(args: Array[String]) {
+    val thisVersion = "0.5.1"
     val parser = new scopt.OptionParser[UpgradeConfig]("upgrade") {
-      head("PredictionIO Software Upgrade Utility", "0.5.0")
+      head("PredictionIO Software Upgrade Utility", thisVersion)
       help("help") text("prints this usage text")
       opt[Unit]("nomigrate") action { (_, c) =>
         c.copy(nomigrate = true)
       } text("upgrade from previous version backup data")
+      opt[String]("localVersion") action { (x, c) =>
+        c.copy(localVersion = x)
+      } text("use a local file for version information")
       arg[File]("<current>") action { (x, c) =>
         c.copy(current = x)
       } text("directory containing current PredictionIO setup")
@@ -31,12 +37,12 @@
 
     parser.parse(args, UpgradeConfig()) map { upgradeConfig =>
       var stepcount = 1
-      val steps = 7
+      val steps = 9
       val currentDir = upgradeConfig.current
       val latestDir = upgradeConfig.latest
       val current = currentDir.getCanonicalPath
       val latest = latestDir.getCanonicalPath
-      val nomigrate = upgradeConfig.nomigrate
+      var nomigrate = upgradeConfig.nomigrate
 
       println("PredictionIO Software Upgrade Utility")
       println()
@@ -51,28 +57,91 @@
         sys.exit(1)
       }
 
+      if ((getFile(currentDir, "backup")).exists) {
+        println(s"${current}/backup already exists. Please move away any previous backups and try again.")
+        sys.exit(1)
+      }
+
       val dirs = Seq("bin", "conf", "lib")
 
-      /** Make a backup. */
-      println(s"Step ${stepcount} of ${steps}: Creating backup of PredictionIO settings...")
-      println()
-      val backupBin = s"${current}/bin/backup"
-      val backupBinFile = new File(backupBin)
-      if (!backupBinFile.exists && !nomigrate) {
-        println("Backup utility cannot be found. Possible causes:")
-        println("- PredictionIO version <= 0.4.2")
-        println("- the binary is missing")
+      /** Determine current version */
+      System.setProperty("config.file", s"${current}/conf/predictionio.conf")
+      val config = new io.prediction.commons.Config()
+      val systemInfos = config.getSettingsSystemInfos
+      val installed = systemInfos.get("version") map { _.value }
+      installed getOrElse {
+        println("Cannot detect any previous version. Possible causes:")
+        println("- PredictionIO version < 0.5.0")
+        println("- misconfiguration (wrong settings database pointers)")
+        println("- settings database has been corrupted")
         println()
-        println("To force upgrading without migrating settings, add --nomigrate to the command. Aborting.")
-        sys.exit(1)
-      } else if (!nomigrate) {
-        val backupCode = s"${current}/bin/backup ${current}/backup/settings".!
-        if (backupCode != 0) {
-          println("Backup utility returned non-zero exit code. Aborting.")
-          sys.exit(1)
+        println("No migration of settings will be performed if you choose to continue the upgrade.")
+        val input = readLine("Enter 'YES' to proceed: ")
+        val interrupt = input match {
+          case "YES" => false
+          case _ => true
         }
-      } else {
+        if (interrupt) { sys.exit(1) } else { nomigrate = true }
+      }
+      val installedVersion = installed.get
+
+      /** Backup existing data. */
+      println(s"Step ${stepcount} of ${steps}: Backup existing settings...")
+      println()
+
+      if (nomigrate) {
         println("Not migrating settings. Skipping backup.")
+      } else {
+        backup(s"${current}/bin/backup", s"${current}/backup/settings/${installedVersion}", current)
+      }
+
+      println()
+      stepcount += 1
+
+      /** Determine updaters to download. */
+      println(s"Step ${stepcount} of ${steps}: Downloading any additional settings updaters...")
+      println()
+
+      val versions = if (upgradeConfig.localVersion == "") { Versions() } else { Versions(upgradeConfig.localVersion) }
+      val updateSequence = versions.updateSequence(installedVersion, thisVersion)
+
+      if (nomigrate) {
+        println("Not migrating settings. Skipping...")
+      } else {
+        if (updateSequence.size == 0) {
+          println(s"Upgrading from ${installedVersion} to ${thisVersion} requires no additional updaters.")
+        } else {
+          val updaterDirFile = new java.io.File(s"${current}/updaters")
+          if (!updaterDirFile.exists && !updaterDirFile.mkdirs) {
+            println(s"Unable to create directory ${updaterDirFile}. Aborting...")
+            sys.exit(1)
+          }
+          var i = 0
+          updateSequence foreach { v =>
+            versions.updater(v) map { u =>
+              println(s"Downloading ${u}...")
+              if (Process(s"curl -O ${u}", updaterDirFile).! != 0) {
+                println("Download failed. Aborting...")
+                sys.exit(1)
+              }
+              val filename = u.split('/').reverse.head
+              val dirname = filename.split('.').dropRight(1).mkString(".")
+              val extractedUpdaterDir = getFile(updaterDirFile, dirname)
+              if (extractedUpdaterDir.exists) { deleteDirectory(extractedUpdaterDir) }
+              if (Process(s"unzip ${filename}", updaterDirFile).! != 0) {
+                println("Updater extraction failed. Aborting...")
+                sys.exit(1)
+              }
+              if (i == 0)
+                restore(s"${updaterDirFile}/${dirname}/bin/restore", s"${current}/backup/settings/${installedVersion}", current)
+              else
+                restore(s"${updaterDirFile}/${dirname}/bin/restore", s"${current}/backup/settings/${updateSequence(i-1)}", current)
+
+              backup(s"${updaterDirFile}/${dirname}/bin/backup", s"${current}/backup/settings/${v}", current)
+            }
+            i += 1
+          }
+        }
       }
       println()
       stepcount += 1
@@ -151,15 +220,60 @@
       if (nomigrate) {
         println("Not migrating settings. Skipping restore.")
       } else {
-        val restoreCode = s"${current}/bin/restore --upgrade ${current}/backup/settings".!
-        if (restoreCode != 0) {
-          println("Restore utility returned non-zero exit code. Aborting.")
-          sys.exit(1)
-        }
+        if (updateSequence.size > 0)
+          restore(s"${current}/bin/restore", s"${current}/backup/settings/${updateSequence.last}", current)
+        else
+          restore(s"${current}/bin/restore", s"${current}/backup/settings/${installedVersion}", current)
       }
       println()
+      stepcount += 1
+
+      println(s"Step ${stepcount} of ${steps}: Running setup for new version...")
+      println()
+      s"${current}/bin/setup.sh".!
+      println()
 
       println("Upgrade completed.")
     }
   }
+
+  private def backup(backupBin: String, backupDir: String, base: String) = {
+    val backupBinFile = new File(backupBin)
+    if (!backupBinFile.exists) {
+      println("Backup utility cannot be found. Possible causes:")
+      println("- PredictionIO version < 0.5.0")
+      println("- the binary is missing")
+      println()
+      println("To force upgrading without migrating settings, add --nomigrate to the command. Aborting.")
+      sys.exit(1)
+    } else {
+      if (Process(
+          s"${backupBin} ${backupDir}",
+          None,
+          ("JVM_OPT", s"-Dconfig.file=${base}/conf/predictionio.conf -Dio.prediction.base=${base}")).! != 0) {
+        println("Backup utility returned non-zero exit code. Aborting.")
+        sys.exit(1)
+      }
+    }
+  }
+
+  private def restore(restoreBin: String, restoreDir: String, base: String) = {
+    val restoreBinFile = new File(restoreBin)
+    if (!restoreBinFile.exists) {
+      println("Restore utility cannot be found. Possible causes:")
+      println("- PredictionIO version < 0.5.0")
+      println("- the binary is missing")
+      println()
+      println("To force upgrading without migrating settings, add --nomigrate to the command. Aborting.")
+      sys.exit(1)
+    } else {
+      if (Process(
+          s"${restoreBin} --upgrade ${restoreDir}",
+          None,
+          ("JVM_OPT", s"-Dconfig.file=${base}/conf/predictionio.conf -Dio.prediction.base=${base}")).! != 0) {
+        println("Restore utility returned non-zero exit code. Aborting.")
+        sys.exit(1)
+      }
+    }
+  }
 }
diff --git a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Versions.scala b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Versions.scala
index 8121a38..a6479c7 100644
--- a/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Versions.scala
+++ b/tools/softwaremanager/src/main/scala/io/prediction/tools/softwaremanager/Versions.scala
@@ -33,6 +33,23 @@
 
   private val versions = M.unapply(meta("versions")) getOrElse { throw new VersionsFormatException("Cannot find versions information.") }
 
+  private def versionToParts(version: String): Seq[Int] = version.split('.').map(_.toInt)
+
+  private def versionLessThan(x: String, y: String): Boolean = {
+    val versionX = versionToParts(x)
+    val versionY = versionToParts(y)
+
+    if (versionX(0) == versionY(0))
+      if (versionX(1) == versionY(1))
+        versionX(2) < versionY(2)
+      else
+        versionX(1) < versionY(1)
+    else
+      versionX(0) < versionY(0)
+  }
+
+  val sequence = versions.keys.toSeq.sortWith { (x, y) => versionLessThan(x, y) }
+
   def version(version: String): Option[Map[String, String]] = versions.get(version) map { MSS.unapply(_) map { Some(_) } getOrElse None } getOrElse None
 
   def binaries(ver: String): Option[String] = version(ver) map { _.get("binaries") map { Some(_) } getOrElse None } getOrElse None
@@ -41,9 +58,18 @@
 
   def updater(ver: String): Option[String] = version(ver) map { _.get("updater") map { Some(_) } getOrElse None } getOrElse None
 
-  def from(ver: String): Option[String] = version(ver) map { _.get("from") map { Some(_) } getOrElse None } getOrElse None
+  def updateRequired(ver: String): Boolean = updater(ver) map { _ => true } getOrElse false
 
-  def via(ver: String): Option[String] = version(ver) map { _.get("via") map { Some(_) } getOrElse None } getOrElse None
+  def updateSequence(fromVersion: String, toVersion: String): Seq[String] = {
+    val seqWithAllUpdates = sequence filter { updateRequired(_) }
+    val seqWithUpdatesUntilTo = seqWithAllUpdates filter { v =>
+      versionLessThan(v, toVersion) || v == toVersion
+    }
+    val seqWithUpdates = seqWithUpdatesUntilTo filterNot { v =>
+      versionLessThan(v, fromVersion) || v == fromVersion
+    }
+    seqWithUpdates.dropRight(1)
+  }
 }
 
 object Versions {
diff --git a/tools/softwaremanager/src/test/resources/versions.json b/tools/softwaremanager/src/test/resources/versions.json
new file mode 100644
index 0000000..2414e19
--- /dev/null
+++ b/tools/softwaremanager/src/test/resources/versions.json
@@ -0,0 +1,46 @@
+{
+    "latest": "0.5.0",
+    "versions": {
+        "0.5.0": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.5.0.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.5.0-sources.zip",
+            "updater": "http://download.prediction.io/PredictionIO-0.5.0-updater.zip"
+        },
+        "0.5.1": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.5.1.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.5.1-sources.zip"
+        },
+        "0.6.0": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.6.0.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.6.0-sources.zip"
+        },
+        "0.6.1": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.6.1.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.6.1-sources.zip",
+            "updater": "http://download.prediction.io/PredictionIO-0.6.1-updater.zip"
+        },
+        "0.6.2": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.6.2.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.6.2-sources.zip"
+        },
+        "0.7.0": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.7.0.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.7.0-sources.zip",
+            "updater": "http://download.prediction.io/PredictionIO-0.7.0-updater.zip"
+        },
+        "0.20.0": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.20.0.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.20.0-sources.zip",
+            "updater": "http://download.prediction.io/PredictionIO-0.20.0-updater.zip"
+        },
+        "0.20.1": {
+            "binaries": "http://download.prediction.io/PredictionIO-0.20.1.zip",
+            "sources": "http://download.prediction.io/PredictionIO-0.20.1-sources.zip"
+        },
+        "1.0.0": {
+            "binaries": "http://download.prediction.io/PredictionIO-1.0.0.zip",
+            "sources": "http://download.prediction.io/PredictionIO-1.0.0-sources.zip",
+            "updater": "http://download.prediction.io/PredictionIO-1.0.0-updater.zip"
+        }
+    }
+}
diff --git a/tools/softwaremanager/src/test/scala/io/prediction/tools/softwaremanager/VersionsSpec.scala b/tools/softwaremanager/src/test/scala/io/prediction/tools/softwaremanager/VersionsSpec.scala
new file mode 100644
index 0000000..f4bc216
--- /dev/null
+++ b/tools/softwaremanager/src/test/scala/io/prediction/tools/softwaremanager/VersionsSpec.scala
@@ -0,0 +1,39 @@
+package io.prediction.tools.softwaremanager
+
+import org.specs2._
+import org.specs2.specification.Step
+
+class VersionsSpec extends Specification { def is =
+  "PredictionIO Software Manager Versions Specification"                      ^
+                                                                              p^
+  "load version file"                                                         ! load()^
+  "get latest version"                                                        ! latestVersion()^
+  "get latest version binaries"                                               ! latestBinaries()^
+  "get latest version sources"                                                ! latestSources()^
+  "get a non-existent updater"                                                ! latestUpdater()^
+  "get version sequence"                                                      ! sequence()^
+  "get a version that requires update"                                        ! updateRequired()^
+  "get an update sequence"                                                    ! updateSequence()^
+                                                                              end
+
+  lazy val versions = Versions(getClass.getResource("/versions.json").getPath)
+
+  def load() = versions must beAnInstanceOf[Versions]
+
+  def latestVersion() = versions.latestVersion must_== "0.5.0"
+
+  def latestBinaries() = versions.binaries(versions.latestVersion) must beSome("http://download.prediction.io/PredictionIO-0.5.0.zip")
+
+  def latestSources() = versions.sources(versions.latestVersion) must beSome("http://download.prediction.io/PredictionIO-0.5.0-sources.zip")
+
+  def latestUpdater() = versions.updater("0.5.1") must beNone
+
+  def sequence() = versions.sequence must_== Seq("0.5.0", "0.5.1", "0.6.0", "0.6.1", "0.6.2", "0.7.0", "0.20.0", "0.20.1", "1.0.0")
+
+  def updateRequired() = versions.updateRequired("0.6.1") must_== true
+
+  def updateSequence() = {
+    (versions.updateSequence("0.5.0", "0.20.1") must_== Seq("0.6.1", "0.7.0")) and
+      (versions.updateSequence("0.6.0", "1.0.0") must_== Seq("0.6.1", "0.7.0", "0.20.0"))
+  }
+}
diff --git a/tools/users/build.sbt b/tools/users/build.sbt
index 1337af2..c577b16 100644
--- a/tools/users/build.sbt
+++ b/tools/users/build.sbt
@@ -1,13 +1,13 @@
 name := "PredictionIO Users Tool"
 
-version := "0.5.0"
+version := "0.5.1"
 
 organization := "io.prediction"
 
 scalaVersion := "2.10.0"
 
 libraryDependencies ++= Seq(
-  "io.prediction" %% "predictionio-commons" % "0.5.0",
+  "io.prediction" %% "predictionio-commons" % "0.5.1",
   "commons-codec" % "commons-codec" % "1.8",
   "jline" % "jline" % "2.9"
 )
diff --git a/tools/users/src/main/scala/io/prediction/tools/users/Users.scala b/tools/users/src/main/scala/io/prediction/tools/users/Users.scala
index a10350b..6ba6581 100644
--- a/tools/users/src/main/scala/io/prediction/tools/users/Users.scala
+++ b/tools/users/src/main/scala/io/prediction/tools/users/Users.scala
@@ -16,12 +16,10 @@
       sys.exit(1)
     }
     println("PredictionIO CLI User Management")
-    println("1. Add a confirmed user")
-    val choice = readLine("Enter a choice: ")
-    choice match {
-      case "1" => adduser()
-      case _ => println("Unknown choice")
-    }
+    println()
+    println("This utility currently only support adding users.")
+    println()
+    adduser()
   }
 
   def adduser() = {