Merge branch 'develop'
diff --git a/README.md b/README.md
index 766cae6..f874bd5 100644
--- a/README.md
+++ b/README.md
@@ -2,10 +2,14 @@
 
 ## Documentation
 
-Please refer to http://docs.prediction.io/templates/similarproduct/quickstart/
+Please refer to http://predictionio.incubator.apache.org/templates/similarproduct/quickstart/
 
 ## Versions
 
+### v0.4.0
+
+Update for Apache PredictionIO 0.10.0-incubating
+
 ### v0.3.2
 
 - Fix CooccurrenceAlgorithm with unknown item ids
diff --git a/build.sbt b/build.sbt
index 3260f8e..e47aee3 100644
--- a/build.sbt
+++ b/build.sbt
@@ -4,14 +4,14 @@
 
 name := "template-scala-parallel-similarproduct"
 
-organization := "io.prediction"
+organization := "org.apache.predictionio"
 
 parallelExecution in Test := false
 
 test in assembly := {}
 
 libraryDependencies ++= Seq(
-  "io.prediction"    %% "core"          % pioVersion.value % "provided",
-  "org.apache.spark" %% "spark-core"    % "1.3.0" % "provided",
-  "org.apache.spark" %% "spark-mllib"   % "1.3.0" % "provided",
-  "org.scalatest"    %% "scalatest"     % "2.2.1" % "test")
+  "org.apache.predictionio" %% "apache-predictionio-core" % "0.10.0-incubating" % "provided",
+  "org.apache.spark"        %% "spark-core"               % "1.3.0" % "provided",
+  "org.apache.spark"        %% "spark-mllib"              % "1.3.0" % "provided",
+  "org.scalatest"           %% "scalatest"                % "2.2.1" % "test")
diff --git a/project/pio-build.sbt b/project/pio-build.sbt
deleted file mode 100644
index 8346a96..0000000
--- a/project/pio-build.sbt
+++ /dev/null
@@ -1 +0,0 @@
-addSbtPlugin("io.prediction" % "pio-build" % "0.9.0")
diff --git a/src/main/scala/ALSAlgorithm.scala b/src/main/scala/ALSAlgorithm.scala
index 7c0ddb9..2b6a3bb 100644
--- a/src/main/scala/ALSAlgorithm.scala
+++ b/src/main/scala/ALSAlgorithm.scala
@@ -1,8 +1,8 @@
 package org.template.similarproduct
 
-import io.prediction.controller.P2LAlgorithm
-import io.prediction.controller.Params
-import io.prediction.data.storage.BiMap
+import org.apache.predictionio.controller.P2LAlgorithm
+import org.apache.predictionio.controller.Params
+import org.apache.predictionio.data.storage.BiMap
 
 import org.apache.spark.SparkContext
 import org.apache.spark.SparkContext._
@@ -158,6 +158,7 @@
         i = i,
         items = model.items,
         categories = query.categories,
+        categoryBlackList = query.categoryBlackList,
         queryList = queryList,
         whiteList = whiteList,
         blackList = blackList
@@ -218,6 +219,7 @@
     i: Int,
     items: Map[Int, Item],
     categories: Option[Set[String]],
+    categoryBlackList: Option[Set[String]],
     queryList: Set[Int],
     whiteList: Option[Set[Int]],
     blackList: Option[Set[Int]]
@@ -232,6 +234,12 @@
         // keep this item if has ovelap categories with the query
         !(itemCat.toSet.intersect(cat).isEmpty)
       }.getOrElse(false) // discard this item if it has no categories
+    }.getOrElse(true) &&
+    categoryBlackList.map { cat =>
+      items(i).categories.map { itemCat =>
+        // discard this item if has ovelap categories with the query
+        (itemCat.toSet.intersect(cat).isEmpty)
+      }.getOrElse(true) // keep this item if it has no categories
     }.getOrElse(true)
   }
 
diff --git a/src/main/scala/CooccurrenceAlgorithm.scala b/src/main/scala/CooccurrenceAlgorithm.scala
index 3834ead..dbac702 100644
--- a/src/main/scala/CooccurrenceAlgorithm.scala
+++ b/src/main/scala/CooccurrenceAlgorithm.scala
@@ -1,8 +1,8 @@
 package org.template.similarproduct
 
