Merge branch 'release-0.6.7'
diff --git a/bin/common.sh b/bin/common.sh
index 85f1f6f..bc123c0 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.6.6
+VERSION=0.6.7
 
 # Play framework related
 PLAY_OPTS=
diff --git a/build.sbt b/build.sbt
index 93dfdd7..6bd2d94 100644
--- a/build.sbt
+++ b/build.sbt
@@ -4,7 +4,7 @@
 
 name := "predictionio"
 
-version in ThisBuild := "0.6.6"
+version in ThisBuild := "0.6.7"
 
 organization in ThisBuild := "io.prediction"
 
diff --git a/dist/bin/backup b/dist/bin/backup
index 8462b1a..b8b418a 100755
--- a/dist/bin/backup
+++ b/dist/bin/backup
@@ -302,7 +302,7 @@
 declare -r lib_dir="$(realpath "${app_home}/../lib")"
 declare -r app_mainclass="io.prediction.tools.softwaremanager.Backup"
 
-declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.6.jar:$lib_dir/io.prediction.softwaremanager-0.6.6.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
+declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.7.jar:$lib_dir/io.prediction.softwaremanager-0.6.7.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
 
 addJava "-Dconfig.file=${app_home}/../conf/predictionio.conf -Dio.prediction.base=${app_home}/.."
 declare -r java_cmd=$(get_java_cmd)
diff --git a/dist/bin/common.sh b/dist/bin/common.sh
index 13cba64..151d8df 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.6.6
+VERSION=0.6.7
 
 # Play framework related
 PLAY_OPTS=""
diff --git a/dist/bin/restore b/dist/bin/restore
index b1f36ad..24c6afe 100755
--- a/dist/bin/restore
+++ b/dist/bin/restore
@@ -302,7 +302,7 @@
 declare -r lib_dir="$(realpath "${app_home}/../lib")"
 declare -r app_mainclass="io.prediction.tools.softwaremanager.Restore"
 
-declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.6.jar:$lib_dir/io.prediction.softwaremanager-0.6.6.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
+declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.7.jar:$lib_dir/io.prediction.softwaremanager-0.6.7.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
 
 addJava "-Dconfig.file=${app_home}/../conf/predictionio.conf -Dio.prediction.base=${app_home}/.."
 declare -r java_cmd=$(get_java_cmd)
diff --git a/dist/bin/updatecheck b/dist/bin/updatecheck
index 0873a76..8f3db7c 100755
--- a/dist/bin/updatecheck
+++ b/dist/bin/updatecheck
@@ -302,7 +302,7 @@
 declare -r lib_dir="$(realpath "${app_home}/../lib")"
 declare -r app_mainclass="io.prediction.tools.softwaremanager.UpdateCheck"
 
-declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.6.jar:$lib_dir/io.prediction.softwaremanager-0.6.6.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
+declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.7.jar:$lib_dir/io.prediction.softwaremanager-0.6.7.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
 
 addJava "-Dconfig.file=${app_home}/../conf/predictionio.conf -Dio.prediction.base=${app_home}/.."
 declare -r java_cmd=$(get_java_cmd)
diff --git a/dist/bin/upgrade b/dist/bin/upgrade
index 5bc6878..6e38675 100755
--- a/dist/bin/upgrade
+++ b/dist/bin/upgrade
@@ -302,7 +302,7 @@
 declare -r lib_dir="$(realpath "${app_home}/../lib")"
 declare -r app_mainclass="io.prediction.tools.softwaremanager.Upgrade"
 
-declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.6.jar:$lib_dir/io.prediction.softwaremanager-0.6.6.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
+declare -r app_classpath="$lib_dir/com.github.nscala-time.nscala-time_2.10-0.6.0.jar:$lib_dir/com.github.scopt.scopt_2.10-3.1.0.jar:$lib_dir/com.thoughtworks.paranamer.paranamer-2.6.jar:$lib_dir/com.typesafe.config-1.0.2.jar:$lib_dir/commons-io.commons-io-2.4.jar:$lib_dir/io.prediction.predictionio-commons-0.6.7.jar:$lib_dir/io.prediction.softwaremanager-0.6.7.jar:$lib_dir/joda-time.joda-time-2.3.jar:$lib_dir/org.joda.joda-convert-1.5.jar:$lib_dir/org.json4s.json4s-ast_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-core_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-ext_2.10-3.2.6.jar:$lib_dir/org.json4s.json4s-native_2.10-3.2.6.jar:$lib_dir/org.mongodb.casbah-commons_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-core_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-gridfs_2.10-2.6.2.jar:$lib_dir/org.mongodb.casbah-query_2.10-2.6.2.jar:$lib_dir/org.mongodb.mongo-java-driver-2.11.2.jar:$lib_dir/org.scala-lang.scala-compiler-2.10.0.jar:$lib_dir/org.scala-lang.scala-library-2.10.2.jar:$lib_dir/org.scala-lang.scala-reflect-2.10.0.jar:$lib_dir/org.scala-lang.scalap-2.10.0.jar:$lib_dir/org.slf4j.slf4j-api-1.6.0.jar:$lib_dir/org.slf4j.slf4j-nop-1.6.0.jar"
 
 addJava "-Dconfig.file=${app_home}/../conf/predictionio.conf -Dio.prediction.base=${app_home}/.."
 declare -r java_cmd=$(get_java_cmd)