-import io.prediction.controller.P2LAlgorithm
-import io.prediction.controller.Params
-import io.prediction.data.storage.BiMap
+import org.apache.predictionio.controller.P2LAlgorithm
+import org.apache.predictionio.controller.Params
+import org.apache.predictionio.data.storage.BiMap
 
 import org.apache.spark.SparkContext
 import org.apache.spark.rdd.RDD
diff --git a/src/main/scala/DataSource.scala b/src/main/scala/DataSource.scala
index b302d1a..f4c7221 100644
--- a/src/main/scala/DataSource.scala
+++ b/src/main/scala/DataSource.scala
@@ -1,11 +1,11 @@
 package org.template.similarproduct
 
-import io.prediction.controller.PDataSource
-import io.prediction.controller.EmptyEvaluationInfo
-import io.prediction.controller.EmptyActualResult
-import io.prediction.controller.Params
-import io.prediction.data.storage.Event
-import io.prediction.data.store.PEventStore
+import org.apache.predictionio.controller.PDataSource
+import org.apache.predictionio.controller.EmptyEvaluationInfo
+import org.apache.predictionio.controller.EmptyActualResult
+import org.apache.predictionio.controller.Params
+import org.apache.predictionio.data.storage.Event
+import org.apache.predictionio.data.store.PEventStore
 
 import org.apache.spark.SparkContext
 import org.apache.spark.SparkContext._
diff --git a/src/main/scala/Engine.scala b/src/main/scala/Engine.scala
index 766f7d8..c7a6a21 100644
--- a/src/main/scala/Engine.scala
+++ b/src/main/scala/Engine.scala
@@ -1,12 +1,13 @@
 package org.template.similarproduct
 
-import io.prediction.controller.IEngineFactory
-import io.prediction.controller.Engine
+import org.apache.predictionio.controller.IEngineFactory
+import org.apache.predictionio.controller.Engine
 
 case class Query(
   items: List[String],
   num: Int,
   categories: Option[Set[String]],
+  categoryBlackList: Option[Set[String]],
   whiteList: Option[Set[String]],
   blackList: Option[Set[String]]
 ) extends Serializable
diff --git a/src/main/scala/Preparator.scala b/src/main/scala/Preparator.scala
index c5e42ec..6b84b01 100644
--- a/src/main/scala/Preparator.scala
+++ b/src/main/scala/Preparator.scala
@@ -1,6 +1,6 @@
 package org.template.similarproduct
 
-import io.prediction.controller.PPreparator
+import org.apache.predictionio.controller.PPreparator
 
 import org.apache.spark.SparkContext
 import org.apache.spark.SparkContext._
diff --git a/src/main/scala/Serving.scala b/src/main/scala/Serving.scala
index 7a7f124..8543796 100644
--- a/src/main/scala/Serving.scala
+++ b/src/main/scala/Serving.scala
@@ -1,6 +1,6 @@
 package org.template.similarproduct
 
-import io.prediction.controller.LServing
+import org.apache.predictionio.controller.LServing
 
 class Serving
   extends LServing[Query, PredictedResult] {
diff --git a/src/test/scala/CooccurenceAlgorithmTest.scala b/src/test/scala/CooccurenceAlgorithmTest.scala
index 8a8e0b4..29ac40e 100644
--- a/src/test/scala/CooccurenceAlgorithmTest.scala
+++ b/src/test/scala/CooccurenceAlgorithmTest.scala
@@ -1,6 +1,6 @@
 package org.template.similarproduct
 
-import io.prediction.data.storage.BiMap
+import org.apache.predictionio.data.storage.BiMap
 
 import org.scalatest.FlatSpec
 import org.scalatest.Matchers
diff --git a/template.json b/template.json
index fb4a50b..d076ec5 100644
--- a/template.json
+++ b/template.json
@@ -1 +1 @@
-{"pio": {"version": { "min": "0.9.2" }}}
+{"pio": {"version": { "min": "0.10.0-incubating" }}}