diff --git a/dist/conf/init.json b/dist/conf/init.json
index d9e1eed..a4d068f 100644
--- a/dist/conf/init.json
+++ b/dist/conf/init.json
@@ -1,38 +1,38 @@
 {
     "systeminfos": {
         "version": {
-            "value": "0.6.6",
+            "value": "0.6.7",
             "description": "PredictionIO version"
         },
         "jars.pdioItemrecAlgo": {
-            "value": "predictionio-process-hadoop-scalding-assembly-0.6.6.jar"
+            "value": "predictionio-process-hadoop-scalding-assembly-0.6.7.jar"
         },
         "jars.pdioItemsimAlgo": {
-            "value": "predictionio-process-hadoop-scalding-assembly-0.6.6.jar"
+            "value": "predictionio-process-hadoop-scalding-assembly-0.6.7.jar"
         },
         "jars.mahoutItemrecAlgo": {
-            "value": "predictionio-process-itemrec-algorithms-scala-mahout-assembly-0.6.6.jar"
+            "value": "predictionio-process-itemrec-algorithms-scala-mahout-assembly-0.6.7.jar"
         },
         "jars.pdioItemrecEval": {
-            "value": "predictionio-process-hadoop-scalding-assembly-0.6.6.jar"
+            "value": "predictionio-process-hadoop-scalding-assembly-0.6.7.jar"
         },
         "jars.pdioItemsimEval": {
-            "value": "predictionio-process-hadoop-scalding-assembly-0.6.6.jar"
+            "value": "predictionio-process-hadoop-scalding-assembly-0.6.7.jar"
         },
         "jars.pdioItemrecTopK": {
-            "value": "predictionio-process-itemrec-evaluations-topkitems-assembly-0.6.6.jar"
+            "value": "predictionio-process-itemrec-evaluations-topkitems-assembly-0.6.7.jar"
         },
         "jars.pdioItemsimTopK": {
-            "value": "predictionio-process-itemsim-evaluations-topkitems-assembly-0.6.6.jar"
+            "value": "predictionio-process-itemsim-evaluations-topkitems-assembly-0.6.7.jar"
         },
         "jars.pdioCommonsEval": {
-            "value": "predictionio-process-hadoop-scalding-assembly-0.6.6.jar"
+            "value": "predictionio-process-hadoop-scalding-assembly-0.6.7.jar"
         },
         "jars.pdioCommonsParamGen": {
-            "value": "predictionio-process-commons-evaluations-paramgen-assembly-0.6.6.jar"
+            "value": "predictionio-process-commons-evaluations-paramgen-assembly-0.6.7.jar"
         },
         "jars.pdioCommonsU2ITrainingTestSplit": {
-            "value": "predictionio-process-commons-evaluations-scala-u2itrainingtestsplittime-assembly-0.6.6.jar"
+            "value": "predictionio-process-commons-evaluations-scala-u2itrainingtestsplittime-assembly-0.6.7.jar"
         }
     },
     "engineinfos": {
diff --git a/output/src/main/scala/io/prediction/output/itemrec/ItemRecAlgoOutput.scala b/output/src/main/scala/io/prediction/output/itemrec/ItemRecAlgoOutput.scala
index 0d7a018..4e90b51 100644
--- a/output/src/main/scala/io/prediction/output/itemrec/ItemRecAlgoOutput.scala
+++ b/output/src/main/scala/io/prediction/output/itemrec/ItemRecAlgoOutput.scala
@@ -6,6 +6,8 @@
 
 import scala.util.Random
 
+import com.github.nscala_time.time.Imports._
+
 trait ItemRecAlgoOutput {
   /** output the Seq of iids */
   def output(uid: String, n: Int, itypes: Option[Seq[String]])(implicit app: App, algo: Algo, offlineEval: Option[OfflineEval]): Iterator[String]
@@ -31,17 +33,29 @@
      * of documents that can be returned from a query with geospatial constraint is 100.
      * A "manual join" is still feasible with this size.
      */
-    val iids: Iterator[String] = latlng.map { ll =>
+    val (iids, iidsCopy): (Iterator[String], Iterator[String]) = latlng.map { ll =>
       val geoItems = items.getByAppidAndLatlng(app.id, ll, within, unit).map(_.id).toSet
       // use n = 0 to return all available iids for now
-      knnitembased.ItemRecKNNItemBasedAlgoOutput.output(uid, 0, itypes).filter { geoItems(_) }
+      ItemRecCFAlgoOutput.output(uid, 0, itypes).filter { geoItems(_) }
     }.getOrElse {
       // use n = 0 to return all available iids for now
-      knnitembased.ItemRecKNNItemBasedAlgoOutput.output(uid, 0, itypes)
-    }
+      ItemRecCFAlgoOutput.output(uid, 0, itypes)
+    }.duplicate
+
+    /** Start and end time filtering. */
+    val itemsForTimeCheck = items.getByIds(app.id, iidsCopy.toSeq)
+    val iidsWithValidTimeSet = (itemsForTimeCheck filter { item =>
+      (item.starttime, item.endtime) match {
+        case (Some(st), None) => DateTime.now >= st
+        case (None, Some(et)) => DateTime.now <= et
+        case (Some(st), Some(et)) => st <= DateTime.now && DateTime.now <= et
+        case _ => true
+      }
+    } map { _.id }).toSet
+    val iidsWithValidTime: Iterator[String] = iids.filter { iidsWithValidTimeSet(_) }
 
     /** At this point "output" is guaranteed to have n*(s+1) items (seen or unseen) unless model data is exhausted. */
-    val output = iids.take(finalN).toList
+    val output = iidsWithValidTime.take(finalN).toList
 
     /** Serendipity output. */
     val serendipityOutput = serendipity.map { s =>
diff --git a/output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoBatchOutput.scala b/output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoBatchOutput.scala
similarity index 83%
rename from output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoBatchOutput.scala
rename to output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoBatchOutput.scala
index 94291c8..ef985aa 100644
--- a/output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoBatchOutput.scala
+++ b/output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoBatchOutput.scala
@@ -1,10 +1,10 @@
-package io.prediction.output.itemrec.knnitembased
+package io.prediction.output.itemrec
 
 import io.prediction.commons.Config
 import io.prediction.commons.modeldata.ItemRecScore
 import io.prediction.commons.settings.{ Algo, App, OfflineEval }
 
-object ItemRecKNNItemBasedAlgoBatchOutput {
+object ItemRecCFAlgoBatchOutput {
   private val config = new Config
 
   def output(uid: String, n: Int, itypes: Option[Seq[String]])(implicit app: App, algo: Algo, offlineEval: Option[OfflineEval]) = {
diff --git a/output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoOutput.scala b/output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoOutput.scala
new file mode 100644
index 0000000..545b28f
--- /dev/null
+++ b/output/src/main/scala/io/prediction/output/itemrec/ItemRecCFAlgoOutput.scala
@@ -0,0 +1,11 @@
+package io.prediction.output.itemrec
+
+import io.prediction.commons.modeldata.ItemRecScore
+import io.prediction.commons.settings.{ App, Algo, OfflineEval }
+
+object ItemRecCFAlgoOutput extends ItemRecAlgoOutput {
+  override def output(uid: String, n: Int, itypes: Option[Seq[String]])(implicit app: App, algo: Algo, offlineEval: Option[OfflineEval]): Iterator[String] = {
+    /** Batch mode output only for now. */
+    ItemRecCFAlgoBatchOutput.output(uid, n, itypes)
+  }
+}
diff --git a/output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoOutput.scala b/output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoOutput.scala
deleted file mode 100644
index 0aad04d..0000000
--- a/output/src/main/scala/io/prediction/output/itemrec/knnitembased/ItemRecKNNItemBasedAlgoOutput.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.prediction.output.itemrec.knnitembased
-
-import io.prediction.commons.modeldata.ItemRecScore
-import io.prediction.commons.settings.{ App, Algo, OfflineEval }
-import io.prediction.output.itemrec.ItemRecAlgoOutput
-
-object ItemRecKNNItemBasedAlgoOutput extends ItemRecAlgoOutput {
-  override def output(uid: String, n: Int, itypes: Option[Seq[String]])(implicit app: App, algo: Algo, offlineEval: Option[OfflineEval]): Iterator[String] = {
-    /** Batch mode output only for now. */
-    ItemRecKNNItemBasedAlgoBatchOutput.output(uid, n, itypes)
-  }
-}
diff --git a/output/src/main/scala/io/prediction/output/itemsim/ItemSimAlgoOutput.scala b/output/src/main/scala/io/prediction/output/itemsim/ItemSimAlgoOutput.scala
index 012cbf2..8b2559f 100644
--- a/output/src/main/scala/io/prediction/output/itemsim/ItemSimAlgoOutput.scala
+++ b/output/src/main/scala/io/prediction/output/itemsim/ItemSimAlgoOutput.scala
@@ -6,6 +6,8 @@
 
 import scala.util.Random
 
+import com.github.nscala_time.time.Imports._
+
 trait ItemSimAlgoOutput {
   def output(iid: String, n: Int, itypes: Option[Seq[String]])(implicit app: App, algo: Algo, offlineEval: Option[OfflineEval]): Iterator[String]
 }
@@ -30,17 +32,29 @@
      * of documents that can be returned from a query with geospatial constraint is 100.
      * A "manual join" is still feasible with this size.
      */
-    val iids: Iterator[String] = latlng.map { ll =>
+    val (iids, iidsCopy): (Iterator[String], Iterator[String]) = latlng.map { ll =>
       val geoItems = items.getByAppidAndLatlng(app.id, ll, within, unit).map(_.id).toSet
       // use n = 0 to return all available iids for now
       ItemSimCFAlgoOutput.output(iid, 0, itypes).filter { geoItems(_) }
     }.getOrElse {
       // use n = 0 to return all available iids for now
       ItemSimCFAlgoOutput.output(iid, 0, itypes)
-    }
+    }.duplicate
+
+    /** Start and end time filtering. */
+    val itemsForTimeCheck = items.getByIds(app.id, iidsCopy.toSeq)
+    val iidsWithValidTimeSet = (itemsForTimeCheck filter { item =>
+      (item.starttime, item.endtime) match {
+        case (Some(st), None) => DateTime.now >= st
+        case (None, Some(et)) => DateTime.now <= et
+        case (Some(st), Some(et)) => st <= DateTime.now && DateTime.now <= et
+        case _ => true
+      }
+    } map { _.id }).toSet
+    val iidsWithValidTime: Iterator[String] = iids.filter { iidsWithValidTimeSet(_) }
 
     /** At this point "output" is guaranteed to have n*(s+1) items (seen or unseen) unless model data is exhausted. */
-    val output = iids.take(finalN).toList
+    val output = iidsWithValidTime.take(finalN).toList
 
     /** Serendipity output. */
     val serendipityOutput = serendipity.map { s =>
diff --git a/output/src/test/scala/io/prediction/output/AlgoOutputSelectorSpec.scala b/output/src/test/scala/io/prediction/output/AlgoOutputSelectorSpec.scala
index eb2e013..80c21d8 100644
--- a/output/src/test/scala/io/prediction/output/AlgoOutputSelectorSpec.scala
+++ b/output/src/test/scala/io/prediction/output/AlgoOutputSelectorSpec.scala
@@ -20,12 +20,14 @@
       p ^
       "get itemrec output from a valid engine" ! itemRecOutputSelection(algoOutputSelector) ^
       "get itemrec output with geo from a valid engine" ! itemRecOutputSelectionWithLatlng(algoOutputSelector) ^
+      "get itemrec output with time constraints from a valid engine" ! itemRecOutputSelectionWithTime(algoOutputSelector) ^
       //"get itemrec output from a valid engine without seen items"               ! itemRecOutputSelectionUnseenOnly(algoOutputSelector) ^
       //"get itemrec output from a valid engine with an unsupported algorithm"    ! itemRecOutputSelectionUnsupportedAlgo(algoOutputSelector) ^
       "get itemrec output from a valid engine with no algorithm" ! itemRecOutputSelectionNoAlgo(algoOutputSelector) ^
       "get itemrec output from an invalid engine" ! itemRecOutputSelectionBadEngine(algoOutputSelector) ^
       "get itemsim output from a valid engine" ! itemSimOutputSelection(algoOutputSelector) ^
       "get itemsim output with geo from a valid engine" ! itemSimOutputSelectionWithLatlng(algoOutputSelector) ^
+      "get itemsim output with time constraints from a valid engine" ! itemSimOutputSelectionWithTime(algoOutputSelector) ^
       //"get itemsim output from a valid engine with an unsupported algorithm"    ! itemSimOutputSelectionUnsupportedAlgo(algoOutputSelector) ^
       "get itemsim output from a valid engine with no algorithm" ! itemSimOutputSelectionNoAlgo(algoOutputSelector) ^
       "get itemsim output from an invalid engine" ! itemSimOutputSelectionBadEngine(algoOutputSelector) ^
@@ -264,7 +266,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(14).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -276,7 +278,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(23).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -288,7 +290,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(17).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -300,7 +302,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(3).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -330,6 +332,120 @@
     algoOutputSelector.itemRecSelection("user1", 10, None, Some((37.3229978, -122.0321823)), Some(2.2), None)(dummyApp, engine.copy(id = engineid)) must beEqualTo(Seq(id + "hsh", id + "dac"))
   }
 
+  def itemRecOutputSelectionWithTime(algoOutputSelector: AlgoOutputSelector) = {
+    val appid = dummyApp.id
+    val engine = Engine(
+      id = 0,
+      appid = appid,
+      name = "itemRecOutputSelectionWithTime",
+      infoid = "itemrec",
+      itypes = Some(Seq("foo", "bar")),
+      params = Map()
+    )
+    val engineid = mongoEngines.insert(engine)
+
+    val algo = Algo(
+      id = 0,
+      engineid = engineid,
+      name = "itemRecOutputSelectionWithTime",
+      infoid = "pdio-knnitembased",
+      command = "itemRecOutputSelectionWithTime",
+      params = Map("foo" -> "bar"),
+      settings = Map("dead" -> "beef"),
+      modelset = true,
+      createtime = DateTime.now,
+      updatetime = DateTime.now,
+      status = "deployed",
+      offlineevalid = None
+    )
+    val algoid = mongoAlgos.insert(algo)
+
+    val id = "itemRecOutputSelectionWithTime"
+
+    val dac = Item(
+      id = id + "dac",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = Some(DateTime.now),
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3197611, -122.0466141)),
+      inactive = None,
+      attributes = Some(Map("foo" -> "bar", "foo2" -> "bar2")))
+    val hsh = Item(
+      id = id + "hsh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = Some(DateTime.lastHour),
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3370801, -122.0493201)),
+      inactive = None,
+      attributes = None)
+    val mvh = Item(
+      id = id + "mvh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = Some(DateTime.nextHour),
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3154153, -122.0566829)),
+      inactive = None,
+      attributes = Some(Map("foo3" -> "bar3")))
+    val lbh = Item(
+      id = id + "lbh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = Some(DateTime.lastHour),
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.2997029, -122.0034684)),
+      inactive = None,
+      attributes = Some(Map("foo4" -> "bar4", "foo5" -> "bar5")))
+    val lbh2 = Item(
+      id = id + "lbh2",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.2997029, -122.0034684)),
+      inactive = None,
+      attributes = Some(Map("foo4" -> "bar4", "foo5" -> "bar5")))
+    val allItems = Seq(dac, hsh, lbh, lbh2, mvh)
+    allItems foreach { mongoItems.insert(_) }
+
+    val scores: Seq[(String, Double, Seq[String])] = Seq(
+      // (iid, score, itypes)
+      (id + "hsh", 5, Seq("foo")),
+      (id + "mvh", 4, Seq("foo")),
+      (id + "lbh", 3, Seq("bar")),
+      (id + "lbh2", 2, Seq("bar")),
+      (id + "dac", 1, Seq("bar")))
+
+    mongoItemRecScores.insert(ItemRecScore(
+      uid = "user1",
+      iids = scores.map(_._1),
+      scores = scores.map(_._2),
+      itypes = scores.map(_._3),
+      appid = dummyApp.id,
+      algoid = algoid,
+      modelset = true
+    ))
+
+    algoOutputSelector.itemRecSelection("user1", 10, None, Some((37.3229978, -122.0321823)), Some(10), None)(dummyApp, engine.copy(id = engineid)) must beEqualTo(Seq(id + "hsh", id + "mvh", id + "lbh2", id + "dac"))
+  }
+
   def itemRecOutputSelectionUnseenOnly(algoOutputSelector: AlgoOutputSelector) = {
     val engine = Engine(
       id = 0,
@@ -536,14 +652,14 @@
     )
     val algoid = mongoAlgos.insert(algo)
 
-    val id = "itemRecOutputSelectionWithLatlng"
+    val id = "itemSimOutputSelectionWithLatlng"
 
     val dac = Item(
       id = id + "dac",
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(14).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -555,7 +671,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(23).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -567,7 +683,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(17).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -579,7 +695,7 @@
       appid = appid,
       ct = DateTime.now,
       itypes = List("fresh", "meat"),
-      starttime = Some(DateTime.now.hour(3).minute(13)),
+      starttime = Some(DateTime.now),
       endtime = None,
       price = Some(49.394),
       profit = None,
@@ -609,6 +725,120 @@
     algoOutputSelector.itemSimSelection("user1", 10, None, Some((37.3229978, -122.0321823)), Some(2.2), None)(dummyApp, engine.copy(id = engineid)) must beEqualTo(Seq(id + "hsh", id + "dac"))
   }
 
+  def itemSimOutputSelectionWithTime(algoOutputSelector: AlgoOutputSelector) = {
+    val appid = dummyApp.id
+    val engine = Engine(
+      id = 0,
+      appid = appid,
+      name = "itemSimOutputSelectionWithTime",
+      infoid = "itemsim",
+      itypes = Some(Seq("foo", "bar")),
+      params = Map()
+    )
+    val engineid = mongoEngines.insert(engine)
+
+    val algo = Algo(
+      id = 0,
+      engineid = engineid,
+      name = "itemSimOutputSelectionWithTime",
+      infoid = "pdio-knnitembased",
+      command = "itemSimOutputSelectionWithTime",
+      params = Map("foo" -> "bar"),
+      settings = Map("dead" -> "beef"),
+      modelset = true,
+      createtime = DateTime.now,
+      updatetime = DateTime.now,
+      status = "deployed",
+      offlineevalid = None
+    )
+    val algoid = mongoAlgos.insert(algo)
+
+    val id = "itemSimOutputSelectionWithTime"
+
+    val dac = Item(
+      id = id + "dac",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = Some(DateTime.now),
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3197611, -122.0466141)),
+      inactive = None,
+      attributes = Some(Map("foo" -> "bar", "foo2" -> "bar2")))
+    val hsh = Item(
+      id = id + "hsh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = Some(DateTime.lastHour),
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3370801, -122.0493201)),
+      inactive = None,
+      attributes = None)
+    val mvh = Item(
+      id = id + "mvh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = Some(DateTime.nextHour),
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.3154153, -122.0566829)),
+      inactive = None,
+      attributes = Some(Map("foo3" -> "bar3")))
+    val lbh = Item(
+      id = id + "lbh",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = Some(DateTime.lastHour),
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.2997029, -122.0034684)),
+      inactive = None,
+      attributes = Some(Map("foo4" -> "bar4", "foo5" -> "bar5")))
+    val lbh2 = Item(
+      id = id + "lbh2",
+      appid = appid,
+      ct = DateTime.now,
+      itypes = List("fresh", "meat"),
+      starttime = None,
+      endtime = None,
+      price = Some(49.394),
+      profit = None,
+      latlng = Some((37.2997029, -122.0034684)),
+      inactive = None,
+      attributes = Some(Map("foo4" -> "bar4", "foo5" -> "bar5")))
+    val allItems = Seq(dac, hsh, lbh, lbh2, mvh)
+    allItems foreach { mongoItems.insert(_) }
+
+    val scores: Seq[(String, Double, Seq[String])] = Seq(
+      // (iid, score, itypes)
+      (id + "hsh", 5, Seq("foo")),
+      (id + "mvh", 4, Seq("foo")),
+      (id + "lbh", 3, Seq("bar")),
+      (id + "lbh2", 2, Seq("bar")),
+      (id + "dac", 1, Seq("bar")))
+
+    mongoItemSimScores.insert(ItemSimScore(
+      iid = "item1",
+      simiids = scores.map(_._1),
+      scores = scores.map(_._2),
+      itypes = scores.map(_._3),
+      appid = dummyApp.id,
+      algoid = algoid,
+      modelset = true
+    ))
+
+    algoOutputSelector.itemSimSelection("item1", 10, None, Some((37.3229978, -122.0321823)), Some(10), None)(dummyApp, engine.copy(id = engineid)) must beEqualTo(Seq(id + "hsh", id + "mvh", id + "lbh2", id + "dac"))
+  }
+
   def itemSimOutputSelectionUnsupportedAlgo(algoOutputSelector: AlgoOutputSelector) = {
     val engine = Engine(
       id = 0,
diff --git a/servers/admin/build.sbt b/servers/admin/build.sbt
index 29a59a9..4cf284c 100644
--- a/servers/admin/build.sbt
+++ b/servers/admin/build.sbt
@@ -1,6 +1,6 @@
 name := "predictionio-admin"
 
-version := "0.6.6"
+version := "0.6.7"
 
 organization := "io.prediction"
 
diff --git a/servers/api/build.sbt b/servers/api/build.sbt
index edd9687..3e6e24c 100644
--- a/servers/api/build.sbt
+++ b/servers/api/build.sbt
@@ -1,6 +1,6 @@
 name := "predictionio-api"
 
-version := "0.6.6"
+version := "0.6.7"
 
 organization := "io.prediction"
 
diff --git a/servers/scheduler/app/controllers/Jobs.scala b/servers/scheduler/app/controllers/Jobs.scala
index d68dc19..36ad4a0 100644
--- a/servers/scheduler/app/controllers/Jobs.scala
+++ b/servers/scheduler/app/controllers/Jobs.scala
@@ -161,7 +161,7 @@
     command.setAttribute("modeldataTrainingDbHost", config.modeldataTrainingDbHost)
     command.setAttribute("modeldataTrainingDbPort", config.modeldataTrainingDbPort)
     engine.itypes foreach { it =>
-      command.setAttribute("itypes", "--itypes" + it.mkString(" "))
+      command.setAttribute("itypes", "--itypes" + " " + it.mkString(" ")) // NOTE: a space ' ' is necessary after --itypes
     }
     command.setAttribute("numRecommendations", engine.params.getOrElse("numRecommendations", 500))
     command.setAttribute("numSimilarItems", engine.params.getOrElse("numSimilarItems", 500))
diff --git a/servers/scheduler/build.sbt b/servers/scheduler/build.sbt
index cb8f40e..84d4f13 100644
--- a/servers/scheduler/build.sbt
+++ b/servers/scheduler/build.sbt
@@ -1,6 +1,6 @@
 name := "predictionio-scheduler"
 
-version := "0.6.6"
+version := "0.6.7"
 
 organization := "io.prediction"
 
diff --git a/servers/scheduler/conf/application.conf b/servers/scheduler/conf/application.conf
index 03d7dd1..b181aff 100644
--- a/servers/scheduler/conf/application.conf
+++ b/servers/scheduler/conf/application.conf
@@ -86,28 +86,28 @@
 io.prediction.commons.settings.db.port=27017
 
 # PredictionIO Algorithms
-pdio-knnitembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-pdio-latestrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-pdio-randomrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-itembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-parallelals.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-knnuserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-thresholduserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-slopeone.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-alswr.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-svdsgd.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-svdplusplus.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
+pdio-knnitembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+pdio-latestrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+pdio-randomrank.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-itembased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-parallelals.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-knnuserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-thresholduserbased.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-slopeone.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-alswr.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-svdsgd.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-svdplusplus.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
 
-pdio-itemsimcf.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-pdio-itemsimlatestrank.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-pdio-itemsimrandomrank.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
-mahout-itemsimcf.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
+pdio-itemsimcf.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+pdio-itemsimlatestrank.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+pdio-itemsimrandomrank.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
+mahout-itemsimcf.jar=${io.prediction.itemsim.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemSim-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
 
 # PredictionIO generic scalding job
-io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.6.jar
+io.prediction.algorithms.scalding.itemrec.generic.jar=${io.prediction.itemrec.base}/algorithms/hadoop/scalding/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Hadoop-Scalding-assembly-0.6.7.jar
 
 # Itemrec Scala Mahout Algorithms
-io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.itemrec.base}/algorithms/scala/mahout/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.6.6.jar
+io.prediction.algorithms.mahout.itemrec.jar=${io.prediction.itemrec.base}/algorithms/scala/mahout/target/scala-2.10/PredictionIO-Process-ItemRec-Algorithms-Scala-Mahout-assembly-0.6.7.jar
 
 # Mahout core job
 io.prediction.algorithms.mahout-core-job.jar=${io.prediction.base}/vendors/mahout-distribution-0.8/mahout-core-0.8-job.jar
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 7a6a6e4..21387e6 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.6.6")
+      head("PredictionIO Backup Utility", "0.6.7")
       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 48cead2..ecb9f77 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.6.6")
+      head("PredictionIO Restore Utility", "0.6.7")
       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 4f9ee50..993a1a1 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
@@ -16,7 +16,7 @@
 
   def main(args: Array[String]) {
     val parser = new scopt.OptionParser[UpdateCheckConfig]("updatecheck") {
-      head("PredictionIO Update Checker", "0.6.6")
+      head("PredictionIO Update Checker", "0.6.7")
       help("help") text ("prints this usage text")
       opt[String]("localVersion") action { (x, c) =>
         c.copy(localVersion = x)
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 10dbac8..e492318 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
@@ -17,7 +17,7 @@
 /** Upgrades previous version to current version. */
 object Upgrade {
   def main(args: Array[String]) {
-    val thisVersion = "0.6.6"
+    val thisVersion = "0.6.7"
     val parser = new scopt.OptionParser[UpgradeConfig]("upgrade") {
       head("PredictionIO Software Upgrade Utility", thisVersion)
       help("help") text ("prints this usage text")