diff --git a/README.md b/README.md
index 45399de..fa79ef9 100644
--- a/README.md
+++ b/README.md
@@ -19,7 +19,7 @@
 
 ## Overview
 
-[Apache Rya] is a scalable RDF Store that is built on top of a Columnar Index Store (such as Accumulo). It is implemented as an extension to OpenRdf to provide easy query mechanisms (SPARQL, SERQL, etc) and Rdf data storage (RDF/XML, NTriples, etc).
+[Apache Rya] is a scalable RDF Store that is built on top of a Columnar Index Store (such as Accumulo). It is implemented as an extension to RDF4J to provide easy query mechanisms (SPARQL, SERQL, etc) and Rdf data storage (RDF/XML, NTriples, etc).
 
 Rya stands for RDF y(and) Accumulo.
 
@@ -125,6 +125,47 @@
 
 ### Load Data
 
+#### Direct Code
+
+Here is a code snippet for directly running against Accumulo with the code. You will need at least accumulo.rya.jar, rya.api, rya.sail.impl on the classpath and transitive dependencies. I find that Maven is the easiest way to get a project dependency tree set up.
+
+``` JAVA
+Connector connector = new ZooKeeperInstance("instance", "zoo1,zoo2,zoo3").getConnector("user", "password");
+
+final RdfCloudTripleStore store = new RdfCloudTripleStore();
+AccumuloRyaDAO crdfdao = new AccumuloRyaDAO();
+crdfdao.setConnector(connector);
+
+AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
+conf.setTablePrefix("rya_");
+conf.setDisplayQueryPlan(true);
+crdfdao.setConf(conf);
+store.setRyaDAO(crdfdao);
+
+InferenceEngine inferenceEngine = new InferenceEngine();
+inferenceEngine.setRyaDAO(crdfdao);
+inferenceEngine.setConf(conf);
+store.setInferenceEngine(inferenceEngine);
+
+Repository myRepository = new RyaSailRepository(store);
+myRepository.initialize();
+
+String query = "select * where {\n" +
+                    "<http://mynamespace/ProductType1> ?p ?o.\n" +
+                    "}";
+RepositoryConnection conn = myRepository.getConnection();
+System.out.println(query);
+TupleQuery tupleQuery = conn.prepareTupleQuery(
+        QueryLanguage.SPARQL, query);
+ValueFactory vf = ValueFactoryImpl.getInstance();
+
+TupleQueryResultHandler writer = new SPARQLResultsXMLWriter(System.out);
+tupleQuery.evaluate(writer);
+
+conn.close();
+myRepository.shutDown();
+```
+
 #### Web REST endpoint
 
 The War sets up a Web REST endpoint at `http://server/web.rya/loadrdf` that allows POST data to get loaded into the Rdf Store. This short tutorial will use Java code to post data.
@@ -208,14 +249,14 @@
 
 * rdf.tablePrefix : The tables (spo, po, osp) are prefixed with this qualifier. The tables become: (rdf.tablePrefix)spo,(rdf.tablePrefix)po,(rdf.tablePrefix)osp
 * ac.* : Accumulo connection parameters
-* rdf.format : See RDFFormat from openrdf, samples include (Trig, N-Triples, RDF/XML)
+* rdf.format : See RDFFormat from RDF4J, samples include (Trig, N-Triples, RDF/XML)
 * io.sort.mb : Higher the value, the faster the job goes. Just remember that you will need this much ram at least per mapper
 
 The argument is the directory/file to load. This file needs to be loaded into HDFS before running.
 
-#### Direct OpenRDF API
+#### Direct RDF4J API
 
-Here is some sample code to load data directly through the OpenRDF API. (Loading N-Triples data)
+Here is some sample code to load data directly through the RDF4J API. (Loading N-Triples data)
 You will need at least accumulo.rya-<version>, rya.api, rya.sail.impl on the classpath and transitive dependencies. I find that Maven is the easiest way to get a project dependency tree set up.
 
 ``` JAVA
@@ -297,47 +338,6 @@
 
 Compile and run this code above, changing the url that your Rdf War is running at.
 
-#### Direct Code
-
-Here is a code snippet for directly running against Accumulo with the code. You will need at least accumulo.rya.jar, rya.api, rya.sail.impl on the classpath and transitive dependencies. I find that Maven is the easiest way to get a project dependency tree set up.
-
-``` JAVA
-Connector connector = new ZooKeeperInstance("instance", "zoo1,zoo2,zoo3").getConnector("user", "password");
-
-final RdfCloudTripleStore store = new RdfCloudTripleStore();
-AccumuloRyaDAO crdfdao = new AccumuloRyaDAO();
-crdfdao.setConnector(connector);
-
-AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-conf.setTablePrefix("rya_");
-conf.setDisplayQueryPlan(true);
-crdfdao.setConf(conf);
-store.setRyaDAO(crdfdao);
-
-InferenceEngine inferenceEngine = new InferenceEngine();
-inferenceEngine.setRyaDAO(crdfdao);
-inferenceEngine.setConf(conf);
-store.setInferenceEngine(inferenceEngine);
-
-Repository myRepository = new RyaSailRepository(store);
-myRepository.initialize();
-
-String query = "select * where {\n" +
-                    "<http://mynamespace/ProductType1> ?p ?o.\n" +
-                    "}";
-RepositoryConnection conn = myRepository.getConnection();
-System.out.println(query);
-TupleQuery tupleQuery = conn.prepareTupleQuery(
-        QueryLanguage.SPARQL, query);
-ValueFactory vf = ValueFactoryImpl.getInstance();
-
-TupleQueryResultHandler writer = new SPARQLResultsXMLWriter(System.out);
-tupleQuery.evaluate(writer);
-
-conn.close();
-myRepository.shutDown();
-```
-
 
 [Apache Rya]: http://rya.incubator.apache.org/ 
 [Accumulo]: https://accumulo.apache.org/
diff --git a/common/rya.api.function/pom.xml b/common/rya.api.function/pom.xml
index cb09c2b..293019f 100644
--- a/common/rya.api.function/pom.xml
+++ b/common/rya.api.function/pom.xml
@@ -39,12 +39,12 @@
 
         <!-- Third Party Dependencies -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-model</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-model</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-evaluation</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-evaluation</artifactId>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationState.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationState.java
index 2551696..8e3175d 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationState.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationState.java
@@ -25,7 +25,7 @@
 import java.util.Map;
 import java.util.Objects;
 
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationType.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationType.java
index 5383da1..fb0e876 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationType.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationType.java
@@ -22,12 +22,12 @@
 
 import java.util.Optional;
 
-import org.openrdf.query.algebra.AggregateOperator;
-import org.openrdf.query.algebra.Avg;
-import org.openrdf.query.algebra.Count;
-import org.openrdf.query.algebra.Max;
-import org.openrdf.query.algebra.Min;
-import org.openrdf.query.algebra.Sum;
+import org.eclipse.rdf4j.query.algebra.AggregateOperator;
+import org.eclipse.rdf4j.query.algebra.Avg;
+import org.eclipse.rdf4j.query.algebra.Count;
+import org.eclipse.rdf4j.query.algebra.Max;
+import org.eclipse.rdf4j.query.algebra.Min;
+import org.eclipse.rdf4j.query.algebra.Sum;
 
 import com.google.common.collect.ImmutableMap;
 
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationsEvaluator.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationsEvaluator.java
index 2aa716f..d0a89fc 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationsEvaluator.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AggregationsEvaluator.java
@@ -28,12 +28,12 @@
 
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.model.visibility.VisibilitySimplifier;
-import org.openrdf.query.algebra.AggregateOperator;
-import org.openrdf.query.algebra.Group;
-import org.openrdf.query.algebra.GroupElem;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.algebra.AggregateOperator;
+import org.eclipse.rdf4j.query.algebra.Group;
+import org.eclipse.rdf4j.query.algebra.GroupElem;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -113,7 +113,7 @@
                 final String resultBindingName = groupElem.getName();
 
                 final AtomicReference<String> aggregatedBindingName = new AtomicReference<>();
-                groupElem.visitChildren(new QueryModelVisitorBase<RuntimeException>() {
+                groupElem.visitChildren(new AbstractQueryModelVisitor<RuntimeException>() {
                     @Override
                     public void meet(final Var node) {
                         aggregatedBindingName.set( node.getName() );
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AverageFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AverageFunction.java
index 4a31fce..b2c92e6 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AverageFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/AverageFunction.java
@@ -26,15 +26,15 @@
 import java.util.Map;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Value;
-import org.openrdf.model.datatypes.XMLDatatypeUtil;
-import org.openrdf.model.impl.DecimalLiteralImpl;
-import org.openrdf.model.impl.IntegerLiteralImpl;
-import org.openrdf.query.algebra.MathExpr.MathOp;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.util.MathUtil;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.MathExpr.MathOp;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.MathUtil;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,6 +48,7 @@
 @DefaultAnnotation(NonNull.class)
 public final class AverageFunction implements AggregationFunction {
     private static final Logger log = LoggerFactory.getLogger(AverageFunction.class);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     public void update(final AggregationElement aggregation, final AggregationState state, final VisibilityBindingSet childBindingSet) {
@@ -73,15 +74,15 @@
                 if (childLiteral.getDatatype() != null && XMLDatatypeUtil.isNumericDatatype(childLiteral.getDatatype())) {
                     try {
                         // Update the sum.
-                        final Literal oldSum = new DecimalLiteralImpl(averageState.getSum());
+                        final Literal oldSum = VF.createLiteral(averageState.getSum());
                         final BigDecimal sum = MathUtil.compute(oldSum, childLiteral, MathOp.PLUS).decimalValue();
 
                         // Update the count.
                         final BigInteger count = averageState.getCount().add( BigInteger.ONE );
 
                         // Update the BindingSet to include the new average.
-                        final Literal sumLiteral = new DecimalLiteralImpl(sum);
-                        final Literal countLiteral = new IntegerLiteralImpl(count);
+                        final Literal sumLiteral = VF.createLiteral(sum);
+                        final Literal countLiteral = VF.createLiteral(count);
                         final Literal average = MathUtil.compute(sumLiteral, countLiteral, MathOp.DIVIDE);
                         result.addBinding(resultName, average);
 
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/CountFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/CountFunction.java
index 879df5e..c6d76f9 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/CountFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/CountFunction.java
@@ -24,9 +24,10 @@
 import java.math.BigInteger;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Literal;
-import org.openrdf.model.impl.IntegerLiteralImpl;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -37,6 +38,8 @@
  */
 @DefaultAnnotation(NonNull.class)
 public final class CountFunction implements AggregationFunction {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     @Override
     public void update(final AggregationElement aggregation, final AggregationState state, final VisibilityBindingSet childBindingSet) {
         checkArgument(aggregation.getAggregationType() == AggregationType.COUNT, "The CountFunction only accepts COUNT AggregationElements.");
@@ -52,12 +55,12 @@
 
             if(newBinding) {
                 // Initialize the binding.
-                result.addBinding(resultName, new IntegerLiteralImpl(BigInteger.ONE));
+                result.addBinding(resultName, VF.createLiteral(BigInteger.ONE));
             } else {
                 // Update the existing binding.
                 final Literal count = (Literal) result.getValue(resultName);
                 final BigInteger updatedCount = count.integerValue().add( BigInteger.ONE );
-                result.addBinding(resultName, new IntegerLiteralImpl(updatedCount));
+                result.addBinding(resultName, VF.createLiteral(updatedCount));
             }
         }
     }
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MaxFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MaxFunction.java
index 5b5d493..3700076 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MaxFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MaxFunction.java
@@ -22,9 +22,9 @@
 import static java.util.Objects.requireNonNull;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.evaluation.util.ValueComparator;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.ValueComparator;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MinFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MinFunction.java
index f1b083c..9cd233c 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MinFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/MinFunction.java
@@ -22,9 +22,9 @@
 import static java.util.Objects.requireNonNull;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.evaluation.util.ValueComparator;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.ValueComparator;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/SumFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/SumFunction.java
index 7ddc9ae..e248ee4 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/SumFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/aggregation/SumFunction.java
@@ -24,14 +24,15 @@
 import java.math.BigInteger;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Value;
-import org.openrdf.model.datatypes.XMLDatatypeUtil;
-import org.openrdf.model.impl.IntegerLiteralImpl;
-import org.openrdf.query.algebra.MathExpr.MathOp;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.util.MathUtil;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.MathExpr.MathOp;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.MathUtil;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,6 +46,7 @@
 @DefaultAnnotation(NonNull.class)
 public final class SumFunction implements AggregationFunction {
     private static final Logger log = LoggerFactory.getLogger(SumFunction.class);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     public void update(final AggregationElement aggregation, final AggregationState state, final VisibilityBindingSet childBindingSet) {
@@ -62,7 +64,7 @@
             // Get the starting number for the sum.
             Literal sum;
             if(newBinding) {
-                sum = new IntegerLiteralImpl(BigInteger.ZERO);
+                sum = VF.createLiteral(BigInteger.ZERO);
             } else {
                 sum = (Literal) state.getBindingSet().getValue(resultName);
             }
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/filter/FilterEvaluator.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/filter/FilterEvaluator.java
index 3ec97cb..a70fc53 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/filter/FilterEvaluator.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/filter/FilterEvaluator.java
@@ -21,24 +21,24 @@
 import static java.util.Objects.requireNonNull;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.evaluation.TripleSource;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStrategyImpl;
-import org.openrdf.query.algebra.evaluation.util.QueryEvaluationUtil;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategy;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.QueryEvaluationUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * Processes a {@link Filter} node from a SPARQL query.
@@ -50,9 +50,9 @@
     /**
      * Is used to evaluate the conditions of a {@link Filter}.
      */
-    private static final EvaluationStrategyImpl EVALUATOR = new EvaluationStrategyImpl(
+    private static final StrictEvaluationStrategy EVALUATOR = new StrictEvaluationStrategy(
             new TripleSource() {
-                private final ValueFactory valueFactory = new ValueFactoryImpl();
+                private final ValueFactory valueFactory = SimpleValueFactory.getInstance();
 
                 @Override
                 public ValueFactory getValueFactory() {
@@ -62,12 +62,13 @@
                 @Override
                 public CloseableIteration<? extends Statement, QueryEvaluationException> getStatements(
                         final Resource arg0,
-                        final URI arg1,
+                        final IRI arg1,
                         final Value arg2,
                         final Resource... arg3) throws QueryEvaluationException {
                     throw new UnsupportedOperationException();
                 }
-            });
+            },
+            null);
 
     private final ValueExpr condition;
 
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LazyJoiningIterator.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LazyJoiningIterator.java
index b504a7e..e41a6e8 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LazyJoiningIterator.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LazyJoiningIterator.java
@@ -24,9 +24,9 @@
 
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.model.visibility.VisibilitySimplifier;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LeftOuterJoin.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LeftOuterJoin.java
index 79af26c..b4b9f7e 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LeftOuterJoin.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/join/LeftOuterJoin.java
@@ -26,7 +26,7 @@
 
 import org.apache.rya.api.function.join.LazyJoiningIterator.Side;
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/MultiProjectionEvaluator.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/MultiProjectionEvaluator.java
index 0e9093d..9a7eac5 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/MultiProjectionEvaluator.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/MultiProjectionEvaluator.java
@@ -27,15 +27,15 @@
 import java.util.Set;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.BNode;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.BNodeGenerator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.BNodeGenerator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -48,7 +48,7 @@
 @DefaultAnnotation(NonNull.class)
 public class MultiProjectionEvaluator {
 
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private final Set<ProjectionEvaluator> projections;
     private final Set<String> blankNodeSourceNames;
@@ -116,7 +116,7 @@
         // Generate an ID for each blank node that will appear in the results.
         final Map<String, BNode> blankNodes = new HashMap<>();
         for(final String blankNodeSourceName : blankNodeSourceNames) {
-            blankNodes.put(blankNodeSourceName, vf.createBNode(bNodeIdFactory.nextId()));
+            blankNodes.put(blankNodeSourceName, VF.createBNode(bNodeIdFactory.nextId()));
         }
 
         // Iterate through each of the projections and create the results from them.
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/ProjectionEvaluator.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/ProjectionEvaluator.java
index 4b37448..d4b3a2d 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/ProjectionEvaluator.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/projection/ProjectionEvaluator.java
@@ -28,20 +28,20 @@
 import java.util.UUID;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.BNode;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.BNodeGenerator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.BNodeGenerator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -63,7 +63,7 @@
 @DefaultAnnotation(NonNull.class)
 public class ProjectionEvaluator {
 
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * All off the projection elements that define what will appear in the resulting binding sets.
@@ -175,7 +175,7 @@
                 if(blankNodes.containsKey(sourceName)) {
                     value = blankNodes.get(sourceName);
                 } else {
-                    value = vf.createBNode( UUID.randomUUID().toString() );
+                    value = VF.createBNode( UUID.randomUUID().toString() );
                 }
             }
 
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/sp/StatementPatternMatcher.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/sp/StatementPatternMatcher.java
index 208f8d1..090482d 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/sp/StatementPatternMatcher.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/sp/StatementPatternMatcher.java
@@ -22,12 +22,12 @@
 
 import java.util.Optional;
 
-import org.openrdf.model.Statement;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalInstantRelationFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalInstantRelationFunction.java
index d622329..ae1b846 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalInstantRelationFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalInstantRelationFunction.java
@@ -21,10 +21,10 @@
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeParseException;
 
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalIntervalRelationFunction.java b/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalIntervalRelationFunction.java
index 4a0d4bd..889353d 100644
--- a/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalIntervalRelationFunction.java
+++ b/common/rya.api.function/src/main/java/org/apache/rya/api/function/temporal/TemporalIntervalRelationFunction.java
@@ -21,10 +21,10 @@
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeParseException;
 
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.function/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function b/common/rya.api.function/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
similarity index 100%
rename from common/rya.api.function/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function
rename to common/rya.api.function/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/IterativeJoinTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/IterativeJoinTest.java
index 5d357c3..91997a3 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/IterativeJoinTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/IterativeJoinTest.java
@@ -18,22 +18,25 @@
  */
 package org.apache.rya.api.function.join;
 
-import static org.junit.Assert.assertEquals;
-
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.apache.rya.api.function.join.IterativeJoin;
+import org.apache.rya.api.function.join.LeftOuterJoin;
+import org.apache.rya.api.function.join.NaturalJoin;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.junit.runners.Parameterized.Parameters;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
+
+import static org.junit.Assert.assertEquals;
 
 /**
  * Tests the methods of {@link IterativeJoin}.
@@ -59,7 +62,7 @@
     @Test
     public void naturalJoin_sideDoesNotMatter() {
         // Create the binding sets that will be joined.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final MapBindingSet bs1 = new MapBindingSet();
         bs1.addBinding("id", vf.createLiteral("some_uid"));
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/LeftOuterJoinTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/LeftOuterJoinTest.java
index 7d17e22..bcbaa11 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/LeftOuterJoinTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/LeftOuterJoinTest.java
@@ -21,17 +21,20 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.apache.rya.api.function.join.IterativeJoin;
+import org.apache.rya.api.function.join.LeftOuterJoin;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -41,7 +44,7 @@
  */
 public class LeftOuterJoinTest {
 
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void newLeftResult_noRightMatches() {
@@ -49,7 +52,7 @@
 
         // There is a new left result.
         final MapBindingSet mapLeftResult = new MapBindingSet();
-        mapLeftResult.addBinding("name", vf.createLiteral("Bob"));
+        mapLeftResult.addBinding("name", VF.createLiteral("Bob"));
         final VisibilityBindingSet newLeftResult = new VisibilityBindingSet(mapLeftResult);
 
         // There are no right results that join with the left result.
@@ -74,22 +77,22 @@
 
         // There is a new left result.
         final MapBindingSet mapLeftResult = new MapBindingSet();
-        mapLeftResult.addBinding("name", vf.createLiteral("Bob"));
-        mapLeftResult.addBinding("height", vf.createLiteral("5'9\""));
+        mapLeftResult.addBinding("name", VF.createLiteral("Bob"));
+        mapLeftResult.addBinding("height", VF.createLiteral("5'9\""));
         final VisibilityBindingSet newLeftResult = new VisibilityBindingSet(mapLeftResult);
 
         // There are a few right results that join with the left result.
         final MapBindingSet nameAge = new MapBindingSet();
-        nameAge.addBinding("name", vf.createLiteral("Bob"));
-        nameAge.addBinding("age", vf.createLiteral(56));
+        nameAge.addBinding("name", VF.createLiteral("Bob"));
+        nameAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
         final VisibilityBindingSet visiAge = new VisibilityBindingSet(nameAge);
 
         final MapBindingSet nameHair = new MapBindingSet();
-        nameHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHair.addBinding("hairColor", VF.createLiteral("Brown"));
         final VisibilityBindingSet visiHair = new VisibilityBindingSet(nameHair);
 
-        final Iterator<VisibilityBindingSet> rightResults = Lists.<VisibilityBindingSet>newArrayList(visiAge, visiHair).iterator();
+        final Iterator<VisibilityBindingSet> rightResults = Lists.newArrayList(visiAge, visiHair).iterator();
 
         // Therefore, there are a few new join results that mix the two together.
         final Iterator<VisibilityBindingSet> newJoinResultsIt = leftOuterJoin.newLeftResult(newLeftResult, rightResults);
@@ -99,17 +102,17 @@
             newJoinResults.add( newJoinResultsIt.next() );
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet();
+        final Set<BindingSet> expected = Sets.newHashSet();
         final MapBindingSet nameHeightAge = new MapBindingSet();
-        nameHeightAge.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightAge.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightAge.addBinding("age", vf.createLiteral(56));
+        nameHeightAge.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightAge.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
         expected.add(new VisibilityBindingSet(nameHeightAge));
 
         final MapBindingSet nameHeightHair = new MapBindingSet();
-        nameHeightHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightHair.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHeightHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightHair.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightHair.addBinding("hairColor", VF.createLiteral("Brown"));
         expected.add(new VisibilityBindingSet(nameHeightHair));
 
         assertEquals(expected, newJoinResults);
@@ -124,7 +127,7 @@
 
         // There is a new right result.
         final MapBindingSet newRightResult = new MapBindingSet();
-        newRightResult.addBinding("name", vf.createLiteral("Bob"));
+        newRightResult.addBinding("name", VF.createLiteral("Bob"));
 
         // Therefore, there are no new join results.
         final Iterator<VisibilityBindingSet> newJoinResultsIt = leftOuterJoin.newRightResult(leftResults, new VisibilityBindingSet(newRightResult));
@@ -137,21 +140,21 @@
 
         // There are a few left results that join with the new right result.
         final MapBindingSet nameAge = new MapBindingSet();
-        nameAge.addBinding("name", vf.createLiteral("Bob"));
-        nameAge.addBinding("age", vf.createLiteral(56));
+        nameAge.addBinding("name", VF.createLiteral("Bob"));
+        nameAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
 
         final MapBindingSet nameHair = new MapBindingSet();
-        nameHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHair.addBinding("hairColor", VF.createLiteral("Brown"));
 
-        final Iterator<VisibilityBindingSet> leftResults = Lists.<VisibilityBindingSet>newArrayList(
+        final Iterator<VisibilityBindingSet> leftResults = Lists.newArrayList(
                 new VisibilityBindingSet(nameAge),
                 new VisibilityBindingSet(nameHair)).iterator();
 
         // There is a new right result.
         final MapBindingSet newRightResult = new MapBindingSet();
-        newRightResult.addBinding("name", vf.createLiteral("Bob"));
-        newRightResult.addBinding("height", vf.createLiteral("5'9\""));
+        newRightResult.addBinding("name", VF.createLiteral("Bob"));
+        newRightResult.addBinding("height", VF.createLiteral("5'9\""));
 
         // Therefore, there are a few new join results that mix the two together.
         final Iterator<VisibilityBindingSet> newJoinResultsIt = leftOuterJoin.newRightResult(leftResults, new VisibilityBindingSet(newRightResult));
@@ -161,17 +164,17 @@
             newJoinResults.add( newJoinResultsIt.next() );
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet();
+        final Set<BindingSet> expected = Sets.newHashSet();
         final MapBindingSet nameHeightAge = new MapBindingSet();
-        nameHeightAge.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightAge.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightAge.addBinding("age", vf.createLiteral(56));
+        nameHeightAge.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightAge.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
         expected.add(new VisibilityBindingSet(nameHeightAge));
 
         final MapBindingSet nameHeightHair = new MapBindingSet();
-        nameHeightHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightHair.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHeightHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightHair.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightHair.addBinding("hairColor", VF.createLiteral("Brown"));
         expected.add(new VisibilityBindingSet(nameHeightHair));
 
         assertEquals(expected, newJoinResults);
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/NaturalJoinTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/NaturalJoinTest.java
index dd3b7e6..f6818ba 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/NaturalJoinTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/join/NaturalJoinTest.java
@@ -21,17 +21,20 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Set;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.apache.rya.api.function.join.IterativeJoin;
+import org.apache.rya.api.function.join.NaturalJoin;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -41,7 +44,7 @@
  */
 public class NaturalJoinTest {
 
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void newLeftResult_noRightMatches() {
@@ -49,7 +52,7 @@
 
         // There is a new left result.
         final MapBindingSet newLeftResult = new MapBindingSet();
-        newLeftResult.addBinding("name", vf.createLiteral("Bob"));
+        newLeftResult.addBinding("name", VF.createLiteral("Bob"));
 
         // There are no right results that join with the left result.
         final Iterator<VisibilityBindingSet> rightResults= new ArrayList<VisibilityBindingSet>().iterator();
@@ -65,19 +68,19 @@
 
         // There is a new left result.
         final MapBindingSet newLeftResult = new MapBindingSet();
-        newLeftResult.addBinding("name", vf.createLiteral("Bob"));
-        newLeftResult.addBinding("height", vf.createLiteral("5'9\""));
+        newLeftResult.addBinding("name", VF.createLiteral("Bob"));
+        newLeftResult.addBinding("height", VF.createLiteral("5'9\""));
 
         // There are a few right results that join with the left result.
         final MapBindingSet nameAge = new MapBindingSet();
-        nameAge.addBinding("name", vf.createLiteral("Bob"));
-        nameAge.addBinding("age", vf.createLiteral(56));
+        nameAge.addBinding("name", VF.createLiteral("Bob"));
+        nameAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
 
         final MapBindingSet nameHair = new MapBindingSet();
-        nameHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHair.addBinding("hairColor", VF.createLiteral("Brown"));
 
-        final Iterator<VisibilityBindingSet> rightResults = Lists.<VisibilityBindingSet>newArrayList(
+        final Iterator<VisibilityBindingSet> rightResults = Lists.newArrayList(
                 new VisibilityBindingSet(nameAge),
                 new VisibilityBindingSet(nameHair)).iterator();
 
@@ -89,17 +92,17 @@
             newJoinResults.add( newJoinResultsIt.next() );
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet();
+        final Set<BindingSet> expected = Sets.newHashSet();
         final MapBindingSet nameHeightAge = new MapBindingSet();
-        nameHeightAge.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightAge.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightAge.addBinding("age", vf.createLiteral(56));
+        nameHeightAge.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightAge.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
         expected.add(new VisibilityBindingSet(nameHeightAge));
 
         final MapBindingSet nameHeightHair = new MapBindingSet();
-        nameHeightHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightHair.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHeightHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightHair.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightHair.addBinding("hairColor", VF.createLiteral("Brown"));
         expected.add(new VisibilityBindingSet(nameHeightHair));
 
         assertEquals(expected, newJoinResults);
@@ -114,7 +117,7 @@
 
         // There is a new right result.
         final MapBindingSet newRightResult = new MapBindingSet();
-        newRightResult.addBinding("name", vf.createLiteral("Bob"));
+        newRightResult.addBinding("name", VF.createLiteral("Bob"));
 
         // Therefore, there are no new join results.
         final Iterator<VisibilityBindingSet> newJoinResultsIt = naturalJoin.newRightResult(leftResults, new VisibilityBindingSet(newRightResult));
@@ -127,21 +130,21 @@
 
         // There are a few left results that join with the new right result.
         final MapBindingSet nameAge = new MapBindingSet();
-        nameAge.addBinding("name", vf.createLiteral("Bob"));
-        nameAge.addBinding("age", vf.createLiteral(56));
+        nameAge.addBinding("name", VF.createLiteral("Bob"));
+        nameAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
 
         final MapBindingSet nameHair = new MapBindingSet();
-        nameHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHair.addBinding("hairColor", VF.createLiteral("Brown"));
 
-        final Iterator<VisibilityBindingSet> leftResults = Lists.<VisibilityBindingSet>newArrayList(
+        final Iterator<VisibilityBindingSet> leftResults = Lists.newArrayList(
                 new VisibilityBindingSet(nameAge),
                 new VisibilityBindingSet(nameHair)).iterator();
 
         // There is a new right result.
         final MapBindingSet newRightResult = new MapBindingSet();
-        newRightResult.addBinding("name", vf.createLiteral("Bob"));
-        newRightResult.addBinding("height", vf.createLiteral("5'9\""));
+        newRightResult.addBinding("name", VF.createLiteral("Bob"));
+        newRightResult.addBinding("height", VF.createLiteral("5'9\""));
 
         // Therefore, there are a few new join results that mix the two together.
         final Iterator<VisibilityBindingSet> newJoinResultsIt = naturalJoin.newRightResult(leftResults, new VisibilityBindingSet(newRightResult));
@@ -151,17 +154,17 @@
             newJoinResults.add( newJoinResultsIt.next() );
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet();
+        final Set<BindingSet> expected = Sets.newHashSet();
         final MapBindingSet nameHeightAge = new MapBindingSet();
-        nameHeightAge.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightAge.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightAge.addBinding("age", vf.createLiteral(56));
+        nameHeightAge.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightAge.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightAge.addBinding("age", VF.createLiteral(BigInteger.valueOf(56)));
         expected.add(new VisibilityBindingSet(nameHeightAge));
 
         final MapBindingSet nameHeightHair = new MapBindingSet();
-        nameHeightHair.addBinding("name", vf.createLiteral("Bob"));
-        nameHeightHair.addBinding("height", vf.createLiteral("5'9\""));
-        nameHeightHair.addBinding("hairColor", vf.createLiteral("Brown"));
+        nameHeightHair.addBinding("name", VF.createLiteral("Bob"));
+        nameHeightHair.addBinding("height", VF.createLiteral("5'9\""));
+        nameHeightHair.addBinding("hairColor", VF.createLiteral("Brown"));
         expected.add(new VisibilityBindingSet(nameHeightHair));
 
         assertEquals(expected, newJoinResults);
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/AfterTemporalFunctionsTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/AfterTemporalFunctionsTest.java
index f5f18f7..48bbefa 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/AfterTemporalFunctionsTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/AfterTemporalFunctionsTest.java
@@ -22,17 +22,17 @@
 
 import java.time.ZonedDateTime;
 
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 public class AfterTemporalFunctionsTest {
     private static final ZonedDateTime TIME = ZonedDateTime.parse("2015-12-30T12:00:00Z");
     private static final ZonedDateTime TIME_10 = ZonedDateTime.parse("2015-12-30T12:00:10Z");
     private static final ZonedDateTime TIME_20 = ZonedDateTime.parse("2015-12-30T12:00:20Z");
 
-    final ValueFactory VF = ValueFactoryImpl.getInstance();
+    final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testAfter_same() throws Exception {
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/BeforeTemporalFunctionsTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/BeforeTemporalFunctionsTest.java
index 1b15035..7fb5680 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/BeforeTemporalFunctionsTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/BeforeTemporalFunctionsTest.java
@@ -22,17 +22,17 @@
 
 import java.time.ZonedDateTime;
 
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 public class BeforeTemporalFunctionsTest {
     private static final ZonedDateTime TIME = ZonedDateTime.parse("2015-12-30T12:00:00Z");
     private static final ZonedDateTime TIME_10 = ZonedDateTime.parse("2015-12-30T12:00:10Z");
     private static final ZonedDateTime TIME_20 = ZonedDateTime.parse("2015-12-30T12:00:20Z");
 
-    final ValueFactory VF = ValueFactoryImpl.getInstance();
+    final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testBefore_same() throws Exception {
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/EqualsTemporalFunctionsTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/EqualsTemporalFunctionsTest.java
index 0d14d48..bffade6 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/EqualsTemporalFunctionsTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/EqualsTemporalFunctionsTest.java
@@ -22,17 +22,17 @@
 
 import java.time.ZonedDateTime;
 
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 public class EqualsTemporalFunctionsTest {
     private static final ZonedDateTime TIME = ZonedDateTime.parse("2015-12-30T12:00:00Z");
     private static final ZonedDateTime TIME_10 = ZonedDateTime.parse("2015-12-30T12:00:10Z");
     private static final ZonedDateTime TIME_20 = ZonedDateTime.parse("2015-12-30T12:00:20Z");
 
-    final ValueFactory VF = ValueFactoryImpl.getInstance();
+    final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testEquals_equal() throws Exception {
diff --git a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/WithinTemporalFunctionsTest.java b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/WithinTemporalFunctionsTest.java
index 6dee711..2761287 100644
--- a/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/WithinTemporalFunctionsTest.java
+++ b/common/rya.api.function/src/main/test/org/apache/rya/api/function/temporal/WithinTemporalFunctionsTest.java
@@ -22,18 +22,18 @@
 
 import java.time.ZonedDateTime;
 
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
 
 public class WithinTemporalFunctionsTest {
     private static final ZonedDateTime TIME = ZonedDateTime.parse("2015-12-30T12:00:00Z");
     private static final ZonedDateTime TIME_10 = ZonedDateTime.parse("2015-12-30T12:00:10Z");
     private static final ZonedDateTime TIME_20 = ZonedDateTime.parse("2015-12-30T12:00:20Z");
 
-    final ValueFactory VF = ValueFactoryImpl.getInstance();
+    final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test(expected = ValueExprEvaluationException.class)
     public void within_NotInterval() throws Exception {
diff --git a/common/rya.api.function/src/test/java/org/apache/rya/api/function/filter/FilterEvaluatorTest.java b/common/rya.api.function/src/test/java/org/apache/rya/api/function/filter/FilterEvaluatorTest.java
index 5e5cbe6..a47ae4d 100644
--- a/common/rya.api.function/src/test/java/org/apache/rya/api/function/filter/FilterEvaluatorTest.java
+++ b/common/rya.api.function/src/test/java/org/apache/rya/api/function/filter/FilterEvaluatorTest.java
@@ -24,16 +24,15 @@
 
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.apache.rya.api.function.filter.FilterEvaluator;
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.Nullable;
 
@@ -53,9 +52,9 @@
                 "}");
 
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("age", vf.createLiteral(9));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bs);
 
@@ -74,9 +73,9 @@
                 "}");
 
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("age", vf.createLiteral(11));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bs);
 
@@ -96,7 +95,7 @@
 
         final AtomicReference<Filter> filter = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final Filter node) throws Exception {
                 filter.set(node);
diff --git a/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/MultiProjectionEvaluatorTest.java b/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/MultiProjectionEvaluatorTest.java
index c02e87b..8f4094b 100644
--- a/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/MultiProjectionEvaluatorTest.java
+++ b/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/MultiProjectionEvaluatorTest.java
@@ -27,18 +27,18 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.BNode;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.Nullable;
 
@@ -62,7 +62,7 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
         bs.addBinding("location", vf.createLiteral("South St and 5th St"));
         bs.addBinding("direction", vf.createLiteral("NW"));
@@ -76,18 +76,18 @@
         bs = new MapBindingSet();
         bs.addBinding("subject", blankNode);
         bs.addBinding("predicate", RDF.TYPE);
-        bs.addBinding("object", vf.createURI("urn:movementObservation"));
+        bs.addBinding("object", vf.createIRI("urn:movementObservation"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         bs = new MapBindingSet();
         bs.addBinding("subject", blankNode);
-        bs.addBinding("predicate", vf.createURI("urn:location"));
+        bs.addBinding("predicate", vf.createIRI("urn:location"));
         bs.addBinding("object", vf.createLiteral("South St and 5th St"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         bs = new MapBindingSet();
         bs.addBinding("subject", blankNode);
-        bs.addBinding("predicate", vf.createURI("urn:direction"));
+        bs.addBinding("predicate", vf.createIRI("urn:direction"));
         bs.addBinding("object", vf.createLiteral("NW"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
@@ -116,12 +116,12 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
         bs.addBinding("vehicle", vf.createLiteral("Alice's car"));
-        bs.addBinding("owner", vf.createURI("urn:Alice"));
+        bs.addBinding("owner", vf.createIRI("urn:Alice"));
         bs.addBinding("plates", vf.createLiteral("XXXXXXX"));
-        bs.addBinding("pet", vf.createURI("urn:Kitty"));
+        bs.addBinding("pet", vf.createIRI("urn:Kitty"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // Run the projection evaluator.
@@ -132,9 +132,9 @@
         Value petBNode = null;
         for(final VisibilityBindingSet result : results) {
             final Value object = result.getValue("object");
-            if(object.equals(vf.createURI("urn:vehicle"))) {
+            if(object.equals(vf.createIRI("urn:vehicle"))) {
                 vehicalBNode = result.getValue("subject");
-            } else if(object.equals(vf.createURI("urn:pet"))) {
+            } else if(object.equals(vf.createIRI("urn:pet"))) {
                 petBNode = result.getValue("subject");
             }
         }
@@ -145,24 +145,24 @@
         bs = new MapBindingSet();
         bs.addBinding("subject", vehicalBNode);
         bs.addBinding("predicate", RDF.TYPE);
-        bs.addBinding("object", vf.createURI("urn:vehicle"));
+        bs.addBinding("object", vf.createIRI("urn:vehicle"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         bs = new MapBindingSet();
         bs.addBinding("subject", vehicalBNode);
-        bs.addBinding("predicate", vf.createURI("urn:tiresCount"));
+        bs.addBinding("predicate", vf.createIRI("urn:tiresCount"));
         bs.addBinding("object", vf.createLiteral("4", XMLSchema.INTEGER));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         bs = new MapBindingSet();
         bs.addBinding("subject", petBNode);
         bs.addBinding("predicate", RDF.TYPE);
-        bs.addBinding("object", vf.createURI("urn:pet"));
+        bs.addBinding("object", vf.createIRI("urn:pet"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         bs = new MapBindingSet();
         bs.addBinding("subject", petBNode);
-        bs.addBinding("predicate", vf.createURI("urn:isDead"));
+        bs.addBinding("predicate", vf.createIRI("urn:isDead"));
         bs.addBinding("object", vf.createLiteral(false));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
@@ -181,7 +181,7 @@
 
         final AtomicReference<MultiProjection> multiProjection = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final MultiProjection node) throws Exception {
                 multiProjection.set(node);
diff --git a/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/ProjectionEvaluatorTest.java b/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/ProjectionEvaluatorTest.java
index e4a26a0..c2e6367 100644
--- a/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/ProjectionEvaluatorTest.java
+++ b/common/rya.api.function/src/test/java/org/apache/rya/api/function/projection/ProjectionEvaluatorTest.java
@@ -24,14 +24,14 @@
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.Nullable;
 
@@ -55,11 +55,11 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // Execute the projection.
@@ -81,18 +81,18 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // The expected binding set changes the "person" binding name to "p" and "employee" to "e".
         bs = new MapBindingSet();
-        bs.addBinding("p", vf.createURI("urn:Alice"));
-        bs.addBinding("e", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        bs.addBinding("p", vf.createIRI("urn:Alice"));
+        bs.addBinding("e", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet expected = new VisibilityBindingSet(bs, "a|b");
 
         // Execute the projection.
@@ -114,16 +114,16 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // The expected binding set only has the "person" binding.
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         final VisibilityBindingSet expected = new VisibilityBindingSet(bs, "a|b");
 
         // Execute the projection.
@@ -145,18 +145,18 @@
                  "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("child", vf.createURI("urn:Bob"));
-        bs.addBinding("grandchild", vf.createURI("urn:Charlie"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("child", vf.createIRI("urn:Bob"));
+        bs.addBinding("grandchild", vf.createIRI("urn:Charlie"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // The expected binding set represents a statement.
         bs = new MapBindingSet();
-        bs.addBinding("subject", vf.createURI("urn:Alice"));
-        bs.addBinding("predicate", vf.createURI("urn:hasGrandchild"));
-        bs.addBinding("object", vf.createURI("urn:Charlie"));
+        bs.addBinding("subject", vf.createIRI("urn:Alice"));
+        bs.addBinding("predicate", vf.createIRI("urn:hasGrandchild"));
+        bs.addBinding("object", vf.createIRI("urn:Charlie"));
         final VisibilityBindingSet expected = new VisibilityBindingSet(bs, "a|b");
 
         // Execute the projection.
@@ -177,10 +177,10 @@
                  "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("hasGrandchild", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("hasGrandchild", vf.createIRI("urn:Bob"));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b");
 
         // Execute the projection.
@@ -189,8 +189,8 @@
         // The expected binding set represents a statement. We need to get the blank node's id from the
         // result since that is different every time.
         bs = new MapBindingSet();
-        bs.addBinding("subject", vf.createURI("urn:Alice"));
-        bs.addBinding("predicate", vf.createURI("urn:hasChild"));
+        bs.addBinding("subject", vf.createIRI("urn:Alice"));
+        bs.addBinding("predicate", vf.createIRI("urn:hasChild"));
         bs.addBinding("object", result.getValue("object"));
         final VisibilityBindingSet expected = new VisibilityBindingSet(bs, "a|b");
 
@@ -209,7 +209,7 @@
 
         final AtomicReference<Projection> projection = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final Projection node) throws Exception {
                 projection.set(node);
diff --git a/common/rya.api.function/src/test/java/org/apache/rya/api/function/sp/StatementPatternMatcherTest.java b/common/rya.api.function/src/test/java/org/apache/rya/api/function/sp/StatementPatternMatcherTest.java
index 78a5418..27d3a3a 100644
--- a/common/rya.api.function/src/test/java/org/apache/rya/api/function/sp/StatementPatternMatcherTest.java
+++ b/common/rya.api.function/src/test/java/org/apache/rya/api/function/sp/StatementPatternMatcherTest.java
@@ -25,16 +25,16 @@
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicReference;
 
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.Nullable;
 
@@ -52,13 +52,13 @@
                 "}"));
 
         // Create a statement that matches the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Create the expected resulting Binding Set.
         final QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("p", vf.createURI("urn:talksTo"));
-        expected.addBinding("o", vf.createURI("urn:Bob"));
+        expected.addBinding("p", vf.createIRI("urn:talksTo"));
+        expected.addBinding("o", vf.createIRI("urn:Bob"));
 
         // Show the expected Binding Set matches the resulting Binding Set.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -74,8 +74,8 @@
                 "}"));
 
         // Create a statement that does not match the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Show the statement did not match.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -91,13 +91,13 @@
                 "}"));
 
         // Create a statement that matches the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Create the expected resulting Binding Set.
         final QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("s", vf.createURI("urn:Alice"));
-        expected.addBinding("o", vf.createURI("urn:Bob"));
+        expected.addBinding("s", vf.createIRI("urn:Alice"));
+        expected.addBinding("o", vf.createIRI("urn:Bob"));
 
         // Show the expected Binding Set matches the resulting Binding Set.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -113,8 +113,8 @@
                 "}"));
 
         // Create a statement that does not match the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:knows"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:knows"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Show the statement did not match.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -130,13 +130,13 @@
                 "}"));
 
         // Create a statement that matches the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Create the expected resulting Binding Set.
         final QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("s", vf.createURI("urn:Alice"));
-        expected.addBinding("p", vf.createURI("urn:talksTo"));
+        expected.addBinding("s", vf.createIRI("urn:Alice"));
+        expected.addBinding("p", vf.createIRI("urn:talksTo"));
 
         // Show the expected Binding Set matches the resulting Binding Set.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -152,8 +152,8 @@
                 "}"));
 
         // Create a statement that does not match the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:knows"), vf.createURI("urn:Alice"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:knows"), vf.createIRI("urn:Alice"), vf.createIRI("urn:testGraph"));
 
         // Show the statement did not match.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -171,14 +171,14 @@
                 "}"));
 
         // Create a statement that matches the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Create the expected resulting Binding Set.
         final QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("s", vf.createURI("urn:Alice"));
-        expected.addBinding("p", vf.createURI("urn:talksTo"));
-        expected.addBinding("o", vf.createURI("urn:Bob"));
+        expected.addBinding("s", vf.createIRI("urn:Alice"));
+        expected.addBinding("p", vf.createIRI("urn:talksTo"));
+        expected.addBinding("o", vf.createIRI("urn:Bob"));
 
         // Show the expected Binding Set matches the resulting Binding Set.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -196,8 +196,8 @@
                 "}"));
 
         // Create a statement that does not match the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:wrong"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:wrong"));
 
         // Show the statement did not match.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -215,15 +215,15 @@
                 "}"));
 
         // Create a statement that matches the pattern.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"), vf.createURI("urn:testGraph"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"), vf.createIRI("urn:testGraph"));
 
         // Create the expected resulting Binding Set.
         final QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("s", vf.createURI("urn:Alice"));
-        expected.addBinding("p", vf.createURI("urn:talksTo"));
-        expected.addBinding("o", vf.createURI("urn:Bob"));
-        expected.addBinding("c", vf.createURI("urn:testGraph"));
+        expected.addBinding("s", vf.createIRI("urn:Alice"));
+        expected.addBinding("p", vf.createIRI("urn:talksTo"));
+        expected.addBinding("o", vf.createIRI("urn:Bob"));
+        expected.addBinding("c", vf.createIRI("urn:testGraph"));
 
         // Show the expected Binding Set matches the resulting Binding Set.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -241,8 +241,8 @@
                 "}"));
 
         // Create a statement that does not have a context value.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Statement statement = vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Statement statement = vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"));
 
         // Show the statement did not match.
         final Optional<BindingSet> bs = matcher.match(statement);
@@ -261,7 +261,7 @@
 
         final AtomicReference<StatementPattern> statementPattern = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visitChildren(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visitChildren(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final StatementPattern node) throws Exception {
                 statementPattern.set(node);
diff --git a/common/rya.api.model/pom.xml b/common/rya.api.model/pom.xml
index 6af6801..b03c389 100644
--- a/common/rya.api.model/pom.xml
+++ b/common/rya.api.model/pom.xml
@@ -32,12 +32,12 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-model</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-model</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-query</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-query</artifactId>
         </dependency>
         <dependency>
             <groupId>com.google.guava</groupId>
diff --git a/common/rya.api.model/src/main/java/org/apache/rya/api/model/BindingSetDecorator.java b/common/rya.api.model/src/main/java/org/apache/rya/api/model/BindingSetDecorator.java
index e4126fd..cc2d0aa 100644
--- a/common/rya.api.model/src/main/java/org/apache/rya/api/model/BindingSetDecorator.java
+++ b/common/rya.api.model/src/main/java/org/apache/rya/api/model/BindingSetDecorator.java
@@ -23,9 +23,9 @@
 import java.util.Iterator;
 import java.util.Set;
 
-import org.openrdf.model.Value;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Abstracts out the decoration of a {@link BindingSet}.
diff --git a/common/rya.api.model/src/main/java/org/apache/rya/api/model/StatementDecorator.java b/common/rya.api.model/src/main/java/org/apache/rya/api/model/StatementDecorator.java
index ed4b511..e261253 100644
--- a/common/rya.api.model/src/main/java/org/apache/rya/api/model/StatementDecorator.java
+++ b/common/rya.api.model/src/main/java/org/apache/rya/api/model/StatementDecorator.java
@@ -22,10 +22,10 @@
 
 import java.util.Objects;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -61,7 +61,7 @@
     }
 
     @Override
-    public URI getPredicate() {
+    public IRI getPredicate() {
         return statement.getPredicate();
     }
 
diff --git a/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityBindingSet.java b/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityBindingSet.java
index b741539..a80af3c 100644
--- a/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityBindingSet.java
+++ b/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityBindingSet.java
@@ -22,7 +22,7 @@
 
 import java.util.Objects;
 
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityStatement.java b/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityStatement.java
index ffe95d7..6008fb3 100644
--- a/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityStatement.java
+++ b/common/rya.api.model/src/main/java/org/apache/rya/api/model/VisibilityStatement.java
@@ -22,7 +22,7 @@
 
 import java.util.Objects;
 
-import org.openrdf.model.Statement;
+import org.eclipse.rdf4j.model.Statement;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api.model/src/test/java/org/apache/rya/api/model/VisibilityBindingSetTest.java b/common/rya.api.model/src/test/java/org/apache/rya/api/model/VisibilityBindingSetTest.java
index 04f0c17..516027f 100644
--- a/common/rya.api.model/src/test/java/org/apache/rya/api/model/VisibilityBindingSetTest.java
+++ b/common/rya.api.model/src/test/java/org/apache/rya/api/model/VisibilityBindingSetTest.java
@@ -20,10 +20,10 @@
 
 import static org.junit.Assert.assertNotEquals;
 
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit tests the methods of {@link VisibilityBindingSet}.
@@ -33,7 +33,7 @@
     @Test
     public void hashcode() {
         // Create a BindingSet, decorate it, and grab its hash code.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bSet = new MapBindingSet();
         bSet.addBinding("name", vf.createLiteral("alice"));
 
diff --git a/common/rya.api/pom.xml b/common/rya.api/pom.xml
index 2529f2f..70bc691 100644
--- a/common/rya.api/pom.xml
+++ b/common/rya.api/pom.xml
@@ -41,32 +41,32 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-model</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-model</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-query</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-query</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-model</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-model</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-evaluation</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-evaluation</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-turtle</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-turtle</artifactId>
         </dependency>
         
         <dependency>
@@ -108,6 +108,11 @@
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-sail-base</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfiguration.java b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfiguration.java
index a837b4e..c5d3e5f 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfiguration.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfiguration.java
@@ -1,7 +1,3 @@
-package org.apache.rya.api;
-
-import java.util.HashSet;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,9 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.api;
 
-
-
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -31,7 +27,7 @@
 import org.apache.rya.api.layout.TableLayoutStrategy;
 import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
 import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -369,7 +365,7 @@
 
     /**
      * Sets whether rdfs:domain and rdfs:range inferencing is enabled or disabled.
-     * @param value {@code true} if rdfs:domain/range inferencing is enabled.
+     * @param val {@code true} if rdfs:domain/range inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferDomainRange(final Boolean val) {
@@ -388,7 +384,7 @@
 
     /**
      * Sets whether owl:hasSelf inferencing is enabled or disabled.
-     * @param value {@code true} if owl:hasSelf inferencing is enabled.
+     * @param val {@code true} if owl:hasSelf inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferHasSelf(final Boolean val) {
@@ -445,7 +441,7 @@
 
     /**
      * Sets whether owl:inverseOf inferencing is enabled or disabled.
-     * @param value {@code true} if owl:inverseOf inferencing is enabled.
+     * @param val {@code true} if owl:inverseOf inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferInverseOf(final Boolean val) {
@@ -559,7 +555,7 @@
 
     /**
      * Sets whether rdfs:subClassOf inferencing is enabled or disabled.
-     * @param value {@code true} if rdfs:subClassOf inferencing is enabled.
+     * @param val {@code true} if rdfs:subClassOf inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferSubClassOf(final Boolean val) {
@@ -578,7 +574,7 @@
 
     /**
      * Sets whether rdfs:subPropertyOf inferencing is enabled or disabled.
-     * @param value {@code true} if rdfs:subPropertyOf inferencing is enabled.
+     * @param val {@code true} if rdfs:subPropertyOf inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferSubPropertyOf(final Boolean val) {
@@ -597,7 +593,7 @@
 
     /**
      * Sets whether owl:SymmetricProperty inferencing is enabled or disabled.
-     * @param value {@code true} if owl:SymmetricProperty inferencing is enabled.
+     * @param val {@code true} if owl:SymmetricProperty inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferSymmetricProperty(final Boolean val) {
@@ -616,7 +612,7 @@
 
     /**
      * Sets whether owl:TransitiveProperty inferencing is enabled or disabled.
-     * @param value {@code true} if owl:TransitiveProperty inferencing is enabled.
+     * @param val {@code true} if owl:TransitiveProperty inferencing is enabled.
      * {@code false} otherwise.
      */
     public void setInferTransitiveProperty(final Boolean val) {
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfigurationBuilder.java b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfigurationBuilder.java
index a39464c..519cfe5 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfigurationBuilder.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConfigurationBuilder.java
@@ -88,8 +88,8 @@
      *            - visibilities assigned to any triples inserted into Rya
      * @return B - concrete builder class for chaining method invocations
      */
-    public B setVisibilities(String visibilites) {
-        this.visibilities = visibilites;
+    public B setVisibilities(String visibilities) {
+        this.visibilities = visibilities;
         return confBuilder();
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConstants.java b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConstants.java
index dd7ada0..a0ac20d 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConstants.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreConstants.java
@@ -24,19 +24,19 @@
 import org.apache.rya.api.domain.RyaSchema;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 public class RdfCloudTripleStoreConstants {
 
     public static final String NAMESPACE = RyaSchema.NAMESPACE;
     public static final String AUTH_NAMESPACE = RyaSchema.AUTH_NAMESPACE;
-    public static ValueFactory VALUE_FACTORY = ValueFactoryImpl.getInstance();
-    public static URI RANGE = VALUE_FACTORY.createURI(NAMESPACE, "range");
-    public static URI PARTITION_TIMERANGE = VALUE_FACTORY.createURI("urn:org.apache.mmrts.partition.rdf/08/2011#", "timeRange");
+    public static ValueFactory VALUE_FACTORY = SimpleValueFactory.getInstance();
+    public static IRI RANGE = VALUE_FACTORY.createIRI(NAMESPACE, "range");
+    public static IRI PARTITION_TIMERANGE = VALUE_FACTORY.createIRI("urn:org.apache.mmrts.partition.rdf/08/2011#", "timeRange");
     public static Literal EMPTY_LITERAL = VALUE_FACTORY.createLiteral(0);
     public static final byte EMPTY_BYTES[] = new byte[0];
     public static final Text EMPTY_TEXT = new Text();
@@ -135,14 +135,14 @@
     //	public static final Authorizations ALL_AUTHORIZATIONS = new Authorizations(
     //	"_");
 
-    public static enum TABLE_LAYOUT {
+    public enum TABLE_LAYOUT {
         SPO, PO, OSP
     }
 
     //TODO: This should be in a version file somewhere
-    public static URI RTS_SUBJECT = VALUE_FACTORY.createURI(NAMESPACE, "rts");
+    public static IRI RTS_SUBJECT = VALUE_FACTORY.createIRI(NAMESPACE, "rts");
     public static RyaURI RTS_SUBJECT_RYA = new RyaURI(RTS_SUBJECT.stringValue());
-    public static URI RTS_VERSION_PREDICATE = VALUE_FACTORY.createURI(NAMESPACE, "version");
+    public static IRI RTS_VERSION_PREDICATE = VALUE_FACTORY.createIRI(NAMESPACE, "version");
     public static RyaURI RTS_VERSION_PREDICATE_RYA = new RyaURI(RTS_VERSION_PREDICATE.stringValue());
     public static final Value VERSION = VALUE_FACTORY.createLiteral("3.0.0");
     public static RyaType VERSION_RYA = new RyaType(VERSION.stringValue());
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreStatement.java b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreStatement.java
index 00ecb22..662d168 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreStatement.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreStatement.java
@@ -19,27 +19,29 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-
 import java.util.ArrayList;
 import java.util.Collection;
 
-public class RdfCloudTripleStoreStatement extends StatementImpl {
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleStatement;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+
+public class RdfCloudTripleStoreStatement extends SimpleStatement {
+    private static final long serialVersionUID = 1L;
+
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private Resource[] contexts; //TODO: no blank nodes
 
-    public RdfCloudTripleStoreStatement(Resource subject, URI predicate, Value object) {
+    public RdfCloudTripleStoreStatement(Resource subject, IRI predicate, Value object) {
         super(subject, predicate, object);
     }
 
-    public RdfCloudTripleStoreStatement(Resource subject, URI predicate, Value object,
+    public RdfCloudTripleStoreStatement(Resource subject, IRI predicate, Value object,
                                         Resource... contexts) {
         super(subject, predicate, object);
         this.contexts = contexts;
@@ -54,7 +56,7 @@
 
         if (getContexts() != null && getContexts().length > 1) {
             for (Resource contxt : getContexts()) {
-                statements.add(new ContextStatementImpl(getSubject(),
+                statements.add(VF.createStatement(getSubject(),
                         getPredicate(), getObject(), contxt));
             }
         } else
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreUtils.java
index 0a366d7..acb0b91 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreUtils.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/RdfCloudTripleStoreUtils.java
@@ -19,28 +19,22 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.layout.TableLayoutStrategy;
-import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.BNodeImpl;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-
 import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.layout.TableLayoutStrategy;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 public class RdfCloudTripleStoreUtils {
 
-    public static ValueFactory valueFactory = new ValueFactoryImpl();
+    public static final ValueFactory VF = SimpleValueFactory.getInstance();
     public static final Pattern literalPattern = Pattern.compile("^\"(.*?)\"((\\^\\^<(.+?)>)$|(@(.{2}))$)");
 
 //    public static byte[] writeValue(Value value) throws IOException {
@@ -93,7 +87,7 @@
 ////        Value ret = null;
 ////        if (valueTypeMarker == RdfCloudTripleStoreConstants.URI_MARKER) {
 ////            String uriString = readString(dataIn);
-////            ret = vf.createURI(uriString);
+////            ret = vf.createIRI(uriString);
 ////        } else if (valueTypeMarker == RdfCloudTripleStoreConstants.BNODE_MARKER) {
 ////            String bnodeID = readString(dataIn);
 ////            ret = vf.createBNode(bnodeID);
@@ -246,9 +240,7 @@
             CustomEntry that = (CustomEntry) o;
 
             if (key != null ? !key.equals(that.key) : that.key != null) return false;
-            if (value != null ? !value.equals(that.value) : that.value != null) return false;
-
-            return true;
+            return value != null ? value.equals(that.value) : that.value == null;
         }
 
         @Override
@@ -266,17 +258,17 @@
      * @param value
      * @return
      */
-    public static URI convertToUri(String namespace, String value) {
+    public static IRI convertToUri(String namespace, String value) {
         if (value == null)
             return null;
-        URI subjUri;
+        IRI subjUri;
         try {
-            subjUri = valueFactory.createURI(value);
+            subjUri = VF.createIRI(value);
         } catch (Exception e) {
             //not uri
             if (namespace == null)
                 return null;
-            subjUri = valueFactory.createURI(namespace, value);
+            subjUri = VF.createIRI(namespace, value);
         }
         return subjUri;
     }
@@ -293,7 +285,7 @@
             }
 
             String dataType = s.substring(dt_i_start, dt_i_end);
-            return valueFactory.createLiteral(val, valueFactory.createURI(dataType));
+            return VF.createLiteral(val, VF.createIRI(dataType));
         }
         return null;
     }
@@ -305,7 +297,7 @@
     public static boolean isUri(String uri) {
         if (uri == null) return false;
         try {
-            valueFactory.createURI(uri);
+            VF.createIRI(uri);
         } catch (Exception e) {
             return false;
         }
@@ -381,12 +373,12 @@
     //helper methods to createValue
     public static Value createValue(String resource) {
         if (isBNode(resource))
-            return new BNodeImpl(resource.substring(2));
+            return VF.createBNode(resource.substring(2));
         Literal literal;
         if ((literal = makeLiteral(resource)) != null)
             return literal;
         if (resource.contains(":") || resource.contains("/") || resource.contains("#")) {
-            return new URIImpl(resource);
+            return VF.createIRI(resource);
         } else {
             throw new RuntimeException((new StringBuilder()).append(resource).append(" is not a valid URI, blank node, or literal value").toString());
         }
@@ -408,11 +400,11 @@
         Matcher matcher = literalPattern.matcher(resource);
         if (matcher.matches())
             if (null != matcher.group(4))
-                return new LiteralImpl(matcher.group(1), new URIImpl(matcher.group(4)));
+                return VF.createLiteral(matcher.group(1), VF.createIRI(matcher.group(4)));
             else
-                return new LiteralImpl(matcher.group(1), matcher.group(6));
+                return VF.createLiteral(matcher.group(1), matcher.group(6));
         if (resource.startsWith("\"") && resource.endsWith("\"") && resource.length() > 1)
-            return new LiteralImpl(resource.substring(1, resource.length() - 1));
+            return VF.createLiteral(resource.substring(1, resource.length() - 1));
         else
             return null;
     }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java b/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
index 082beb1..212399a 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/ExecuteSparqlQuery.java
@@ -20,8 +20,8 @@
 
 import java.io.Closeable;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.TupleQueryResult;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatements.java b/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatements.java
index 2fdb77b..9cac606 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatements.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatements.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -18,7 +18,7 @@
  */
 package org.apache.rya.api.client;
 
-import org.openrdf.model.Statement;
+import org.eclipse.rdf4j.model.Statement;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatementsFile.java b/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatementsFile.java
index 0fd987a..85cebb8 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatementsFile.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/client/LoadStatementsFile.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -20,7 +20,7 @@
 
 import java.nio.file.Path;
 
-import org.openrdf.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFFormat;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/date/DateTimeTtlValueConverter.java b/common/rya.api/src/main/java/org/apache/rya/api/date/DateTimeTtlValueConverter.java
index 5b086d2..62ee8c0 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/date/DateTimeTtlValueConverter.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/date/DateTimeTtlValueConverter.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Value;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
 
 import javax.xml.datatype.DatatypeConfigurationException;
 import javax.xml.datatype.DatatypeFactory;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class DateTimeTtlValueConverter
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlStrValueConverter.java b/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlStrValueConverter.java
index 97e4804..a52e0b4 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlStrValueConverter.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlStrValueConverter.java
@@ -19,9 +19,7 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class TimestampTtlValueConverter
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlValueConverter.java b/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlValueConverter.java
index d2db8b1..4ce6932 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlValueConverter.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/date/TimestampTtlValueConverter.java
@@ -19,9 +19,7 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class TimestampTtlValueConverter
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/date/TtlValueConverter.java b/common/rya.api/src/main/java/org/apache/rya/api/date/TtlValueConverter.java
index b850002..98ea208 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/date/TtlValueConverter.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/date/TtlValueConverter.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * Class TtlValueConverter
@@ -31,7 +29,7 @@
  */
 public interface TtlValueConverter {
 
-    ValueFactory vf = ValueFactoryImpl.getInstance();
+    ValueFactory vf = SimpleValueFactory.getInstance();
 
     public void convert(String ttl, String startTime);
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/Node.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/Node.java
index a5c1a02..a1e1468 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/Node.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/Node.java
@@ -21,14 +21,14 @@
 
 
 
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.impl.SimpleIRI;
 
 /**
  * A Node is an expected node in the global graph. This typing of the URI allows us to dictate the difference between a
  * URI that is just an Attribute on the subject vs. a URI that is another subject Node in the global graph. It does not
  * guarantee that the subject exists, just that there is an Edge to it.
  */
-public class Node extends URIImpl {
+public class Node extends SimpleIRI {
     public Node() {
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeURI.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeURI.java
index 0623e51..d47ab5a 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeURI.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeURI.java
@@ -21,8 +21,7 @@
 
 
 
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Created by IntelliJ IDEA.
@@ -30,14 +29,14 @@
  * Time: 1:03 PM
  * To change this template use File | Settings | File Templates.
  */
-public class RangeURI extends RangeValue<URI> implements URI {
+public class RangeURI extends RangeValue<IRI> implements IRI {
 
-    public RangeURI(URI start, URI end) {
+    public RangeURI(IRI start, IRI end) {
         super(start, end);
     }
 
     public RangeURI(RangeValue rangeValue) {
-        super((URI) rangeValue.getStart(), (URI) rangeValue.getEnd());
+        super((IRI) rangeValue.getStart(), (IRI) rangeValue.getEnd());
     }
 
     @Override
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeValue.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeValue.java
index 7d9ed24..b92f8b6 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeValue.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RangeValue.java
@@ -19,9 +19,7 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaSchema.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaSchema.java
index adbad38..e181597 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaSchema.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaSchema.java
@@ -22,7 +22,7 @@
 
 
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Date: 7/16/12
@@ -35,9 +35,9 @@
     public static final String BNODE_NAMESPACE = "urn:org.apache.rya/bnode/2012/07#";
 
     //datatypes
-    public static final URI NODE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createURI(NAMESPACE, "node");
-    public static final URI LANGUAGE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createURI(NAMESPACE, "lang");
+    public static final IRI NODE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createIRI(NAMESPACE, "node");
+    public static final IRI LANGUAGE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createIRI(NAMESPACE, "lang");
 
     //functions
-    public static final URI RANGE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createURI(NAMESPACE, "range");
+    public static final IRI RANGE = RdfCloudTripleStoreConstants.VALUE_FACTORY.createIRI(NAMESPACE, "range");
 }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaType.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaType.java
index ab5306e..8de4667 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaType.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaType.java
@@ -18,8 +18,9 @@
  */
 package org.apache.rya.api.domain;
 
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.apache.commons.lang.builder.EqualsBuilder;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Base Rya Type
@@ -28,7 +29,7 @@
  */
 public class RyaType implements Comparable {
 
-    private URI dataType;
+    private IRI dataType;
     private String data;
 
     public RyaType() {
@@ -40,17 +41,17 @@
     }
 
 
-    public RyaType(final URI dataType, final String data) {
+    public RyaType(final IRI dataType, final String data) {
         setDataType(dataType);
         setData(data);
     }
 
     /**
-     * TODO: Can we get away without using the openrdf URI
+     * TODO: Can we get away without using the RDF4J IRI
      *
      * @return
      */
-    public URI getDataType() {
+    public IRI getDataType() {
         return dataType;
     }
 
@@ -58,7 +59,7 @@
         return data;
     }
 
-    public void setDataType(final URI dataType) {
+    public void setDataType(final IRI dataType) {
         this.dataType = dataType;
     }
 
@@ -89,14 +90,11 @@
         if (o == null || !(o instanceof RyaType)) {
             return false;
         }
-        final RyaType ryaType = (RyaType) o;
-        if (data != null ? !data.equals(ryaType.data) : ryaType.data != null) {
-            return false;
-        }
-        if (dataType != null ? !dataType.equals(ryaType.dataType) : ryaType.dataType != null) {
-            return false;
-        }
-        return true;
+        final RyaType other = (RyaType) o;
+        final EqualsBuilder builder = new EqualsBuilder()
+                .append(getData(), other.getData())
+                .append(getDataType(), other.getDataType());
+        return builder.isEquals();
     }
 
     /**
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypePrefix.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypePrefix.java
index dab53a6..d08bc5b 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypePrefix.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypePrefix.java
@@ -21,7 +21,7 @@
 
 
 
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.DELIM;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.LAST;
@@ -32,7 +32,7 @@
  */
 public class RyaTypePrefix extends RyaTypeRange {
 
-    public RyaTypePrefix(URI datatype, String prefix) {
+    public RyaTypePrefix(IRI datatype, String prefix) {
         super();
         setPrefix(datatype, prefix);
     }
@@ -47,7 +47,7 @@
         setStop(new RyaType(prefix + LAST));
     }
 
-    public void setPrefix(URI datatype, String prefix) {
+    public void setPrefix(IRI datatype, String prefix) {
         setStart(new RyaType(datatype, prefix + DELIM));
         setStop(new RyaType(datatype, prefix + LAST));
     }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeRange.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeRange.java
index badde87..38d57f5 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeRange.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeRange.java
@@ -21,7 +21,7 @@
 
 
 
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Date: 7/17/12
@@ -56,7 +56,7 @@
     }
 
     @Override
-    public URI getDataType() {
+    public IRI getDataType() {
         return start.getDataType();
     }
 
@@ -84,9 +84,7 @@
         RyaTypeRange that = (RyaTypeRange) o;
 
         if (start != null ? !start.equals(that.start) : that.start != null) return false;
-        if (stop != null ? !stop.equals(that.stop) : that.stop != null) return false;
-
-        return true;
+        return stop != null ? stop.equals(that.stop) : that.stop == null;
     }
 
     @Override
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeUtils.java
index 6f9902e..e7032e3 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeUtils.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaTypeUtils.java
@@ -20,12 +20,12 @@
 
 import java.util.Date;
 
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.impl.SimpleIRI;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.format.ISODateTimeFormat;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -45,8 +45,8 @@
             .put(Long.class, (v) -> longRyaType((Long) v))
             .put(Short.class, (v) -> shortRyaType((Short) v))
             .put(String.class, (v) -> stringRyaType((String) v))
-            .put(URI.class, (v) -> uriRyaType((URI) v))
-            .put(URIImpl.class, (v) -> uriRyaType((URIImpl) v))
+            .put(IRI.class, (v) -> uriRyaType((IRI) v))
+            .put(SimpleIRI.class, (v) -> uriRyaType((SimpleIRI) v))
             .build();
 
     /**
@@ -182,11 +182,11 @@
     /**
      *
      * Creates a URI {@link RyaType} object.
-     * @param value the {@link URI} object.
+     * @param value the {@link IRI} object.
      * @return the {@link RyaType} with the data type set to
      * {@link XMLSchema#ANYURI} and the data set to the specified {@code value}.
      */
-    public static RyaType uriRyaType(final URI value) {
+    public static RyaType uriRyaType(final IRI value) {
         return new RyaType(XMLSchema.ANYURI, value.stringValue());
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaURI.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaURI.java
index d90ba4b..1e948ae 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaURI.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/RyaURI.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.URI;
-import org.openrdf.model.util.URIUtil;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.util.URIUtil;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 
 /**
@@ -44,7 +42,7 @@
         super(XMLSchema.ANYURI, namespace + data);
     }
 
-    protected RyaURI(URI datatype, String data) {
+    protected RyaURI(IRI datatype, String data) {
         super(datatype, data);
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/StatementMetadata.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/StatementMetadata.java
index 83612b7..23fe2d3 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/StatementMetadata.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/StatementMetadata.java
@@ -24,7 +24,7 @@
 import java.util.Map;
 
 import org.apache.rya.api.persist.RdfDAOException;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.base.Preconditions;
 import com.google.common.reflect.TypeToken;
@@ -42,7 +42,7 @@
 public class StatementMetadata {
 
     private static Gson gson = new GsonBuilder().enableComplexMapKeySerialization()
-    .registerTypeHierarchyAdapter(RyaType.class, new RyaTypeAdapter()).create();;
+    .registerTypeHierarchyAdapter(RyaType.class, new RyaTypeAdapter()).create();
     public static StatementMetadata EMPTY_METADATA = new StatementMetadata();
 
     private Map<RyaURI, RyaType> metadataMap = new HashMap<>();
@@ -127,7 +127,7 @@
             if(type.equals(RyaURI.class.getName())){
                 return new RyaURI(array[0]);
             } else if(type.equals(RyaType.class.getName())){
-                RyaType ryaType = new RyaType(new URIImpl(array[1]), array[0]);
+                RyaType ryaType = new RyaType(SimpleValueFactory.getInstance().createIRI(array[1]), array[0]);
                 return ryaType;
             } else {
                 throw new IllegalArgumentException("Unparseable RyaType.");
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/VarNameUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/VarNameUtils.java
new file mode 100644
index 0000000..6f47e35
--- /dev/null
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/VarNameUtils.java
@@ -0,0 +1,202 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.rya.api.domain;
+
+import org.apache.commons.lang.StringUtils;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.TupleExprs;
+
+/**
+ * Utility methods and constants for RDF {@link Var} names.
+ */
+public final class VarNameUtils {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
+    /**
+     * Prepended to the start of constant var names.
+     */
+    public static final String CONSTANT_PREFIX = "_const_";
+    private static final String LEGACY_CONSTANT_PREFIX = "-const-";
+
+    /**
+     * Prepended to the start of anonymous var names.
+     */
+    public static final String ANONYMOUS_PREFIX = "_anon_";
+    private static final String LEGACY_ANONYMOUS_PREFIX = "-anon-";
+
+    /**
+     * Private constructor to prevent instantiation.
+     */
+    private VarNameUtils() {
+    }
+
+    /**
+     * Prepends the constant prefix to the specified value.
+     * @param value the value to add the constant prefix to.
+     * @return the value with the constant prefix attached before it.
+     */
+    public static String prependConstant(final String value) {
+        if (value != null) {
+            return CONSTANT_PREFIX + value;
+        }
+        return null;
+    }
+
+    /**
+     * Checks if the var name has the constant prefix.
+     * @param name the var name to check.
+     * @return {@code true} if the name begins with the constant prefix.
+     * {@code false} otherwise.
+     */
+    public static boolean isConstant(final String name) {
+        if (name != null) {
+            return name.startsWith(CONSTANT_PREFIX) || name.startsWith(LEGACY_CONSTANT_PREFIX);
+        }
+        return false;
+    }
+
+    /**
+     * Removes the constant prefix from a string if it exists.
+     * @param name the name string to strip the constant prefix from.
+     * @return the string with the constant prefix removed. Otherwise returns
+     * the original string.
+     */
+    public static String removeConstant(final String name) {
+        if (isConstant(name)) {
+            String removed = StringUtils.removeStart(name, CONSTANT_PREFIX);
+            if (name.equals(removed)) {
+                removed = StringUtils.removeStart(name, LEGACY_CONSTANT_PREFIX);
+            }
+            return removed;
+        }
+        return name;
+    }
+
+    /**
+     * Prepends the anonymous prefix to the specified value.
+     * @param value the value to add the anonymous prefix to.
+     * @return the value with the anonymous prefix attached before it.
+     */
+    public static String prependAnonymous(final String value) {
+        if (value != null) {
+            return ANONYMOUS_PREFIX + value;
+        }
+        return null;
+    }
+
+    /**
+     * Checks if the var name has the anonymous prefix.
+     * @param name the var name to check.
+     * @return {@code true} if the name begins with the anonymous prefix.
+     * {@code false} otherwise.
+     */
+    public static boolean isAnonymous(final String name) {
+        if (name != null) {
+            return name.startsWith(ANONYMOUS_PREFIX) || name.startsWith(LEGACY_ANONYMOUS_PREFIX);
+        }
+        return false;
+    }
+
+    /**
+     * Removes the anonymous prefix from a string if it exists.
+     * @param name the name string to strip the anonymous prefix from.
+     * @return the string with the anonymous prefix removed. Otherwise returns
+     * the original string.
+     */
+    public static String removeAnonymous(final String name) {
+        if (isAnonymous(name)) {
+            String removed = StringUtils.removeStart(name, ANONYMOUS_PREFIX);
+            if (name.equals(removed)) {
+                removed = StringUtils.removeStart(name, LEGACY_ANONYMOUS_PREFIX);
+            }
+        }
+        return name;
+    }
+
+    /**
+     * Creates a unique constant name for the {@link Var} with the supplied
+     * {@link Value}.
+     * @param value the {@link  Value}.
+     * @return the unique constant name for the {@link Var}.
+     */
+    public static String createUniqueConstVarName(final Value value) {
+        return TupleExprs.getConstVarName(value);
+    }
+
+    /**
+     * Creates a unique constant name for the {@link Var} with the supplied
+     * label.
+     * @param label the label for the {@code Literal}.
+     * @return the unique constant name for the {@link Var}.
+     */
+    public static String createUniqueConstVarNameLiteral(final String label) {
+        return createUniqueConstVarName(VF.createLiteral(label));
+    }
+
+    /**
+     * Creates a unique constant name for the {@link Var} with the supplied
+     * IRI string.
+     * @param iri the string-representation of the {@IRI}
+     * @return the unique constant name for the {@link Var}.
+     */
+    public static String createUniqueConstVarNameIri(final String iri) {
+        return createUniqueConstVarName(VF.createIRI(iri));
+    }
+
+    /**
+     * Creates a simple constant name for a {@link Var} to replace the unique
+     * hex string constant name. The simple constant name will be one of:
+     * <ul>
+     *   <li>The var's original string value with "_const_" prepended to it if
+     *       it's a constant (i.e. the constant var name was already likely
+     *       derived from {@link TupleExprs#createConstVar(Value)})</li>
+     *   <li>The original var name if it's not a constant or if it has no
+     *       value to generate a simple constant name from</li>
+     *   <li>{@code null} if {@code var} is {@code null}</li>
+     * </ul>
+     * @param var the {@link Var}.
+     * @return the simple constant var name.
+     */
+    public static String createSimpleConstVarName(final Var var) {
+        String varName = null;
+        if (var != null) {
+            if (var.getValue() != null && isConstant(var.getName())) {
+                // Replaces the unique constant hex string name with a simple
+                // readable constant name
+                varName = prependConstant(var.getValue().stringValue());
+            } else {
+                varName = var.getName();
+            }
+        }
+        return varName;
+    }
+
+    /**
+     * Creates a uniquely named constant {@link Var} with the supplied
+     * {@link Value}.
+     * @param value the {@link  Value}.
+     * @return the uniquely named constant {@link Var}.
+     */
+    public static Var createUniqueConstVar(final Value value) {
+        return new Var(TupleExprs.getConstVarName(value), value);
+    }
+}
\ No newline at end of file
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/domain/serialization/kryo/RyaStatementSerializer.java b/common/rya.api/src/main/java/org/apache/rya/api/domain/serialization/kryo/RyaStatementSerializer.java
index 6c0efd2..69a09bb 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/domain/serialization/kryo/RyaStatementSerializer.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/domain/serialization/kryo/RyaStatementSerializer.java
@@ -17,26 +17,27 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
+
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaURI;
-
 /**
  * Kryo Serializer for {@link RyaStatement}s
  *
  */
 public class RyaStatementSerializer extends Serializer<RyaStatement> {
-    
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     /**
      * Uses Kryo to write RyaStatement to {@lin Output}
      * @param kryo - writes statement to output
@@ -117,7 +118,7 @@
             value = new RyaURI(objectValue);
         }
         else {
-            value = new RyaType(new URIImpl(objectType), objectValue);
+            value = new RyaType(VF.createIRI(objectType), objectValue);
         }
         RyaStatement statement = new RyaStatement(new RyaURI(subject), new RyaURI(predicate), value);
         int length = 0;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/functions/DateTimeWithinPeriod.java b/common/rya.api/src/main/java/org/apache/rya/api/functions/DateTimeWithinPeriod.java
index aedeea7..655425d 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/functions/DateTimeWithinPeriod.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/functions/DateTimeWithinPeriod.java
@@ -17,21 +17,21 @@
  * under the License.
  */package org.apache.rya.api.functions;
 
-import static com.google.common.base.Preconditions.checkArgument;
-import static com.google.common.base.Preconditions.checkNotNull;
-
 import java.time.Duration;
 import java.time.Instant;
 
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.datatypes.XMLDatatypeUtil;
-import org.openrdf.model.vocabulary.FN;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
+import org.eclipse.rdf4j.model.vocabulary.FN;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * This {@link Function} determines whether two {@link XMLSchema#DATETIME}s occur within a specified period of time of
@@ -83,11 +83,11 @@
             checkArgument(values[0] instanceof Literal);
             checkArgument(values[1] instanceof Literal);
             checkArgument(values[2] instanceof Literal);
-            checkArgument(values[3] instanceof URI);
+            checkArgument(values[3] instanceof IRI);
 
             Instant dateTime1 = convertToInstant((Literal) values[0]);
             Instant dateTime2 = convertToInstant((Literal) values[1]);
-            long periodMillis = convertPeriodToMillis((Literal) values[2], (URI) values[3]);
+            long periodMillis = convertPeriodToMillis((Literal) values[2], (IRI) values[3]);
             long timeBetween = Math.abs(Duration.between(dateTime1, dateTime2).toMillis());
 
             return valueFactory.createLiteral(timeBetween < periodMillis);
@@ -98,16 +98,16 @@
 
     private Instant convertToInstant(Literal literal) {
         String stringVal = literal.getLabel();
-        URI dataType = literal.getDatatype();
+        IRI dataType = literal.getDatatype();
         checkArgument(dataType.equals(XMLSchema.DATETIME) || dataType.equals(XMLSchema.DATE),
                 String.format("Invalid data type for date time. Data Type must be of type %s or %s .", XMLSchema.DATETIME, XMLSchema.DATE));
         checkArgument(XMLDatatypeUtil.isValidDateTime(stringVal) || XMLDatatypeUtil.isValidDate(stringVal), "Invalid date time value.");
         return literal.calendarValue().toGregorianCalendar().toInstant();
     }
 
-    private long convertPeriodToMillis(Literal literal, URI unit) {
+    private long convertPeriodToMillis(Literal literal, IRI unit) {
         String stringVal = literal.getLabel();
-        URI dataType = literal.getDatatype();
+        IRI dataType = literal.getDatatype();
         checkArgument(dataType.equals(XMLSchema.INTEGER) || dataType.equals(XMLSchema.INT), String
                 .format("Invalid data type for period duration. Data Type must be of type %s or %s .", XMLSchema.INTEGER, XMLSchema.INT));
         checkArgument(XMLDatatypeUtil.isValidInteger(stringVal) || XMLDatatypeUtil.isValidInt(stringVal), "Invalid duration value.");
@@ -122,7 +122,7 @@
      *            indicated by the namespace <http://www.w3.org/2006/time#>)
      * @return - duration in milliseconds
      */
-    private long convertToMillis(int duration, URI unit) {
+    private long convertToMillis(int duration, IRI unit) {
         checkArgument(duration > 0);
         return OWLTime.getMillis(duration, unit);
     }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/functions/OWLTime.java b/common/rya.api/src/main/java/org/apache/rya/api/functions/OWLTime.java
index 5ffc4ee..48649d1 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/functions/OWLTime.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/functions/OWLTime.java
@@ -26,9 +26,9 @@
 import java.util.Map;
 import java.util.Optional;
 
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * Constants for OWL-Time primitives in the OWL-Time namespace.
@@ -36,7 +36,7 @@
  */
 public class OWLTime {
 
-    private static final ValueFactory FACTORY = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * Indicates namespace of OWL-Time ontology
@@ -45,25 +45,25 @@
     /**
      * Seconds class of type DurationDescription in OWL-Time ontology
      */
-    public static final URI SECONDS_URI = FACTORY.createURI(NAMESPACE, "seconds");
+    public static final IRI SECONDS_URI = VF.createIRI(NAMESPACE, "seconds");
     /**
      * Minutes class of type DurationDescription in OWL-Time ontology
      */
-    public static final URI MINUTES_URI = FACTORY.createURI(NAMESPACE, "minutes");
+    public static final IRI MINUTES_URI = VF.createIRI(NAMESPACE, "minutes");
     /**
      * Hours class of type DurationDescription in OWL-Time ontology
      */
-    public static final URI HOURS_URI = FACTORY.createURI(NAMESPACE, "hours");
+    public static final IRI HOURS_URI = VF.createIRI(NAMESPACE, "hours");
     /**
      * Days class of type DurationDescription in OWL-Time ontology
      */
-    public static final URI DAYS_URI = FACTORY.createURI(NAMESPACE, "days");
+    public static final IRI DAYS_URI = VF.createIRI(NAMESPACE, "days");
     /**
      * Weeks class of type DurationDescription in OWL-Time ontology
      */
-    public static final URI WEEKS_URI = FACTORY.createURI(NAMESPACE, "weeks");
+    public static final IRI WEEKS_URI = VF.createIRI(NAMESPACE, "weeks");
 
-    private static final Map<URI, ChronoUnit> DURATION_MAP = new HashMap<>();
+    private static final Map<IRI, ChronoUnit> DURATION_MAP = new HashMap<>();
 
     static {
         DURATION_MAP.put(SECONDS_URI, ChronoUnit.SECONDS);
@@ -78,7 +78,7 @@
      * @param durationURI - OWLTime URI indicating the time unit (not null)
      * @return - {@code true} if this URI indicates a supported OWLTime time unit
      */
-    public static boolean isValidDurationType(URI durationURI) {
+    public static boolean isValidDurationType(IRI durationURI) {
         checkNotNull(durationURI);
         return DURATION_MAP.containsKey(durationURI);
     }
@@ -89,9 +89,9 @@
      * @param duration - amount of time in the units indicated by the provided {@link OWLTime} URI
      * @param uri - OWLTime URI indicating the time unit of duration (not null)
      * @return - the amount of time in milliseconds
-     * @throws IllegalArgumentException if provided {@link URI} is not a valid, supported OWL-Time time unit.
+     * @throws IllegalArgumentException if provided {@link IRI} is not a valid, supported OWL-Time time unit.
      */
-    public static long getMillis(int duration, URI uri) throws IllegalArgumentException {
+    public static long getMillis(int duration, IRI uri) throws IllegalArgumentException {
         Optional<ChronoUnit> unit = getChronoUnitFromURI(uri);
         checkArgument(unit.isPresent(),
                 String.format("URI %s does not indicate a valid OWLTime time unit.  URI must of be of type %s, %s, %s, %s, or %s .", uri,
@@ -105,7 +105,7 @@
      * @param durationURI - OWLTime time unit URI (not null)
      * @return - corresponding ChronoUnit time unit
      */
-    public static Optional<ChronoUnit> getChronoUnitFromURI(URI durationURI) {
+    public static Optional<ChronoUnit> getChronoUnitFromURI(IRI durationURI) {
         return Optional.ofNullable(DURATION_MAP.get(durationURI));
     }
 }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java b/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
index 8f46977..ae47b3f 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/path/PathUtils.java
@@ -202,7 +202,7 @@
                     final UserPrincipal owner = Files.getOwner(partialPath);
                     if (!user.equals(owner) && !root.equals(owner)) {
                         // dir owned by someone else, not secure
-                        return false;
+                        return SystemUtils.IS_OS_UNIX ? false : Files.isWritable(partialPath);
                     }
                 }
             } catch (final IOException x) {
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/RdfEvalStatsDAO.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/RdfEvalStatsDAO.java
index 0b63d58..b91a137 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/RdfEvalStatsDAO.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/RdfEvalStatsDAO.java
@@ -19,13 +19,11 @@
  * under the License.
  */
 
-
-
 import java.util.List;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class RdfEvalStatsDAO
@@ -45,7 +43,7 @@
 
     // XXX returns -1 if no cardinality could be found.
     public double getCardinality(C conf, CARDINALITY_OF card, List<Value> val) throws RdfDAOException;
-	public double getCardinality(C conf, CARDINALITY_OF card, List<Value> val, Resource context) throws RdfDAOException;
+    public double getCardinality(C conf, CARDINALITY_OF card, List<Value> val, Resource context) throws RdfDAOException;
 
     public void setConf(C conf);
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/RyaNamespaceManager.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/RyaNamespaceManager.java
index 8415edd..83d90a5 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/RyaNamespaceManager.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/RyaNamespaceManager.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.Namespace;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Namespace;
 
 /**
  * Date: 7/17/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/index/RyaSecondaryIndexer.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/index/RyaSecondaryIndexer.java
index ef21f1f..1bdc95b 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/index/RyaSecondaryIndexer.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/index/RyaSecondaryIndexer.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import java.io.Closeable;
 import java.io.Flushable;
 import java.io.IOException;
@@ -27,23 +26,22 @@
 import java.util.Set;
 
 import org.apache.hadoop.conf.Configurable;
-import org.openrdf.model.URI;
-
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaURI;
+import org.eclipse.rdf4j.model.IRI;
 
 public interface RyaSecondaryIndexer extends Closeable, Flushable, Configurable {
 	/**
 	 * initialize after setting configuration.
 	 */
-    public void init();    
+	public void init();
     /**
      * Returns the table name if the implementation supports it.
      * Note that some indexers use multiple tables, this only returns one.
      * TODO recommend that we deprecate this method because it's a leaky interface. 
      * @return table name as a string.
      */
-    public String getTableName(); 
+    public String getTableName();
 
     public void storeStatements(Collection<RyaStatement> statements) throws IOException;
 
@@ -56,11 +54,11 @@
     /**
      * @return the set of predicates indexed by the indexer.
      */
-    public abstract Set<URI> getIndexablePredicates();
+    public Set<IRI> getIndexablePredicates();
 
     @Override
-    public abstract void flush() throws IOException;
+    public void flush() throws IOException;
 
     @Override
-    public abstract void close() throws IOException;
+    public void close() throws IOException;
 }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/joinselect/SelectivityEvalDAO.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/joinselect/SelectivityEvalDAO.java
index af2a5d8..5ebe7fb 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/joinselect/SelectivityEvalDAO.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/joinselect/SelectivityEvalDAO.java
@@ -19,12 +19,10 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public interface SelectivityEvalDAO<C extends RdfCloudTripleStoreConfiguration> extends RdfEvalStatsDAO<C> {
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/BatchRyaQuery.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/BatchRyaQuery.java
index 2cef5a1..5630289 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/BatchRyaQuery.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/BatchRyaQuery.java
@@ -23,7 +23,6 @@
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
 
 /**
@@ -92,9 +91,7 @@
 
         BatchRyaQuery that = (BatchRyaQuery) o;
 
-        if (queries != null ? !queries.equals(that.queries) : that.queries != null) return false;
-
-        return true;
+        return queries != null ? queries.equals(that.queries) : that.queries == null;
     }
 
     @Override
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryEngine.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryEngine.java
index 5404804..1e027ec 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryEngine.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryEngine.java
@@ -19,10 +19,6 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.io.Closeable;
 import java.util.Collection;
 import java.util.Map;
@@ -31,9 +27,9 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaConfigured;
 import org.apache.rya.api.persist.RyaDAOException;
-
 import org.calrissian.mango.collect.CloseableIterable;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Rya Query Engine to perform queries against the Rya triple store.
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryOptions.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryOptions.java
index 01a2b0d..5ddc19d 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryOptions.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/RyaQueryOptions.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
+import java.util.Arrays;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.Arrays;
-
 /**
  */
 public class RyaQueryOptions {
@@ -225,9 +223,7 @@
         if (regexPredicate != null ? !regexPredicate.equals(that.regexPredicate) : that.regexPredicate != null)
             return false;
         if (regexSubject != null ? !regexSubject.equals(that.regexSubject) : that.regexSubject != null) return false;
-        if (ttl != null ? !ttl.equals(that.ttl) : that.ttl != null) return false;
-
-        return true;
+        return ttl != null ? ttl.equals(that.ttl) : that.ttl == null;
     }
 
     @Override
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/HashJoin.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/HashJoin.java
index 353d1ee..65c01a7 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/HashJoin.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/HashJoin.java
@@ -19,9 +19,10 @@
  * under the License.
  */
 
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaStatement;
@@ -31,10 +32,7 @@
 import org.apache.rya.api.persist.query.RyaQueryEngine;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.utils.EnumerationWrapper;
-
-import java.util.Enumeration;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Use HashTable to do a HashJoin.
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/IterativeJoin.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/IterativeJoin.java
index 965251b..9bf216c 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/IterativeJoin.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/IterativeJoin.java
@@ -19,23 +19,24 @@
  * under the License.
  */
 
-
-
-import com.google.common.base.Preconditions;
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.ConvertingIteration;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreUtils;
-import org.apache.rya.api.domain.*;
-import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.api.persist.query.RyaQueryEngine;
-import org.apache.rya.api.resolver.RyaContext;
-import org.openrdf.query.BindingSet;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Map;
 
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreUtils;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.persist.RyaDAOException;
+import org.apache.rya.api.persist.query.RyaQueryEngine;
+import org.apache.rya.api.resolver.RyaContext;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.ConvertingIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+
+import com.google.common.base.Preconditions;
+
 /**
  * Date: 7/24/12
  * Time: 8:52 AM
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/Join.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/Join.java
index f0d9f57..3334cd8 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/Join.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/Join.java
@@ -19,16 +19,14 @@
  * under the License.
  */
 
+import java.util.Map;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
-
-import java.util.Map;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Date: 7/24/12
@@ -36,9 +34,9 @@
  */
 public interface Join<C extends RdfCloudTripleStoreConfiguration> {
 
-    CloseableIteration<RyaStatement, RyaDAOException> join(C conf, RyaURI... preds)
+    public CloseableIteration<RyaStatement, RyaDAOException> join(C conf, RyaURI... preds)
             throws RyaDAOException;
 
-    CloseableIteration<RyaURI, RyaDAOException> join(C conf, Map.Entry<RyaURI, RyaType>... predObjs)
+    public CloseableIteration<RyaURI, RyaDAOException> join(C conf, Map.Entry<RyaURI, RyaType>... predObjs)
                     throws RyaDAOException;
 }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/MergeJoin.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/MergeJoin.java
index 767f61f..c858327 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/MergeJoin.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/query/join/MergeJoin.java
@@ -19,21 +19,24 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
 
-
-import com.google.common.base.Preconditions;
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.EmptyIteration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.domain.*;
+import org.apache.rya.api.domain.RyaRange;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.RyaURIRange;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.query.RyaQueryEngine;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.utils.PeekingCloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.EmptyIteration;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
+import com.google.common.base.Preconditions;
 
 /**
  * Date: 7/24/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDAOHelper.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDAOHelper.java
index 06fe88b..5b5978a 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDAOHelper.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDAOHelper.java
@@ -19,9 +19,11 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Map;
+import java.util.NoSuchElementException;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaStatement;
@@ -30,17 +32,13 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.api.utils.NullableStatementImpl;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Map;
-import java.util.NoSuchElementException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 /**
  * Date: 7/20/12
@@ -48,7 +46,7 @@
  */
 public class RyaDAOHelper {
 
-    public static CloseableIteration<Statement, QueryEvaluationException> query(RyaDAO ryaDAO, Resource subject, URI predicate, Value object, RdfCloudTripleStoreConfiguration conf, Resource... contexts) throws QueryEvaluationException {
+    public static CloseableIteration<Statement, QueryEvaluationException> query(RyaDAO ryaDAO, Resource subject, IRI predicate, Value object, RdfCloudTripleStoreConfiguration conf, Resource... contexts) throws QueryEvaluationException {
         return query(ryaDAO, new NullableStatementImpl(subject, predicate, object, contexts), conf);
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDaoQueryWrapper.java b/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDaoQueryWrapper.java
index af7af8a..2122f53 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDaoQueryWrapper.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/persist/utils/RyaDaoQueryWrapper.java
@@ -24,14 +24,13 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAO;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.rio.RDFHandler;
-
-import info.aduna.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.rio.RDFHandler;
 
 /**
  * Wraps Rya DAO queries into a simpler interface that just passes in the
@@ -66,14 +65,14 @@
     /**
      * Handles all results of a query. Closes the query iterator when done.
      * @param subject the subject {@link Resource} to query for.
-     * @param predicate the predicate {@link URI} to query for.
+     * @param predicate the predicate {@link IRI} to query for.
      * @param object the object {@link Value} to query for.
      * @param rdfStatementHandler the {@link RDFHandler} to use for handling
      * each statement returned. (not {@code null})
      * @param contexts the context {@link Resource}s to query for.
      * @throws QueryEvaluationException
      */
-    public void queryAll(final Resource subject, final URI predicate, final Value object, final RDFHandler rdfStatementHandler, final Resource... contexts) throws QueryEvaluationException {
+    public void queryAll(final Resource subject, final IRI predicate, final Value object, final RDFHandler rdfStatementHandler, final Resource... contexts) throws QueryEvaluationException {
         checkNotNull(rdfStatementHandler);
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDao, subject, predicate, object, conf, contexts);
         try {
@@ -101,7 +100,7 @@
      */
     public void queryAll(final Statement statement, final RDFHandler rdfStatementHandler) throws QueryEvaluationException {
         final Resource subject = statement.getSubject();
-        final URI predicate = statement.getPredicate();
+        final IRI predicate = statement.getPredicate();
         final Value object = statement.getObject();
         final Resource context = statement.getContext();
         queryAll(subject, predicate, object, rdfStatementHandler, context);
@@ -125,14 +124,14 @@
      * Handles only the first result of a query. Closes the query iterator when
      * done.
      * @param subject the subject {@link Resource} to query for.
-     * @param predicate the predicate {@link URI} to query for.
+     * @param predicate the predicate {@link IRI} to query for.
      * @param object the object {@link Value} to query for.
      * @param rdfStatementHandler the {@link RDFHandler} to use for handling the
      * first statement returned. (not {@code null})
      * @param contexts the context {@link Resource}s to query for.
      * @throws QueryEvaluationException
      */
-    public void queryFirst(final Resource subject, final URI predicate, final Value object, final RDFHandler rdfStatementHandler, final Resource... contexts) throws QueryEvaluationException {
+    public void queryFirst(final Resource subject, final IRI predicate, final Value object, final RDFHandler rdfStatementHandler, final Resource... contexts) throws QueryEvaluationException {
         checkNotNull(rdfStatementHandler);
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDao, subject, predicate, object, conf, contexts);
         try {
@@ -162,7 +161,7 @@
     public void queryFirst(final Statement statement, final RDFHandler rdfStatementHandler) throws QueryEvaluationException {
         checkNotNull(statement);
         final Resource subject = statement.getSubject();
-        final URI predicate = statement.getPredicate();
+        final IRI predicate = statement.getPredicate();
         final Value object = statement.getObject();
         final Resource context = statement.getContext();
         queryFirst(subject, predicate, object, rdfStatementHandler, context);
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/TriplePatternStrategy.java b/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/TriplePatternStrategy.java
index 7d61312..15a3a88 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/TriplePatternStrategy.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/TriplePatternStrategy.java
@@ -19,17 +19,14 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.resolver.triple.TripleRowRegex;
-
 import java.io.IOException;
 import java.util.Map;
 
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.resolver.triple.TripleRowRegex;
 
 /**
  * Date: 7/14/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategy.java b/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategy.java
index 314ce91..5398fc0 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategy.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategy.java
@@ -19,10 +19,12 @@
  * under the License.
  */
 
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.LAST_BYTES;
+
 import java.io.IOException;
 import java.util.Map;
+
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.*;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaType;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/CustomRyaTypeResolverMapping.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/CustomRyaTypeResolverMapping.java
index 44f77bd..b6d2758 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/CustomRyaTypeResolverMapping.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/CustomRyaTypeResolverMapping.java
@@ -21,7 +21,7 @@
 
 
 
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Date: 7/16/12
@@ -29,24 +29,24 @@
  */
 public class CustomRyaTypeResolverMapping extends RyaTypeResolverMapping {
 
-    protected URI ryaDataType;
+    protected IRI ryaDataType;
     protected byte markerByte;
 
     public CustomRyaTypeResolverMapping() {
     }
 
-    public CustomRyaTypeResolverMapping(URI ryaDataType, byte markerByte) {
+    public CustomRyaTypeResolverMapping(IRI ryaDataType, byte markerByte) {
         this(null, ryaDataType, markerByte);
     }
 
-    public CustomRyaTypeResolverMapping(RyaTypeResolver ryaTypeResolver, URI ryaDataType, byte markerByte) {
+    public CustomRyaTypeResolverMapping(RyaTypeResolver ryaTypeResolver, IRI ryaDataType, byte markerByte) {
         super(ryaTypeResolver);
         this.ryaDataType = ryaDataType;
         this.markerByte = markerByte;
     }
 
     @Override
-    public URI getRyaDataType() {
+    public IRI getRyaDataType() {
         return ryaDataType;
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RdfToRyaConversions.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RdfToRyaConversions.java
index 61c2b4d..6cd27b7 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RdfToRyaConversions.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RdfToRyaConversions.java
@@ -19,10 +19,20 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.domain.*;
-import org.openrdf.model.*;
+import org.apache.rya.api.domain.RangeURI;
+import org.apache.rya.api.domain.RangeValue;
+import org.apache.rya.api.domain.RyaSchema;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaTypeRange;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.RyaURIRange;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Date: 7/17/12
@@ -30,7 +40,7 @@
  */
 public class RdfToRyaConversions {
 
-    public static RyaURI convertURI(URI uri) {
+    public static RyaURI convertURI(IRI uri) {
         if (uri == null) return null;
         if (uri instanceof RangeURI) {
             RangeURI ruri = (RangeURI) uri;
@@ -59,8 +69,8 @@
         }
         if (value instanceof RangeValue) {
             RangeValue rv = (RangeValue) value;
-            if (rv.getStart() instanceof URI) {
-                return new RyaURIRange(convertURI((URI) rv.getStart()), convertURI((URI) rv.getEnd()));
+            if (rv.getStart() instanceof IRI) {
+                return new RyaURIRange(convertURI((IRI) rv.getStart()), convertURI((IRI) rv.getEnd()));
             } else {
                 //literal
                 return new RyaTypeRange(convertLiteral((Literal) rv.getStart()), convertLiteral((Literal) rv.getEnd()));
@@ -74,13 +84,13 @@
         if (subject instanceof BNode) {
             return new RyaURI(RyaSchema.BNODE_NAMESPACE + ((BNode) subject).getID());
         }
-        return convertURI((URI) subject);
+        return convertURI((IRI) subject);
     }
 
     public static RyaStatement convertStatement(Statement statement) {
         if (statement == null) return null;
         Resource subject = statement.getSubject();
-        URI predicate = statement.getPredicate();
+        IRI predicate = statement.getPredicate();
         Value object = statement.getObject();
         Resource context = statement.getContext();
         return new RyaStatement(
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaContext.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaContext.java
index 49fc5d1..237a228 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaContext.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaContext.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -39,8 +37,8 @@
 import org.apache.rya.api.resolver.impl.RyaURIResolver;
 import org.apache.rya.api.resolver.impl.ServiceBackedRyaTypeResolverMappings;
 import org.apache.rya.api.resolver.impl.ShortRyaTypeResolver;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,7 +50,7 @@
 
     public Logger logger = LoggerFactory.getLogger(RyaContext.class);
 
-    private final Map<URI, RyaTypeResolver> uriToResolver = new HashMap<URI, RyaTypeResolver>();
+    private final Map<IRI, RyaTypeResolver> uriToResolver = new HashMap<IRI, RyaTypeResolver>();
     private final Map<Byte, RyaTypeResolver> byteToResolver = new HashMap<Byte, RyaTypeResolver>();
     private RyaTypeResolver defaultResolver = new CustomDatatypeResolver();
 
@@ -93,7 +91,7 @@
 
 
     //need to go from datatype->resolver
-    public RyaTypeResolver retrieveResolver(final URI datatype) {
+    public RyaTypeResolver retrieveResolver(final IRI datatype) {
         final RyaTypeResolver ryaTypeResolver = uriToResolver.get(datatype);
         if (ryaTypeResolver == null) {
             return defaultResolver;
@@ -152,7 +150,7 @@
         }
     }
 
-    public RyaTypeResolver removeRyaTypeResolver(final URI dataType) {
+    public RyaTypeResolver removeRyaTypeResolver(final IRI dataType) {
         final RyaTypeResolver ryaTypeResolver = uriToResolver.remove(dataType);
         if (ryaTypeResolver != null) {
             if (logger.isDebugEnabled()) {
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaToRdfConversions.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaToRdfConversions.java
index 51062c9..102db46 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaToRdfConversions.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaToRdfConversions.java
@@ -19,40 +19,37 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/17/12
  * Time: 8:34 AM
  */
 public class RyaToRdfConversions {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    public static URI convertURI(RyaURI uri) {
-        return new URIImpl(uri.getData());
+    public static IRI convertURI(RyaURI uri) {
+        return VF.createIRI(uri.getData());
     }
     
-    private static URI convertURI(RyaType value) {
-        return new URIImpl(value.getData());
+    private static IRI convertURI(RyaType value) {
+        return VF.createIRI(value.getData());
     }
 
     public static Literal convertLiteral(RyaType literal) {
         if (XMLSchema.STRING.equals(literal.getDataType())) {
-            return new LiteralImpl(literal.getData());
+            return VF.createLiteral(literal.getData());
         } else {
-            return new LiteralImpl(literal.getData(), literal.getDataType());
+            return VF.createLiteral(literal.getData(), literal.getDataType());
         }
         //TODO: No Language support yet
     }
@@ -65,12 +62,12 @@
     public static Statement convertStatement(RyaStatement statement) {
         assert statement != null;
         if (statement.getContext() != null) {
-            return new ContextStatementImpl(convertURI(statement.getSubject()),
+            return VF.createStatement(convertURI(statement.getSubject()),
                     convertURI(statement.getPredicate()),
                     convertValue(statement.getObject()),
                     convertURI(statement.getContext()));
         } else {
-            return new StatementImpl(convertURI(statement.getSubject()),
+            return VF.createStatement(convertURI(statement.getSubject()),
                     convertURI(statement.getPredicate()),
                     convertValue(statement.getObject()));
         }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTripleContext.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTripleContext.java
index 17fab47..f3f5925 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTripleContext.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTripleContext.java
@@ -19,15 +19,12 @@
  * under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolver.java
index 98e2f82..4e061ea 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolver.java
@@ -23,8 +23,7 @@
 
 import org.apache.rya.api.domain.RyaRange;
 import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaTypeRange;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Date: 7/16/12
@@ -44,9 +43,9 @@
      */
     public boolean deserializable(byte[] bytes);
 
-    public URI getRyaDataType();
+    public IRI getRyaDataType();
 
-    byte getMarkerByte();
+    public byte getMarkerByte();
 
     /**
      * This will allow a resolver to modify a range. For example, a date time resolver, with a reverse index,
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolverMapping.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolverMapping.java
index 82502ff..ca2c81a 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolverMapping.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/RyaTypeResolverMapping.java
@@ -21,7 +21,7 @@
 
 
 
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Date: 7/16/12
@@ -46,7 +46,7 @@
         return ryaTypeResolver;
     }
 
-    public URI getRyaDataType() {
+    public IRI getRyaDataType() {
         return ryaTypeResolver.getRyaDataType();
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/BooleanRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/BooleanRyaTypeResolver.java
index 1727944..c45efe8 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/BooleanRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/BooleanRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 public class BooleanRyaTypeResolver extends RyaTypeResolverImpl {
     public static final int BOOLEAN_LITERAL_MARKER = 10;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ByteRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ByteRyaTypeResolver.java
index 5de72fc..0503e76 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ByteRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ByteRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 public class ByteRyaTypeResolver extends RyaTypeResolverImpl {
     public static final int LITERAL_MARKER = 9;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolver.java
index 3b4dcfa..075b3f8 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolver.java
@@ -25,7 +25,7 @@
 
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.primitives.Bytes;
 
@@ -64,7 +64,7 @@
             throw new RyaTypeResolverException("Not a datatype literal");
         }
         final String label = deserializeData(new String(bytes, 0, indexOfType, StandardCharsets.UTF_8));
-        rt.setDataType(new URIImpl(new String(bytes, indexOfType + 1, (length - indexOfType) - 3, StandardCharsets.UTF_8)));
+        rt.setDataType(SimpleValueFactory.getInstance().createIRI(new String(bytes, indexOfType + 1, (length - indexOfType) - 3, StandardCharsets.UTF_8)));
         rt.setData(label);
         return rt;
     }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolver.java
index c244b9e..8167401 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolver.java
@@ -19,20 +19,18 @@
  * under the License.
  */
 
-
+import java.util.Date;
 
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.joda.time.format.DateTimeFormatter;
 import org.joda.time.format.ISODateTimeFormat;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import java.util.Date;
 
 /**
  * Reverse index xml datetime strings
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolver.java
index de8f753..42f81ed 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolver.java
@@ -19,16 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import java.text.DecimalFormat;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/20/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/FloatRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/FloatRyaTypeResolver.java
index 851b32c..18467f6 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/FloatRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/FloatRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  */
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolver.java
index 12705d8..344406a 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/20/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolver.java
index 3b700d7..9dfe488 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/20/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaTypeResolverImpl.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaTypeResolverImpl.java
index 943a1d3..fba7a29 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaTypeResolverImpl.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaTypeResolverImpl.java
@@ -29,8 +29,8 @@
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import com.google.common.primitives.Bytes;
 
@@ -44,14 +44,14 @@
             .stringEncoder();
 
     protected byte markerByte;
-    protected URI dataType;
+    protected IRI dataType;
     protected byte[] markerBytes;
 
     public RyaTypeResolverImpl() {
         this((byte) PLAIN_LITERAL_MARKER, XMLSchema.STRING);
     }
 
-    public RyaTypeResolverImpl(final byte markerByte, final URI dataType) {
+    public RyaTypeResolverImpl(final byte markerByte, final IRI dataType) {
         setMarkerByte(markerByte);
         setRyaDataType(dataType);
     }
@@ -84,11 +84,11 @@
     }
 
     @Override
-    public URI getRyaDataType() {
+    public IRI getRyaDataType() {
         return dataType;
     }
 
-    public void setRyaDataType(final URI dataType) {
+    public void setRyaDataType(final IRI dataType) {
         this.dataType = dataType;
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaURIResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaURIResolver.java
index 08eeb52..c7ac82c 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaURIResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/RyaURIResolver.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/16/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ShortRyaTypeResolver.java b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ShortRyaTypeResolver.java
index 023fb30..baefacc 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ShortRyaTypeResolver.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/resolver/impl/ShortRyaTypeResolver.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 import org.calrissian.mango.types.exception.TypeDecodingException;
 import org.calrissian.mango.types.exception.TypeEncodingException;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  */
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/CloseableIterableIteration.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/CloseableIterableIteration.java
index 87c5ee2..f192d73 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/CloseableIterableIteration.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/CloseableIterableIteration.java
@@ -19,15 +19,12 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.io.IOException;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
 import org.calrissian.mango.collect.CloseableIterable;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Date: 1/30/13
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/EnumerationWrapper.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/EnumerationWrapper.java
index 250ff1f..73dac7b 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/EnumerationWrapper.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/EnumerationWrapper.java
@@ -19,12 +19,10 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Enumeration;
 
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+
 /**
  * Date: 7/26/12
  * Time: 9:12 AM
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/IteratorWrapper.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/IteratorWrapper.java
index 0a841f2..50f7e9c 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/IteratorWrapper.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/IteratorWrapper.java
@@ -19,12 +19,10 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Iterator;
 
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+
 /**
  * Date: 7/26/12
  * Time: 9:12 AM
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/NullableStatementImpl.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/NullableStatementImpl.java
index e5e75f2..9ac9705 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/NullableStatementImpl.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/NullableStatementImpl.java
@@ -19,12 +19,10 @@
  * under the License.
  */
 
-
-
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class NullableStatementImpl
@@ -34,11 +32,11 @@
 public class NullableStatementImpl implements Statement {
 
     private Resource subject;
-    private URI predicate;
+    private IRI predicate;
     private Value object;
     private Resource[] contexts;
 
-    public NullableStatementImpl(Resource subject, URI predicate, Value object, Resource... contexts) {
+    public NullableStatementImpl(Resource subject, IRI predicate, Value object, Resource... contexts) {
         this.subject = subject;
         this.predicate = predicate;
         this.object = object;
@@ -81,7 +79,7 @@
         return object;
     }
 
-    public URI getPredicate() {
+    public IRI getPredicate() {
         return predicate;
     }
 
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/PeekingCloseableIteration.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/PeekingCloseableIteration.java
index 18cef9b..8086277 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/PeekingCloseableIteration.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/PeekingCloseableIteration.java
@@ -19,10 +19,9 @@
  * under the License.
  */
 
-
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 import com.google.common.base.Preconditions;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * Date: 7/24/12
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/QueryInvestigator.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/QueryInvestigator.java
index 54f0010..deaa659 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/QueryInvestigator.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/QueryInvestigator.java
@@ -22,8 +22,8 @@
 
 import java.util.regex.Pattern;
 
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementAddBindingSetFunction.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementAddBindingSetFunction.java
index a2b97ff..01c6f7b 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementAddBindingSetFunction.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementAddBindingSetFunction.java
@@ -19,14 +19,13 @@
  * under the License.
  */
 
+import java.util.Map;
 
-
-import com.google.common.base.Function;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaStatement;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
-import java.util.Map;
+import com.google.common.base.Function;
 
 /**
  * Date: 1/18/13
@@ -35,6 +34,6 @@
 public class RyaStatementAddBindingSetFunction implements Function<RyaStatement, Map.Entry<RyaStatement, BindingSet>> {
     @Override
     public Map.Entry<RyaStatement, BindingSet> apply(RyaStatement ryaStatement) {
-        return new RdfCloudTripleStoreUtils.CustomEntry<org.apache.rya.api.domain.RyaStatement, org.openrdf.query.BindingSet>(ryaStatement, null);
+        return new RdfCloudTripleStoreUtils.CustomEntry<RyaStatement, BindingSet>(ryaStatement, null);
     }
 }
diff --git a/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementRemoveBindingSetCloseableIteration.java b/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementRemoveBindingSetCloseableIteration.java
index d803715..3ca210f 100644
--- a/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementRemoveBindingSetCloseableIteration.java
+++ b/common/rya.api/src/main/java/org/apache/rya/api/utils/RyaStatementRemoveBindingSetCloseableIteration.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
+import java.util.Map;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
-import org.openrdf.query.BindingSet;
-
-import java.util.Map;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Date: 1/18/13
diff --git a/common/rya.api/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function b/common/rya.api/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
similarity index 100%
rename from common/rya.api/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function
rename to common/rya.api/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/domain/RyaTypeTest.java b/common/rya.api/src/test/java/org/apache/rya/api/domain/RyaTypeTest.java
index bb349bb..fe1216a 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/domain/RyaTypeTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/domain/RyaTypeTest.java
@@ -19,9 +19,9 @@
  * under the License.
  */
 
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 public class RyaTypeTest {
     static RyaType a = new RyaType(XMLSchema.STRING, "http://www.example.com/Alice");
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/domain/StatementMetadataTest.java b/common/rya.api/src/test/java/org/apache/rya/api/domain/StatementMetadataTest.java
index d61a802..c316b50 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/domain/StatementMetadataTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/domain/StatementMetadataTest.java
@@ -20,7 +20,6 @@
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
 
 public class StatementMetadataTest {
 
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/functions/DateTimeWithinPeriodTest.java b/common/rya.api/src/test/java/org/apache/rya/api/functions/DateTimeWithinPeriodTest.java
index ac27d1b..31afba0 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/functions/DateTimeWithinPeriodTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/functions/DateTimeWithinPeriodTest.java
@@ -27,17 +27,17 @@
 import javax.xml.datatype.DatatypeConfigurationException;
 import javax.xml.datatype.DatatypeFactory;
 
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
 import org.junit.Test;
-import org.openrdf.model.Literal;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
 
 public class DateTimeWithinPeriodTest {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
-    private static final Literal TRUE = vf.createLiteral(true);
-    private static final Literal FALSE = vf.createLiteral(false);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final Literal TRUE = VF.createLiteral(true);
+    private static final Literal FALSE = VF.createLiteral(false);
     private static final ZonedDateTime testThisTimeDate = ZonedDateTime.parse("2018-02-03T14:15:16+07:00");
 
     @Test
@@ -50,14 +50,14 @@
         ZonedDateTime zTime1 = zTime.minusSeconds(1);
         String time1 = zTime1.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal now = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal now = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, now, now, vf.createLiteral(1), OWLTime.SECONDS_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(1), OWLTime.SECONDS_URI));
-        assertEquals(TRUE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(2), OWLTime.SECONDS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, now, VF.createLiteral(1), OWLTime.SECONDS_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(1), OWLTime.SECONDS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(2), OWLTime.SECONDS_URI));
     }
 
     @Test
@@ -71,14 +71,14 @@
         ZonedDateTime zTime1 = zTime.minusMinutes(1);
         String time1 = zTime1.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal now = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal now = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, now, now,vf.createLiteral(1),OWLTime.MINUTES_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(1),OWLTime.MINUTES_URI));
-        assertEquals(TRUE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(2),OWLTime.MINUTES_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, now,VF.createLiteral(1),OWLTime.MINUTES_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(1),OWLTime.MINUTES_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(2),OWLTime.MINUTES_URI));
     }
 
 
@@ -92,14 +92,14 @@
         ZonedDateTime zTime1 = zTime.minusHours(1);
         String time1 = zTime1.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal now = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal now = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, now, now,vf.createLiteral(1),OWLTime.HOURS_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(1),OWLTime.HOURS_URI));
-        assertEquals(TRUE, func.evaluate(vf, now, nowMinusOne,vf.createLiteral(2),OWLTime.HOURS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, now,VF.createLiteral(1),OWLTime.HOURS_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(1),OWLTime.HOURS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, nowMinusOne,VF.createLiteral(2),OWLTime.HOURS_URI));
     }
 
 
@@ -113,14 +113,14 @@
         ZonedDateTime zTime1 = zTime.minusDays(1);
         String time1 = zTime1.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal now = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal now = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, now, now, vf.createLiteral(1), OWLTime.DAYS_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusOne, vf.createLiteral(1), OWLTime.DAYS_URI));
-        assertEquals(TRUE, func.evaluate(vf, now, nowMinusOne, vf.createLiteral(2), OWLTime.DAYS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, now, VF.createLiteral(1), OWLTime.DAYS_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusOne, VF.createLiteral(1), OWLTime.DAYS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, nowMinusOne, VF.createLiteral(2), OWLTime.DAYS_URI));
     }
 
     // Note that this test fails if the week under test spans a DST when the USA springs forward.
@@ -137,16 +137,16 @@
         ZonedDateTime zTime2 = zTime.minusWeeks(7);
         String time2 = zTime2.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal now = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
-        Literal nowMinusSeven = vf.createLiteral(dtf.newXMLGregorianCalendar(time2));
+        Literal now = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal nowMinusSeven = VF.createLiteral(dtf.newXMLGregorianCalendar(time2));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, now, now, vf.createLiteral(1), OWLTime.WEEKS_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusOne, vf.createLiteral(1), OWLTime.WEEKS_URI));
-        assertEquals(TRUE, func.evaluate(vf, now, nowMinusOne, vf.createLiteral(2), OWLTime.WEEKS_URI));
-        assertEquals(FALSE, func.evaluate(vf, now, nowMinusSeven, vf.createLiteral(7), OWLTime.WEEKS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, now, VF.createLiteral(1), OWLTime.WEEKS_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusOne, VF.createLiteral(1), OWLTime.WEEKS_URI));
+        assertEquals(TRUE, func.evaluate(VF, now, nowMinusOne, VF.createLiteral(2), OWLTime.WEEKS_URI));
+        assertEquals(FALSE, func.evaluate(VF, now, nowMinusSeven, VF.createLiteral(7), OWLTime.WEEKS_URI));
     }
 
     @Test
@@ -165,17 +165,17 @@
         ZonedDateTime zTime3 = now.minusDays(1).withZoneSameInstant(ZoneId.of("Asia/Seoul"));
         String time3 = zTime3.format(DateTimeFormatter.ISO_INSTANT);
 
-        Literal nowLocal = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
-        Literal nowEuropeTZ = vf.createLiteral(dtf.newXMLGregorianCalendar(time1));
-        Literal nowAustraliaTZ = vf.createLiteral(dtf.newXMLGregorianCalendar(time2));
-        Literal nowAsiaTZMinusOne = vf.createLiteral(dtf.newXMLGregorianCalendar(time3));
+        Literal nowLocal = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
+        Literal nowEuropeTZ = VF.createLiteral(dtf.newXMLGregorianCalendar(time1));
+        Literal nowAustraliaTZ = VF.createLiteral(dtf.newXMLGregorianCalendar(time2));
+        Literal nowAsiaTZMinusOne = VF.createLiteral(dtf.newXMLGregorianCalendar(time3));
 
         DateTimeWithinPeriod func = new DateTimeWithinPeriod();
 
-        assertEquals(TRUE, func.evaluate(vf, nowLocal, nowEuropeTZ, vf.createLiteral(1), OWLTime.SECONDS_URI));
-        assertEquals(TRUE, func.evaluate(vf, nowLocal, nowAustraliaTZ, vf.createLiteral(1), OWLTime.SECONDS_URI));
-        assertEquals(FALSE, func.evaluate(vf, nowLocal, nowAsiaTZMinusOne, vf.createLiteral(1), OWLTime.DAYS_URI));
-        assertEquals(TRUE, func.evaluate(vf, nowLocal, nowAsiaTZMinusOne, vf.createLiteral(2), OWLTime.DAYS_URI));
+        assertEquals(TRUE, func.evaluate(VF, nowLocal, nowEuropeTZ, VF.createLiteral(1), OWLTime.SECONDS_URI));
+        assertEquals(TRUE, func.evaluate(VF, nowLocal, nowAustraliaTZ, VF.createLiteral(1), OWLTime.SECONDS_URI));
+        assertEquals(FALSE, func.evaluate(VF, nowLocal, nowAsiaTZMinusOne, VF.createLiteral(1), OWLTime.DAYS_URI));
+        assertEquals(TRUE, func.evaluate(VF, nowLocal, nowAsiaTZMinusOne, VF.createLiteral(2), OWLTime.DAYS_URI));
     }
 
 }
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/AbstractTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/AbstractTriplePatternStrategyTest.java
index aac8297..bd96436 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/AbstractTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/AbstractTriplePatternStrategyTest.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT.OSP;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT.PO;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT.SPO;
@@ -29,7 +27,6 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import junit.framework.TestCase;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
@@ -43,8 +40,9 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowRegex;
 import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
-import org.openrdf.model.vocabulary.XMLSchema;
+import junit.framework.TestCase;
 
 /**
  * Date: 7/25/12
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedPoWholeRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedPoWholeRowTriplePatternStrategyTest.java
index 76216b6..0775dfa 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedPoWholeRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedPoWholeRowTriplePatternStrategyTest.java
@@ -1,13 +1,3 @@
-package org.apache.rya.api.query.strategy.wholerow;
-
-import java.util.Map;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.hadoop.io.Text;
-import org.junit.Before;
-import org.openrdf.model.impl.URIImpl;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -16,9 +6,9 @@
  * to you 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
@@ -26,10 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.api.query.strategy.wholerow;
 
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
-
-import junit.framework.TestCase;
+import org.apache.hadoop.io.Text;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
@@ -43,12 +36,18 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowRegex;
 import org.apache.rya.api.resolver.triple.impl.WholeRowHashedTripleResolver;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.junit.Before;
+
+import junit.framework.TestCase;
 
 /**
  * Date: 7/14/12
  * Time: 11:46 AM
  */
 public class HashedPoWholeRowTriplePatternStrategyTest extends TestCase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     RyaURI uri = new RyaURI("urn:test#1234");
     RyaURI uri2 = new RyaURI("urn:test#1235");
@@ -58,16 +57,16 @@
     RyaContext ryaContext = RyaContext.getInstance();
     RyaTripleContext ryaTripleContext;
 
-    RyaType customType1 = new RyaType(new URIImpl("urn:custom#type"), "1234");
-    RyaType customType2 = new RyaType(new URIImpl("urn:custom#type"), "1235");
-    RyaType customType3 = new RyaType(new URIImpl("urn:custom#type"), "1236");
+    RyaType customType1 = new RyaType(VF.createIRI("urn:custom#type"), "1234");
+    RyaType customType2 = new RyaType(VF.createIRI("urn:custom#type"), "1235");
+    RyaType customType3 = new RyaType(VF.createIRI("urn:custom#type"), "1236");
     RyaTypeRange customTypeRange1 = new RyaTypeRange(customType1, customType2);
     RyaTypeRange customTypeRange2 = new RyaTypeRange(customType2, customType3);
 
     @Before
     public void setUp() {
-    	MockRdfCloudConfiguration config = new MockRdfCloudConfiguration();
-    	config.set(MockRdfCloudConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
+    	MockRdfConfiguration config = new MockRdfConfiguration();
+    	config.set(MockRdfConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
     	ryaTripleContext = RyaTripleContext.getInstance(config);
     }
 
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedSpoWholeRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedSpoWholeRowTriplePatternStrategyTest.java
index 88a1923..d71e4e8 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedSpoWholeRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/HashedSpoWholeRowTriplePatternStrategyTest.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-//
 import java.util.Map;
 
-import junit.framework.TestCase;
+import org.apache.hadoop.io.Text;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
@@ -34,16 +32,18 @@
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRow;
-
-import org.apache.hadoop.io.Text;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Before;
-import org.openrdf.model.impl.URIImpl;
+
+import junit.framework.TestCase;
 
 /**
  * Date: 7/14/12
  * Time: 7:47 AM
  */
 public class HashedSpoWholeRowTriplePatternStrategyTest extends TestCase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     RyaURI uri = new RyaURI("urn:test#1234");
     RyaURI uri2 = new RyaURI("urn:test#1235");
@@ -53,16 +53,16 @@
     RyaContext ryaContext = RyaContext.getInstance();
     RyaTripleContext ryaTripleContext;
 
-    RyaType customType1 = new RyaType(new URIImpl("urn:custom#type"), "1234");
-    RyaType customType2 = new RyaType(new URIImpl("urn:custom#type"), "1235");
-    RyaType customType3 = new RyaType(new URIImpl("urn:custom#type"), "1236");
+    RyaType customType1 = new RyaType(VF.createIRI("urn:custom#type"), "1234");
+    RyaType customType2 = new RyaType(VF.createIRI("urn:custom#type"), "1235");
+    RyaType customType3 = new RyaType(VF.createIRI("urn:custom#type"), "1236");
     RyaTypeRange customTypeRange1 = new RyaTypeRange(customType1, customType2);
     RyaTypeRange customTypeRange2 = new RyaTypeRange(customType2, customType3);
 
     @Before
     public void setUp() {
-    	MockRdfCloudConfiguration config = new MockRdfCloudConfiguration();
-    	config.set(MockRdfCloudConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
+    	MockRdfConfiguration config = new MockRdfConfiguration();
+    	config.set(MockRdfConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
     	ryaTripleContext = RyaTripleContext.getInstance(config);
     }
     
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfCloudConfiguration.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfConfiguration.java
similarity index 92%
rename from common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfCloudConfiguration.java
rename to common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfConfiguration.java
index dcc707b..882c3df 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfCloudConfiguration.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/MockRdfConfiguration.java
@@ -22,7 +22,7 @@
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 
-public class MockRdfCloudConfiguration extends RdfCloudTripleStoreConfiguration {
+public class MockRdfConfiguration extends RdfCloudTripleStoreConfiguration {
 
 	@Override
 	public RdfCloudTripleStoreConfiguration clone() {
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategyTest.java
index 5b54fee..9bac95a 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/NullRowTriplePatternStrategyTest.java
@@ -18,18 +18,22 @@
  */
 package org.apache.rya.api.query.strategy.wholerow;
 
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.LAST_BYTES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
 import java.util.Arrays;
 import java.util.Map;
+
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.LAST_BYTES;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.query.strategy.ByteRange;
 import org.junit.After;
 import org.junit.AfterClass;
-import static org.junit.Assert.*;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/OspWholeRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/OspWholeRowTriplePatternStrategyTest.java
index 29125e8..b9ef519 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/OspWholeRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/OspWholeRowTriplePatternStrategyTest.java
@@ -28,7 +28,7 @@
 //import org.apache.accumulo.core.data.Key;
 //import org.apache.accumulo.core.data.Range;
 //import org.apache.hadoop.io.Text;
-//import org.openrdf.model.impl.URIImpl;
+//import org.eclipse.rdf4j.model.impl.URIImpl;
 //
 //import java.util.Map;
 //
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/PoWholeRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/PoWholeRowTriplePatternStrategyTest.java
index ea3b46a..12bfc1f 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/PoWholeRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/PoWholeRowTriplePatternStrategyTest.java
@@ -28,7 +28,7 @@
 //import org.apache.accumulo.core.data.Key;
 //import org.apache.accumulo.core.data.Range;
 //import org.apache.hadoop.io.Text;
-//import org.openrdf.model.impl.URIImpl;
+//import org.eclipse.rdf4j.model.impl.URIImpl;
 //
 //import java.util.Map;
 //
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/SpoWholeRowTriplePatternStrategyTest.java b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/SpoWholeRowTriplePatternStrategyTest.java
index 28759b5..5e2ca7e 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/SpoWholeRowTriplePatternStrategyTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/query/strategy/wholerow/SpoWholeRowTriplePatternStrategyTest.java
@@ -28,7 +28,7 @@
 //import org.apache.accumulo.core.data.Key;
 //import org.apache.accumulo.core.data.Range;
 //import org.apache.hadoop.io.Text;
-//import org.openrdf.model.impl.URIImpl;
+//import org.eclipse.rdf4j.model.impl.URIImpl;
 //
 //import java.util.Map;
 //
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/RyaContextTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/RyaContextTest.java
index a0d2ecc..ade343f 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/RyaContextTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/RyaContextTest.java
@@ -19,20 +19,17 @@
  * under the License.
  */
 
-
-
 import java.util.Map;
 
-import junit.framework.TestCase;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.query.strategy.AbstractTriplePatternStrategyTest.MockRdfConfiguration;
-import org.apache.rya.api.query.strategy.wholerow.MockRdfCloudConfiguration;
+import org.apache.rya.api.query.strategy.wholerow.MockRdfConfiguration;
 import org.apache.rya.api.resolver.triple.TripleRow;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
-import org.openrdf.model.impl.URIImpl;
+import junit.framework.TestCase;
 
 /**
  */
@@ -52,7 +49,7 @@
         assertEquals(ryaURI, deserialize);
 
         //custom type
-        ryaType = new RyaType(new URIImpl("urn:test#customDataType"), "mydata");
+        ryaType = new RyaType(SimpleValueFactory.getInstance().createIRI("urn:test#customDataType"), "mydata");
         serialize = instance.serialize(ryaType);
         assertEquals(ryaType, instance.deserialize(serialize));
     }
@@ -62,7 +59,7 @@
         RyaURI pred = new RyaURI("urn:test#pred");
         RyaType obj = new RyaType("mydata");
         RyaStatement statement = new RyaStatement(subj, pred, obj);
-        RyaTripleContext instance = RyaTripleContext.getInstance(new MockRdfCloudConfiguration());
+        RyaTripleContext instance = RyaTripleContext.getInstance(new MockRdfConfiguration());
 
         Map<TABLE_LAYOUT, TripleRow> map = instance.serializeTriple(statement);
         TripleRow tripleRow = map.get(TABLE_LAYOUT.SPO);
@@ -74,8 +71,8 @@
         RyaURI pred = new RyaURI("urn:test#pred");
         RyaType obj = new RyaType("mydata");
         RyaStatement statement = new RyaStatement(subj, pred, obj);
-    	MockRdfCloudConfiguration config = new MockRdfCloudConfiguration();
-    	config.set(MockRdfCloudConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
+    	MockRdfConfiguration config = new MockRdfConfiguration();
+    	config.set(MockRdfConfiguration.CONF_PREFIX_ROW_WITH_HASH, Boolean.TRUE.toString());
        RyaTripleContext instance = RyaTripleContext.getInstance(config);
 
         Map<TABLE_LAYOUT, TripleRow> map = instance.serializeTriple(statement);
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolverTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolverTest.java
index 9fd086b..80bfe84 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolverTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/CustomDatatypeResolverTest.java
@@ -19,11 +19,10 @@
  * under the License.
  */
 
-
+import org.apache.rya.api.domain.RyaType;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import junit.framework.TestCase;
-import org.apache.rya.api.domain.RyaType;
-import org.openrdf.model.impl.URIImpl;
 
 /**
  * Date: 7/16/12
@@ -32,7 +31,7 @@
 public class CustomDatatypeResolverTest extends TestCase {
 
     public void testCustomDataTypeSerialization() throws Exception {
-        RyaType ryaType = new RyaType(new URIImpl("urn:test#datatype"), "testdata");
+        RyaType ryaType = new RyaType(SimpleValueFactory.getInstance().createIRI("urn:test#datatype"), "testdata");
         byte[] serialize = new CustomDatatypeResolver().serialize(ryaType);
         RyaType deserialize = new CustomDatatypeResolver().deserialize(serialize);
         assertEquals(ryaType, deserialize);
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolverTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolverTest.java
index 5f60f5a..aae2da0 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolverTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DateTimeRyaTypeResolverTest.java
@@ -19,9 +19,9 @@
  * under the License.
  */
 
-
-
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 import java.util.Date;
 import java.util.GregorianCalendar;
@@ -32,11 +32,12 @@
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
-
-import org.junit.Ignore;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.impl.CalendarLiteralImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 /**
  * Test serializing and deserializing.
@@ -54,14 +55,16 @@
  * 			deserialized= 2000-02-02T05:00:00.000Z   type = XMLSchema.DATETIME
  */
 public class DateTimeRyaTypeResolverTest {
-	@Test
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
+    @Test
     public void testDateTime() throws Exception {
         long currentTime = 1342182689285l;
         Date date = new Date(currentTime);
         GregorianCalendar gc = new GregorianCalendar();
         gc.setTimeInMillis(date.getTime());
         XMLGregorianCalendar xmlGregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
-        CalendarLiteralImpl literal = new CalendarLiteralImpl(xmlGregorianCalendar);
+        Literal literal = VF.createLiteral(xmlGregorianCalendar);
         byte[] serialize = new DateTimeRyaTypeResolver().serialize(RdfToRyaConversions.convertLiteral(literal));
         RyaType deserialize = new DateTimeRyaTypeResolver().deserialize(serialize);
         assertEquals("2012-07-13T12:31:29.285Z", deserialize.getData());
@@ -167,7 +170,7 @@
 	 * @return
 	 * @throws RyaTypeResolverException
 	 */
-	private RyaType serializeAndDeserialize(String dateTimeString, org.openrdf.model.URI type ) throws RyaTypeResolverException {
+	private RyaType serializeAndDeserialize(String dateTimeString,  IRI type ) throws RyaTypeResolverException {
 		if (type == null) 
 			type = XMLSchema.DATETIME;
 		RyaType ryaType = new RyaType(type, dateTimeString ); 
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolverTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolverTest.java
index 5e42369..f8a5a73 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolverTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/DoubleRyaTypeResolverTest.java
@@ -19,13 +19,11 @@
  * under the License.
  */
 
-
+import java.util.Random;
 
 import junit.framework.TestCase;
 import org.apache.rya.api.domain.RyaType;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import java.util.Random;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Date: 7/20/12
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolverTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolverTest.java
index 199240d..5979d9d 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolverTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/IntegerRyaTypeResolverTest.java
@@ -19,13 +19,12 @@
  * under the License.
  */
 
+import java.util.Random;
 
+import org.apache.rya.api.domain.RyaType;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import junit.framework.TestCase;
-import org.apache.rya.api.domain.RyaType;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import java.util.Random;
 
 /**
  * Date: 7/20/12
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolverTest.java b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolverTest.java
index c971d39..1017ebe 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolverTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/resolver/impl/LongRyaTypeResolverTest.java
@@ -19,15 +19,13 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.domain.RyaType;
-import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
+import static org.junit.Assert.assertEquals;
 
 import java.util.Random;
 
-import static junit.framework.Assert.assertEquals;
+import org.apache.rya.api.domain.RyaType;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.junit.Test;
 
 /**
  * Date: 9/7/12
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/utils/QueryInvestigatorTest.java b/common/rya.api/src/test/java/org/apache/rya/api/utils/QueryInvestigatorTest.java
index bedc59a..809bcdd 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/utils/QueryInvestigatorTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/utils/QueryInvestigatorTest.java
@@ -21,8 +21,8 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
 
 /**
  * Unit tests the methods of {@link QueryInvestigator}.
diff --git a/common/rya.api/src/test/java/org/apache/rya/api/utils/RdfIOTest.java b/common/rya.api/src/test/java/org/apache/rya/api/utils/RdfIOTest.java
index 92bcfff..1a07184 100644
--- a/common/rya.api/src/test/java/org/apache/rya/api/utils/RdfIOTest.java
+++ b/common/rya.api/src/test/java/org/apache/rya/api/utils/RdfIOTest.java
@@ -22,8 +22,8 @@
 //
 //import junit.framework.TestCase;
 //import org.apache.rya.api.RdfCloudTripleStoreUtils;
-//import org.openrdf.model.Statement;
-//import org.openrdf.model.impl.StatementImpl;
+//import org.eclipse.rdf4j.model.Statement;
+//import org.eclipse.rdf4j.model.impl.StatementImpl;
 //
 //import static org.apache.rya.api.RdfCloudTripleStoreConstants.*;
 //
diff --git a/common/rya.provenance/pom.xml b/common/rya.provenance/pom.xml
index 509b302..d7dc6f5 100644
--- a/common/rya.provenance/pom.xml
+++ b/common/rya.provenance/pom.xml
@@ -31,8 +31,8 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-runtime</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-runtime</artifactId>
         </dependency>
 
         <dependency>
diff --git a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/ProvenanceCollectionException.java b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/ProvenanceCollectionException.java
index c550ee4..acf7bd3 100644
--- a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/ProvenanceCollectionException.java
+++ b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/ProvenanceCollectionException.java
@@ -19,8 +19,7 @@
  * under the License.
  */
 
-
-import org.openrdf.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 /**
  *  Exception for errors in collecting provenance data
diff --git a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollector.java b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollector.java
index 73a2d70..8827717 100644
--- a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollector.java
+++ b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollector.java
@@ -19,15 +19,13 @@
  * under the License.
  */
 
-
 import java.util.List;
 
 import org.apache.rya.rdftriplestore.provenance.rdf.BaseProvenanceModel;
 import org.apache.rya.rdftriplestore.provenance.rdf.RDFProvenanceModel;
-
-import org.openrdf.model.Statement;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
 
 /**
  * Records provenance data to an external rdf triplestore
diff --git a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModel.java b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModel.java
index 70e0f5a..17406a0 100644
--- a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModel.java
+++ b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModel.java
@@ -19,31 +19,30 @@
  * under the License.
  */
 
-
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.UUID;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 
 /**
  * Basic representation of Provenance data capture in RDF.
  */
 public class BaseProvenanceModel implements RDFProvenanceModel {
 	
-	private static final ValueFactory vf = ValueFactoryImpl.getInstance();
-	private static final Resource queryEventType = vf.createURI("http://rya.com/provenance#QueryEvent");
-	private static final URI atTimeProperty = vf.createURI("http://www.w3.org/ns/prov#atTime");
-	private static final URI associatedWithUser = vf.createURI("http://rya.com/provenance#associatedWithUser");
-	private static final URI queryTypeProp = vf.createURI("http://rya.com/provenance#queryType");
-	private static final URI executedQueryProperty = vf.createURI("http://rya.com/provenance#executedQuery");
-	private static final String queryNameSpace = "http://rya.com/provenance#queryEvent";
+	private static final ValueFactory VF = SimpleValueFactory.getInstance();
+	private static final Resource QUERY_EVENT_TYPE = VF.createIRI("http://rya.com/provenance#QueryEvent");
+	private static final IRI AT_TIME_PROPERTY = VF.createIRI("http://www.w3.org/ns/prov#atTime");
+	private static final IRI ASSOCIATED_WITH_USER = VF.createIRI("http://rya.com/provenance#associatedWithUser");
+	private static final IRI QUERY_TYPE_PROP = VF.createIRI("http://rya.com/provenance#queryType");
+	private static final IRI EXECUTED_QUERY_PROPERTY = VF.createIRI("http://rya.com/provenance#executedQuery");
+	private static final String QUERY_NAMESPACE = "http://rya.com/provenance#queryEvent";
 
 	/* (non-Javadoc)
 	 * @see org.apache.rya.rdftriplestore.provenance.rdf.RDFProvenanceModel#getStatementsForQuery(java.lang.String, java.lang.String, java.lang.String)
@@ -51,16 +50,16 @@
 	public List<Statement> getStatementsForQuery(String query, String user, String queryType) {
 		List<Statement> statements = new ArrayList<Statement>();
 		// create some statements for the query
-		Resource queryEventResource = vf.createURI(queryNameSpace + UUID.randomUUID().toString());
-		Statement queryEventDecl = vf.createStatement(queryEventResource, RDF.TYPE, queryEventType);
+		Resource queryEventResource = VF.createIRI(QUERY_NAMESPACE + UUID.randomUUID().toString());
+		Statement queryEventDecl = VF.createStatement(queryEventResource, RDF.TYPE, QUERY_EVENT_TYPE);
 		statements.add(queryEventDecl);
-		Statement queryEventTime = vf.createStatement(queryEventResource, atTimeProperty, vf.createLiteral(new Date()));
+		Statement queryEventTime = VF.createStatement(queryEventResource, AT_TIME_PROPERTY, VF.createLiteral(new Date()));
 		statements.add(queryEventTime);
-		Statement queryUser = vf.createStatement(queryEventResource, associatedWithUser, vf.createLiteral(user));
+		Statement queryUser = VF.createStatement(queryEventResource, ASSOCIATED_WITH_USER, VF.createLiteral(user));
 		statements.add(queryUser);
-		Statement executedQuery = vf.createStatement(queryEventResource, executedQueryProperty, vf.createLiteral(query));
+		Statement executedQuery = VF.createStatement(queryEventResource, EXECUTED_QUERY_PROPERTY, VF.createLiteral(query));
 		statements.add(executedQuery);
-		Statement queryTypeStatement = vf.createStatement(queryEventResource, queryTypeProp, vf.createLiteral(queryType));
+		Statement queryTypeStatement = VF.createStatement(queryEventResource, QUERY_TYPE_PROP, VF.createLiteral(queryType));
 		statements.add(queryTypeStatement);
 		return statements;
 	}
diff --git a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/RDFProvenanceModel.java b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/RDFProvenanceModel.java
index 619f80d..8a4d4cb 100644
--- a/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/RDFProvenanceModel.java
+++ b/common/rya.provenance/src/main/java/org/apache/rya/rdftriplestore/provenance/rdf/RDFProvenanceModel.java
@@ -19,15 +19,14 @@
  * under the License.
  */
 
-
 import java.util.List;
 
-import org.openrdf.model.Statement;
+import org.eclipse.rdf4j.model.Statement;
 
 
 public interface RDFProvenanceModel {
 
-	List<Statement> getStatementsForQuery(String query, String user, String queryType);
+	public List<Statement> getStatementsForQuery(String query, String user, String queryType);
 
 	
 }
diff --git a/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollectorTest.java b/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollectorTest.java
index be49c8e..a9d4298 100644
--- a/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollectorTest.java
+++ b/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/TriplestoreProvenanceCollectorTest.java
@@ -19,19 +19,18 @@
  * under the License.
  */
 
-
 import static org.junit.Assert.assertTrue;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.memory.MemoryStore;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.memory.MemoryStore;
 
 public class TriplestoreProvenanceCollectorTest {
 
diff --git a/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModelTest.java b/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModelTest.java
index 0da5a4d..5532f12 100644
--- a/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModelTest.java
+++ b/common/rya.provenance/src/test/java/org/apache/rya/rdftriplestore/provenance/rdf/BaseProvenanceModelTest.java
@@ -19,13 +19,12 @@
  * under the License.
  */
 
-
 import static org.junit.Assert.assertTrue;
 
 import java.util.List;
 
+import org.eclipse.rdf4j.model.Statement;
 import org.junit.Test;
-import org.openrdf.model.Statement;
 
 public class BaseProvenanceModelTest {
 
diff --git a/dao/accumulo.rya/pom.xml b/dao/accumulo.rya/pom.xml
index beed3a4..a90c30a 100644
--- a/dao/accumulo.rya/pom.xml
+++ b/dao/accumulo.rya/pom.xml
@@ -43,16 +43,21 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-nquads</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-nquads</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-evaluation</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-evaluation</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-sail-api</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
         </dependency>
         <dependency>
             <groupId>commons-io</groupId>
@@ -60,8 +65,8 @@
             </dependency>
         <!--  testing dependencies -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
             <scope>test</scope>
         </dependency>
         <dependency>
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloNamespaceTableIterator.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloNamespaceTableIterator.java
index 9f6c1dd..2de5b1c 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloNamespaceTableIterator.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloNamespaceTableIterator.java
@@ -23,15 +23,13 @@
 import java.util.Iterator;
 import java.util.Map.Entry;
 
+import com.google.common.base.Preconditions;
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.rya.api.persist.RdfDAOException;
-import org.openrdf.model.Namespace;
-import org.openrdf.model.impl.NamespaceImpl;
-
-import com.google.common.base.Preconditions;
-
-import info.aduna.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.model.impl.NamespaceImpl;
 
 public class AccumuloNamespaceTableIterator<T extends Namespace> implements
         CloseableIteration<Namespace, RdfDAOException> {
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
index a8ed76c..6675ae3 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfEvalStatsDAO.java
@@ -43,8 +43,8 @@
 import org.apache.rya.api.layout.TableLayoutStrategy;
 import org.apache.rya.api.persist.RdfDAOException;
 import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Class AccumuloRdfEvalStatsDAO
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfQueryIterator.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfQueryIterator.java
index 29fe0f3..e99cfe1 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfQueryIterator.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRdfQueryIterator.java
@@ -23,7 +23,7 @@
 //import com.google.common.collect.Iterators;
 //import com.google.common.io.ByteArrayDataInput;
 //import com.google.common.io.ByteStreams;
-//import info.aduna.iteration.CloseableIteration;
+//import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 //import org.apache.rya.api.RdfCloudTripleStoreConstants;
 //import org.apache.rya.api.RdfCloudTripleStoreUtils;
 //import org.apache.rya.api.persist.RdfDAOException;
@@ -35,11 +35,11 @@
 //import org.apache.accumulo.core.iterators.user.TimestampFilter;
 //import org.apache.accumulo.core.security.Authorizations;
 //import org.apache.hadoop.io.Text;
-//import org.openrdf.model.Resource;
-//import org.openrdf.model.Statement;
-//import org.openrdf.model.URI;
-//import org.openrdf.model.Value;
-//import org.openrdf.query.BindingSet;
+//import org.eclipse.rdf4j.model.Resource;
+//import org.eclipse.rdf4j.model.Statement;
+//import org.eclipse.rdf4j.model.IRI;
+//import org.eclipse.rdf4j.model.Value;
+//import org.eclipse.rdf4j.query.BindingSet;
 //import org.slf4j.Logger;
 //import org.slf4j.LoggerFactory;
 //
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
index 22d6dc9..f3e97a3 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/AccumuloRyaDAO.java
@@ -69,13 +69,12 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.RyaNamespaceManager;
 import org.apache.rya.api.resolver.RyaTripleContext;
-import org.openrdf.model.Namespace;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Namespace;
 
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class AccumuloRyaDAO implements RyaDAO<AccumuloRdfConfiguration>, RyaNamespaceManager<AccumuloRdfConfiguration> {
     private static final Log logger = LogFactory.getLog(AccumuloRyaDAO.class);
 
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactory.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactory.java
index a6104f4..1609f2f 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactory.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactory.java
@@ -26,9 +26,9 @@
 //import org.apache.rya.api.domain.RangeValue;
 //import org.apache.accumulo.core.data.Range;
 //import org.apache.hadoop.io.Text;
-//import org.openrdf.model.Value;
-//import org.openrdf.model.ValueFactory;
-//import org.openrdf.model.impl.ValueFactoryImpl;
+//import org.eclipse.rdf4j.model.Value;
+//import org.eclipse.rdf4j.model.ValueFactory;
+//import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
 //
 //import java.io.IOException;
 //import java.util.Map;
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableKeyValues.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableKeyValues.java
index 78e00f2..7361c69 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableKeyValues.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableKeyValues.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static org.apache.rya.accumulo.AccumuloRdfConstants.EMPTY_VALUE;
 
 import java.io.IOException;
@@ -29,6 +27,10 @@
 import java.util.Collection;
 import java.util.Map;
 
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.ColumnVisibility;
+import org.apache.hadoop.io.Text;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
@@ -36,11 +38,6 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.security.ColumnVisibility;
-import org.apache.hadoop.io.Text;
-
 public class RyaTableKeyValues {
     public static final ColumnVisibility EMPTY_CV = new ColumnVisibility();
     public static final Text EMPTY_CV_TEXT = new Text(EMPTY_CV.getExpression());
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableMutationsFactory.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableMutationsFactory.java
index b06be7b..05c3c86 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableMutationsFactory.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/RyaTableMutationsFactory.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static org.apache.rya.accumulo.AccumuloRdfConstants.EMPTY_CV;
 import static org.apache.rya.accumulo.AccumuloRdfConstants.EMPTY_VALUE;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.EMPTY_TEXT;
@@ -31,7 +29,10 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.accumulo.core.data.Mutation;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.ColumnVisibility;
+import org.apache.hadoop.io.Text;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.domain.RyaStatement;
@@ -39,11 +40,6 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 
-import org.apache.accumulo.core.data.Mutation;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.security.ColumnVisibility;
-import org.apache.hadoop.io.Text;
-
 public class RyaTableMutationsFactory {
 
     RyaTripleContext ryaContext;
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/experimental/AccumuloIndexer.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/experimental/AccumuloIndexer.java
index 4a164a9..2646718 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/experimental/AccumuloIndexer.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/experimental/AccumuloIndexer.java
@@ -19,12 +19,10 @@
  * under the License.
  */
 
-
 import java.io.IOException;
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.MultiTableBatchWriter;
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
 
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
index d89928c..8887739 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/AccumuloRyaQueryEngine.java
@@ -63,15 +63,14 @@
 import org.calrissian.mango.collect.CloseableIterable;
 import org.calrissian.mango.collect.CloseableIterables;
 import org.calrissian.mango.collect.FluentCloseableIterable;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterators;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Date: 7/17/12 Time: 9:28 AM
  */
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/KeyValueToRyaStatementFunction.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/KeyValueToRyaStatementFunction.java
index 9dd84c6..e1e74d5 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/KeyValueToRyaStatementFunction.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/KeyValueToRyaStatementFunction.java
@@ -19,22 +19,17 @@
  * under the License.
  */
 
-
-
 import java.util.Map;
 
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import com.google.common.base.Function;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-
-import com.google.common.base.Function;
-
 /**
  * Date: 1/30/13
  * Time: 2:09 PM
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RangeBindingSetEntries.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RangeBindingSetEntries.java
index 4887ba0..7d15223 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RangeBindingSetEntries.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RangeBindingSetEntries.java
@@ -1,9 +1,3 @@
-package org.apache.rya.accumulo.query;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -12,9 +6,9 @@
  * to you 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
@@ -22,12 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.query;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.io.WritableComparator;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementBindingSetKeyValueIterator.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementBindingSetKeyValueIterator.java
index 076ce0f..fe34e0a 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementBindingSetKeyValueIterator.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementBindingSetKeyValueIterator.java
@@ -19,30 +19,24 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.NoSuchElementException;
 
+import org.apache.accumulo.core.client.BatchScanner;
+import org.apache.accumulo.core.client.ScannerBase;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
-
-import org.apache.accumulo.core.client.BatchScanner;
-import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.ScannerBase;
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Date: 7/17/12
@@ -60,7 +54,8 @@
 	private RyaTripleContext ryaContext;
 
     public RyaStatementBindingSetKeyValueIterator(TABLE_LAYOUT tableLayout, RyaTripleContext context, ScannerBase scannerBase, RangeBindingSetEntries rangeMap) {
-        this(tableLayout, ((scannerBase instanceof BatchScanner) ? ((BatchScanner) scannerBase).iterator() : ((Scanner) scannerBase).iterator()), rangeMap, context);
+        this(tableLayout, ((scannerBase instanceof BatchScanner) ? scannerBase.iterator() : scannerBase
+                .iterator()), rangeMap, context);
         this.scanner = scannerBase;
         isBatchScanner = scanner instanceof BatchScanner;
     }
@@ -76,7 +71,7 @@
     public void close() throws RyaDAOException {
         dataIterator = null;
         if (scanner != null && isBatchScanner) {
-            ((BatchScanner) scanner).close();
+            scanner.close();
         }
     }
 
diff --git a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementKeyValueIterator.java b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementKeyValueIterator.java
index fb66e70..8f6fe34 100644
--- a/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementKeyValueIterator.java
+++ b/dao/accumulo.rya/src/main/java/org/apache/rya/accumulo/query/RyaStatementKeyValueIterator.java
@@ -19,23 +19,18 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Iterator;
 import java.util.Map;
 
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
-
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Date: 7/17/12
diff --git a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaDAOTest.java b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaDAOTest.java
index e22bdde..75e5861 100644
--- a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaDAOTest.java
+++ b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/AccumuloRyaDAOTest.java
@@ -19,19 +19,22 @@
  * under the License.
  */
 
-
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import info.aduna.iteration.CloseableIteration;
 
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.UUID;
 
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.IteratorSetting;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.TableNotFoundException;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.iterators.FirstEntryInRowIterator;
 import org.apache.rya.accumulo.query.AccumuloRyaQueryEngine;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
@@ -41,20 +44,14 @@
 import org.apache.rya.api.persist.query.RyaQuery;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaContext;
-
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.IteratorSetting;
-import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.TableNotFoundException;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.iterators.FirstEntryInRowIterator;
 import org.calrissian.mango.collect.FluentCloseableIterable;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 /**
  * Class AccumuloRdfDAOTest
@@ -64,7 +61,7 @@
 public class AccumuloRyaDAOTest {
 
     private AccumuloRyaDAO dao;
-    private ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     static String litdupsNS = "urn:test:litdups#";
     private AccumuloRdfConfiguration conf;
     private Connector connector;
@@ -87,9 +84,9 @@
 
     @Test
     public void testAdd() throws Exception {
-        RyaURI cpu = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "cpu"));
-        RyaURI loadPerc = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "loadPerc"));
-        RyaURI uri1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "uri1"));
+        RyaURI cpu = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "cpu"));
+        RyaURI loadPerc = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "loadPerc"));
+        RyaURI uri1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "uri1"));
         dao.add(new RyaStatement(cpu, loadPerc, uri1));
 
         CloseableIteration<RyaStatement, RyaDAOException> iter = dao.getQueryEngine().query(new RyaStatement(cpu, loadPerc, null), conf);
@@ -115,9 +112,9 @@
 
     @Test
     public void testDeleteDiffVisibility() throws Exception {
-        RyaURI cpu = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "cpu"));
-        RyaURI loadPerc = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "loadPerc"));
-        RyaURI uri1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "uri1"));
+        RyaURI cpu = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "cpu"));
+        RyaURI loadPerc = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "loadPerc"));
+        RyaURI uri1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "uri1"));
         RyaStatement stmt1 = new RyaStatement(cpu, loadPerc, uri1, null, "1", new StatementMetadata(), "vis1".getBytes());
         dao.add(stmt1);
         RyaStatement stmt2 = new RyaStatement(cpu, loadPerc, uri1, null, "2", new StatementMetadata(), "vis2".getBytes());
@@ -149,9 +146,9 @@
 
     @Test
     public void testDeleteDiffTimestamp() throws Exception {
-        RyaURI cpu = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "cpu"));
-        RyaURI loadPerc = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "loadPerc"));
-        RyaURI uri1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "uri1"));
+        RyaURI cpu = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "cpu"));
+        RyaURI loadPerc = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "loadPerc"));
+        RyaURI uri1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "uri1"));
         RyaStatement stmt1 = new RyaStatement(cpu, loadPerc, uri1, null, "1", null, null, 100l);
         dao.add(stmt1);
         RyaStatement stmt2 = new RyaStatement(cpu, loadPerc, uri1, null, "2", null, null, 100l);
@@ -173,14 +170,14 @@
 
     @Test
     public void testDelete() throws Exception {
-        RyaURI predicate = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "pred"));
-        RyaURI subj = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "subj"));
+        RyaURI predicate = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "pred"));
+        RyaURI subj = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "subj"));
 
         // create a "bulk load" of 10,000 statements
         int statement_count = 10000;
         for (int i = 0 ; i < statement_count ; i++){
             //make the statement very large so we will get a lot of random flushes
-            RyaURI obj = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, String.format("object%050d",i)));
+            RyaURI obj = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, String.format("object%050d",i)));
             RyaStatement stmt = new RyaStatement(subj, predicate, obj);
             dao.add(stmt);
         }
@@ -211,8 +208,8 @@
 
     @Test
     public void testAddEmptyString() throws Exception {
-        RyaURI cpu = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "cpu"));
-        RyaURI loadPerc = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "loadPerc"));
+        RyaURI cpu = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "cpu"));
+        RyaURI loadPerc = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "loadPerc"));
         RyaType empty = new RyaType("");
         dao.add(new RyaStatement(cpu, loadPerc, empty));
 
@@ -375,7 +372,7 @@
 
         AccumuloRyaQueryEngine queryEngine = dao.getQueryEngine();
 
-        Collection<RyaStatement> coll = new ArrayList();
+        Collection<RyaStatement> coll = new ArrayList<>();
         coll.add(new RyaStatement(null, loadPerc, uri1));
         coll.add(new RyaStatement(null, loadPerc, uri2));
         CloseableIteration<RyaStatement, RyaDAOException> iter = queryEngine.batchQuery(coll, conf);
@@ -391,7 +388,7 @@
         AccumuloRdfConfiguration queryConf = new AccumuloRdfConfiguration(conf);
         queryConf.setMaxRangesForScanner(2);
 
-        coll = new ArrayList();
+        coll = new ArrayList<>();
         coll.add(new RyaStatement(null, loadPerc, uri1));
         coll.add(new RyaStatement(null, loadPerc, uri2));
         coll.add(new RyaStatement(null, loadPerc, uri3));
@@ -438,7 +435,7 @@
 	
 	    AccumuloRyaQueryEngine queryEngine = dao.getQueryEngine();
 	
-	    Collection<RyaStatement> coll = new ArrayList();
+	    Collection<RyaStatement> coll = new ArrayList<>();
 	    coll.add(new RyaStatement(null, loadPerc, uri0));
 	    coll.add(new RyaStatement(null, loadPerc, uri1));
 	    coll.add(new RyaStatement(null, loadPerc, uri2));
@@ -455,7 +452,7 @@
 	    AccumuloRdfConfiguration queryConf = new AccumuloRdfConfiguration(conf);
 	    queryConf.setMaxRangesForScanner(2);
 	
-	    coll = new ArrayList();
+	    coll = new ArrayList<>();
 	    coll.add(new RyaStatement(null, loadPerc, uri0));
 	    coll.add(new RyaStatement(null, loadPerc, uri1));
 	    coll.add(new RyaStatement(null, loadPerc, uri2));
@@ -495,7 +492,7 @@
 
         AccumuloRyaQueryEngine queryEngine = dao.getQueryEngine();
 
-        Collection<RyaStatement> coll = new ArrayList();
+        Collection<RyaStatement> coll = new ArrayList<>();
         coll.add(new RyaStatement(null, loadPerc, uri1));
         coll.add(new RyaStatement(null, loadPerc, uri2));
         conf.setRegexPredicate(loadPerc.getData());
@@ -540,7 +537,7 @@
         AccumuloRdfConfiguration queryConf = new AccumuloRdfConfiguration(conf);
         queryConf.setMaxRangesForScanner(1);
 
-        Collection<RyaStatement> coll = new ArrayList();
+        Collection<RyaStatement> coll = new ArrayList<>();
         coll.add(new RyaStatement(null, loadPerc, uri1));
         coll.add(new RyaStatement(null, loadPerc, uri2));
         conf.setRegexPredicate(loadPerc.getData());
diff --git a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactoryTest.java b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactoryTest.java
index 3537f74..cf2ae4f 100644
--- a/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactoryTest.java
+++ b/dao/accumulo.rya/src/test/java/org/apache/rya/accumulo/DefineTripleQueryRangeFactoryTest.java
@@ -27,10 +27,10 @@
 //import org.apache.rya.accumulo.DefineTripleQueryRangeFactory;
 //import org.apache.rya.api.domain.RangeValue;
 //import org.apache.accumulo.core.data.Range;
-//import org.openrdf.model.URI;
-//import org.openrdf.model.Value;
-//import org.openrdf.model.ValueFactory;
-//import org.openrdf.model.impl.ValueFactoryImpl;
+//import org.eclipse.rdf4j.model.IRI;
+//import org.eclipse.rdf4j.model.Value;
+//import org.eclipse.rdf4j.model.ValueFactory;
+//import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
 //
 //import java.util.Map;
 //
@@ -50,9 +50,9 @@
 //    private AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
 //
 //    public void testSPOCases() throws Exception {
-//        URI cpu = vf.createURI(litdupsNS, "cpu");
-//        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-//        URI obj = vf.createURI(litdupsNS, "uri1");
+//        URI cpu = vf.createIRI(litdupsNS, "cpu");
+//        URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+//        URI obj = vf.createIRI(litdupsNS, "uri1");
 //
 //        //spo
 //        Map.Entry<TABLE_LAYOUT, Range> entry =
@@ -96,12 +96,12 @@
 //    }
 //
 //    public void testSPOCasesWithRanges() throws Exception {
-//        URI subj_start = vf.createURI(litdupsNS, "subj_start");
-//        URI subj_end = vf.createURI(litdupsNS, "subj_stop");
-//        URI pred_start = vf.createURI(litdupsNS, "pred_start");
-//        URI pred_end = vf.createURI(litdupsNS, "pred_stop");
-//        URI obj_start = vf.createURI(litdupsNS, "obj_start");
-//        URI obj_end = vf.createURI(litdupsNS, "obj_stop");
+//        URI subj_start = vf.createIRI(litdupsNS, "subj_start");
+//        URI subj_end = vf.createIRI(litdupsNS, "subj_stop");
+//        URI pred_start = vf.createIRI(litdupsNS, "pred_start");
+//        URI pred_end = vf.createIRI(litdupsNS, "pred_stop");
+//        URI obj_start = vf.createIRI(litdupsNS, "obj_start");
+//        URI obj_end = vf.createIRI(litdupsNS, "obj_stop");
 //
 //        Value subj = new RangeValue(subj_start, subj_end);
 //        Value pred = new RangeValue(pred_start, pred_end);
@@ -146,8 +146,8 @@
 //    }
 //
 //    public void testPOCases() throws Exception {
-//        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-//        URI obj = vf.createURI(litdupsNS, "uri1");
+//        URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+//        URI obj = vf.createIRI(litdupsNS, "uri1");
 //
 //        //po
 //        Map.Entry<TABLE_LAYOUT, Range> entry =
@@ -171,10 +171,10 @@
 //    }
 //
 //    public void testPOCasesWithRanges() throws Exception {
-//        URI pred_start = vf.createURI(litdupsNS, "pred_start");
-//        URI pred_end = vf.createURI(litdupsNS, "pred_stop");
-//        URI obj_start = vf.createURI(litdupsNS, "obj_start");
-//        URI obj_end = vf.createURI(litdupsNS, "obj_stop");
+//        URI pred_start = vf.createIRI(litdupsNS, "pred_start");
+//        URI pred_end = vf.createIRI(litdupsNS, "pred_stop");
+//        URI obj_start = vf.createIRI(litdupsNS, "obj_start");
+//        URI obj_end = vf.createIRI(litdupsNS, "obj_stop");
 //
 //        Value pred = new RangeValue(pred_start, pred_end);
 //        Value obj = new RangeValue(obj_start, obj_end);
@@ -204,8 +204,8 @@
 //    }
 //
 //    public void testOSPCases() throws Exception {
-//        URI cpu = vf.createURI(litdupsNS, "cpu");
-//        URI obj = vf.createURI(litdupsNS, "uri1");
+//        URI cpu = vf.createIRI(litdupsNS, "cpu");
+//        URI obj = vf.createIRI(litdupsNS, "uri1");
 //
 //        //so
 //        Map.Entry<TABLE_LAYOUT, Range> entry =
@@ -230,10 +230,10 @@
 //
 //
 //    public void testOSPCasesWithRanges() throws Exception {
-//        URI subj_start = vf.createURI(litdupsNS, "subj_start");
-//        URI subj_end = vf.createURI(litdupsNS, "subj_stop");
-//        URI obj_start = vf.createURI(litdupsNS, "obj_start");
-//        URI obj_end = vf.createURI(litdupsNS, "obj_stop");
+//        URI subj_start = vf.createIRI(litdupsNS, "subj_start");
+//        URI subj_end = vf.createIRI(litdupsNS, "subj_stop");
+//        URI obj_start = vf.createIRI(litdupsNS, "obj_start");
+//        URI obj_end = vf.createIRI(litdupsNS, "obj_stop");
 //
 //        Value subj = new RangeValue(subj_start, subj_end);
 //        Value obj = new RangeValue(obj_start, obj_end);
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBQueryEngine.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBQueryEngine.java
index 9ddb15a..d95f7d8 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBQueryEngine.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBQueryEngine.java
@@ -41,8 +41,9 @@
 import org.bson.Document;
 import org.calrissian.mango.collect.CloseableIterable;
 import org.calrissian.mango.collect.CloseableIterables;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashMultimap;
@@ -50,8 +51,6 @@
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Date: 7/17/12
  * Time: 9:28 AM
@@ -144,7 +143,7 @@
         }
 
         Iterator<RyaStatement> iterator = new RyaStatementCursorIterator(queryWithBindingSet(queries.entrySet(), getConf()));
-        return CloseableIterables.wrap((Iterable<RyaStatement>) () -> iterator);
+        return CloseableIterables.wrap(() -> iterator);
     }
 
     private MongoCollection<Document> getCollection(final StatefulMongoDBRdfConfiguration conf) {
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRdfConfiguration.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRdfConfiguration.java
index 44dc851..d49f2ee 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRdfConfiguration.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/MongoDBRdfConfiguration.java
@@ -27,7 +27,7 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.mongodb.aggregation.AggregationPipelineQueryOptimizer;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
 
 import edu.umd.cs.findbugs.annotations.Nullable;
 
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNode.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNode.java
index 45092e4..769d2de 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNode.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNode.java
@@ -54,22 +54,23 @@
 import org.apache.rya.mongodb.document.visibility.DocumentVisibilityAdapter;
 import org.bson.Document;
 import org.bson.conversions.Bson;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Compare;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Compare;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
@@ -83,8 +84,6 @@
 import com.mongodb.client.model.Filters;
 import com.mongodb.client.model.Projections;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Represents a portion of a query tree as MongoDB aggregation pipeline. Should
  * be built bottom-up: start with a statement pattern implemented as a $match
@@ -264,14 +263,14 @@
         if (subjVar != null && subjVar.getValue() instanceof Resource) {
             s = RdfToRyaConversions.convertResource((Resource) subjVar.getValue());
         }
-        if (predVar != null && predVar.getValue() instanceof URI) {
-            p = RdfToRyaConversions.convertURI((URI) predVar.getValue());
+        if (predVar != null && predVar.getValue() instanceof IRI) {
+            p = RdfToRyaConversions.convertURI((IRI) predVar.getValue());
         }
         if (objVar != null && objVar.getValue() != null) {
             o = RdfToRyaConversions.convertValue(objVar.getValue());
         }
-        if (contextVar != null && contextVar.getValue() instanceof URI) {
-            c = RdfToRyaConversions.convertURI((URI) contextVar.getValue());
+        if (contextVar != null && contextVar.getValue() instanceof IRI) {
+            c = RdfToRyaConversions.convertURI((IRI) contextVar.getValue());
         }
         RyaStatement rs = new RyaStatement(s, p, o, c);
         DBObject obj = strategy.getQuery(rs);
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryOptimizer.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryOptimizer.java
index fb1f558..afef7e0 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryOptimizer.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryOptimizer.java
@@ -21,10 +21,10 @@
 import org.apache.hadoop.conf.Configurable;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/PipelineResultIteration.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/PipelineResultIteration.java
index c533efc..fbbe6f0 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/PipelineResultIteration.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/PipelineResultIteration.java
@@ -21,28 +21,27 @@
 import java.util.Map;
 
 import org.bson.Document;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.base.Preconditions;
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.MongoCursor;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * An iterator that converts the documents resulting from an
  * {@link AggregationPipelineQueryNode} into {@link BindingSet}s.
  */
 public class PipelineResultIteration implements CloseableIteration<BindingSet, QueryEvaluationException> {
     private static final int BATCH_SIZE = 1000;
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private final MongoCursor<Document> cursor;
     private final Map<String, String> varToOriginalName;
@@ -114,10 +113,10 @@
                 String varName = varToOriginalName.getOrDefault(fieldName, fieldName);
                 Value varValue;
                 if (typeString == null || typeString.equals(XMLSchema.ANYURI.stringValue())) {
-                    varValue = VF.createURI(valueString);
+                    varValue = VF.createIRI(valueString);
                 }
                 else {
-                    varValue = VF.createLiteral(valueString, VF.createURI(typeString));
+                    varValue = VF.createLiteral(valueString, VF.createIRI(typeString));
                 }
                 Binding existingBinding = bindingSet.getBinding(varName);
                 // If this variable is not already bound, add it.
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitor.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitor.java
index b7f5a67..23797a8 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitor.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitor.java
@@ -20,17 +20,20 @@
 
 import java.util.Arrays;
 
+import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.bson.Document;
-import org.openrdf.query.algebra.Distinct;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.Reduced;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Distinct;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.Reduced;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.base.Preconditions;
 import com.mongodb.MongoClient;
@@ -73,7 +76,7 @@
  * {@code AggregationPipelineQueryNode}.
  * </ul>
  */
-public class SparqlToPipelineTransformVisitor extends QueryModelVisitorBase<Exception> {
+public class SparqlToPipelineTransformVisitor extends AbstractQueryModelVisitor<Exception> {
     private final MongoCollection<Document> inputCollection;
 
     /**
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBNamespaceManager.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBNamespaceManager.java
index 2be0785..758f334 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBNamespaceManager.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBNamespaceManager.java
@@ -26,15 +26,14 @@
 import org.apache.commons.codec.binary.Hex;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.model.Namespace;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Namespace;
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.DBCollection;
 import com.mongodb.DBCursor;
 import com.mongodb.DBObject;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class SimpleMongoDBNamespaceManager implements MongoDBNamespaceManager {
 
     public class NamespaceImplementation implements Namespace {
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
index ecad9c6..a868e3d 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/dao/SimpleMongoDBStorageStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.rya.mongodb.dao;
 
-import static org.openrdf.model.vocabulary.XMLSchema.ANYURI;
+import static org.eclipse.rdf4j.model.vocabulary.XMLSchema.ANYURI;
 
 import java.nio.charset.StandardCharsets;
 import java.security.MessageDigest;
@@ -36,8 +36,8 @@
 import org.apache.rya.mongodb.document.visibility.DocumentVisibility;
 import org.apache.rya.mongodb.document.visibility.DocumentVisibilityAdapter;
 import org.apache.rya.mongodb.document.visibility.DocumentVisibilityAdapter.MalformedDocumentVisibilityException;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.DBCollection;
@@ -72,7 +72,7 @@
         return DigestUtils.sha256Hex(value);
     }
 
-    protected ValueFactoryImpl factory = new ValueFactoryImpl();
+    protected SimpleValueFactory factory = SimpleValueFactory.getInstance();
 
     @Override
     public void createIndices(final DBCollection coll){
@@ -136,7 +136,7 @@
             objectRya = new RyaURI(object);
         }
         else {
-            objectRya = new RyaType(factory.createURI(objectType), object);
+            objectRya = new RyaType(factory.createIRI(objectType), object);
         }
 
         final RyaStatement statement;
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
index 727538b..462da1c 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementBindingSetCursorIterator.java
@@ -34,7 +34,8 @@
 import org.apache.rya.mongodb.dao.MongoDBStorageStrategy;
 import org.apache.rya.mongodb.document.operators.aggregation.AggregationUtil;
 import org.bson.Document;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Iterators;
@@ -44,8 +45,6 @@
 import com.mongodb.client.MongoCollection;
 import com.mongodb.util.JSON;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class RyaStatementBindingSetCursorIterator implements CloseableIteration<Entry<RyaStatement, BindingSet>, RyaDAOException> {
     private static final Logger log = Logger.getLogger(RyaStatementBindingSetCursorIterator.class);
 
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementCursorIterator.java b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementCursorIterator.java
index 82eed6f..97bbc8b 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementCursorIterator.java
+++ b/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/iter/RyaStatementCursorIterator.java
@@ -21,13 +21,11 @@
 import java.util.Iterator;
 import java.util.Map.Entry;
 
+import com.google.common.base.Throwables;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
-import org.openrdf.query.BindingSet;
-
-import com.google.common.base.Throwables;
-
-import info.aduna.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
 
 public class RyaStatementCursorIterator implements Iterator<RyaStatement>, CloseableIteration<RyaStatement, RyaDAOException> {
     private final CloseableIteration<? extends Entry<RyaStatement, BindingSet>, RyaDAOException> iterator;
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBQueryEngineIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBQueryEngineIT.java
index 3a216ec..4aef8cd 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBQueryEngineIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBQueryEngineIT.java
@@ -1,5 +1,5 @@
 /*
-* * Licensed to the Apache Software Foundation (ASF) under one
+ * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
  * regarding copyright ownership.  The ASF licenses this file
@@ -20,25 +20,6 @@
 
 import static org.junit.Assert.assertEquals;
 
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
 import java.util.Collection;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -47,18 +28,20 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
 import org.apache.rya.api.domain.RyaURI;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
 /**
  * Integration tests the methods of {@link MongoDBQueryEngine}.
  */
 public class MongoDBQueryEngineIT extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private RyaStatement getStatement(final String s, final String p, final String o) {
         final RyaStatementBuilder builder = new RyaStatementBuilder();
@@ -119,7 +102,7 @@
             final RyaStatement s1 = getStatement(null, null, "u:b");
 
             final MapBindingSet bs1 = new MapBindingSet();
-            bs1.addBinding("foo", new URIImpl("u:x"));
+            bs1.addBinding("foo", VF.createIRI("u:x"));
 
             final Map.Entry<RyaStatement, BindingSet> e1 = new RdfCloudTripleStoreUtils.CustomEntry<>(s1, bs1);
             final Collection<Entry<RyaStatement, BindingSet>> stmts1 = Lists.newArrayList(e1);
@@ -127,7 +110,7 @@
 
 
             final MapBindingSet bs2 = new MapBindingSet();
-            bs2.addBinding("foo", new URIImpl("u:y"));
+            bs2.addBinding("foo", VF.createIRI("u:y"));
 
             final RyaStatement s2 = getStatement(null, null, "u:c");
 
@@ -164,7 +147,7 @@
             final RyaStatement s = getStatement("u:a", null, null);
 
             final MapBindingSet bs1 = new MapBindingSet();
-            bs1.addBinding("foo", new URIImpl("u:x"));
+            bs1.addBinding("foo", VF.createIRI("u:x"));
 
             final Map.Entry<RyaStatement, BindingSet> e1 = new RdfCloudTripleStoreUtils.CustomEntry<>(s, bs1);
             final Collection<Entry<RyaStatement, BindingSet>> stmts1 = Lists.newArrayList(e1);
@@ -172,7 +155,7 @@
 
 
             final MapBindingSet bs2 = new MapBindingSet();
-            bs2.addBinding("foo", new URIImpl("u:y"));
+            bs2.addBinding("foo", VF.createIRI("u:y"));
 
             final Map.Entry<RyaStatement, BindingSet> e2 = new RdfCloudTripleStoreUtils.CustomEntry<>(s, bs2);
 
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/SimpleMongoDBStorageStrategyTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/SimpleMongoDBStorageStrategyTest.java
index 15bd636..9f61dfd 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/SimpleMongoDBStorageStrategyTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/SimpleMongoDBStorageStrategyTest.java
@@ -18,8 +18,8 @@
  * under the License.
  */
 
+import static org.eclipse.rdf4j.model.vocabulary.XMLSchema.ANYURI;
 import static org.junit.Assert.assertEquals;
-import static org.openrdf.model.vocabulary.XMLSchema.ANYURI;
 
 import java.io.IOException;
 
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNodeTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNodeTest.java
index 1e056c4..f33ca96 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNodeTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/AggregationPipelineQueryNodeTest.java
@@ -23,23 +23,23 @@
 import java.util.List;
 
 import org.bson.Document;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Compare;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.IsLiteral;
+import org.eclipse.rdf4j.query.algebra.Not;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Compare;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.IsLiteral;
-import org.openrdf.query.algebra.Not;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.HashBiMap;
 import com.google.common.collect.Sets;
@@ -47,13 +47,13 @@
 import com.mongodb.client.MongoCollection;
 
 public class AggregationPipelineQueryNodeTest {
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private static final String LUBM = "urn:lubm";
-    private static final URI UNDERGRAD = VF.createURI(LUBM, "UndergraduateStudent");
-    private static final URI TAKES = VF.createURI(LUBM, "takesCourse");
+    private static final IRI UNDERGRAD = VF.createIRI(LUBM, "UndergraduateStudent");
+    private static final IRI TAKES = VF.createIRI(LUBM, "takesCourse");
 
-    private static Var constant(URI value) {
+    private static Var constant(IRI value) {
         return new Var(value.stringValue(), value);
     }
 
@@ -137,7 +137,7 @@
         Assert.assertEquals(Sets.newHashSet("s", "p", "o"), node.getAssuredBindingNames());
         Assert.assertEquals(2, node.getPipeline().size());
         // All constants
-        sp = new StatementPattern(constant(VF.createURI("urn:Alice")), constant(RDF.TYPE), constant(UNDERGRAD));
+        sp = new StatementPattern(constant(VF.createIRI("urn:Alice")), constant(RDF.TYPE), constant(UNDERGRAD));
         node = new AggregationPipelineQueryNode(collection, sp);
         Assert.assertEquals(Sets.newHashSet(), node.getBindingNames());
         Assert.assertEquals(Sets.newHashSet(), node.getAssuredBindingNames());
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineQueryIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineQueryIT.java
index 0552ac0..8dbf4b5 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineQueryIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineQueryIT.java
@@ -32,41 +32,40 @@
 import org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy;
 import org.bson.Document;
 import org.bson.conversions.Bson;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.EmptyBindingSet;
+import org.eclipse.rdf4j.query.impl.ListBindingSet;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.EmptyBindingSet;
-import org.openrdf.query.impl.ListBindingSet;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.HashMultiset;
 import com.google.common.collect.Multiset;
 import com.mongodb.DBObject;
 import com.mongodb.util.JSON;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class PipelineQueryIT extends MongoITBase {
 
-    private static ValueFactory VF = ValueFactoryImpl.getInstance();
-    private static SPARQLParser PARSER = new SPARQLParser();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final SPARQLParser PARSER = new SPARQLParser();
 
     private MongoDBRyaDAO dao;
 
@@ -79,11 +78,11 @@
         dao.init();
     }
 
-    private void insert(Resource subject, URI predicate, Value object) throws RyaDAOException {
+    private void insert(Resource subject, IRI predicate, Value object) throws RyaDAOException {
         insert(subject, predicate, object, 0);
     }
 
-    private void insert(Resource subject, URI predicate, Value object, int derivationLevel) throws RyaDAOException {
+    private void insert(Resource subject, IRI predicate, Value object, int derivationLevel) throws RyaDAOException {
         final RyaStatementBuilder builder = new RyaStatementBuilder();
         builder.setSubject(RdfToRyaConversions.convertResource(subject));
         builder.setPredicate(RdfToRyaConversions.convertURI(predicate));
@@ -121,7 +120,7 @@
         insert(OWL.THING, RDF.TYPE, OWL.CLASS);
         insert(FOAF.PERSON, RDF.TYPE, OWL.CLASS, 1);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, OWL.THING);
-        insert(VF.createURI("urn:Alice"), RDF.TYPE, FOAF.PERSON);
+        insert(VF.createIRI("urn:Alice"), RDF.TYPE, FOAF.PERSON);
         dao.flush();
         // Define query and expected results
         final String query = "SELECT * WHERE {\n"
@@ -131,7 +130,7 @@
         Multiset<BindingSet> expectedSolutions = HashMultiset.create();
         expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, OWL.CLASS));
         expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, OWL.CLASS));
-        expectedSolutions.add(new ListBindingSet(varNames, VF.createURI("urn:Alice"), FOAF.PERSON));
+        expectedSolutions.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice"), FOAF.PERSON));
         // Execute pipeline and verify results
         testPipelineQuery(query, expectedSolutions);
     }
@@ -142,7 +141,7 @@
         insert(OWL.THING, RDF.TYPE, OWL.CLASS);
         insert(FOAF.PERSON, RDF.TYPE, OWL.CLASS, 1);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, OWL.THING);
-        insert(VF.createURI("urn:Alice"), RDF.TYPE, FOAF.PERSON);
+        insert(VF.createIRI("urn:Alice"), RDF.TYPE, FOAF.PERSON);
         dao.flush();
         // Define query and expected results
         final String query = "SELECT * WHERE {\n"
@@ -169,11 +168,11 @@
     @Test
     public void testJoinTwoSharedVariables() throws Exception {
         // Insert data
-        URI person = VF.createURI("urn:Person");
-        URI livingThing = VF.createURI("urn:LivingThing");
-        URI human = VF.createURI("urn:Human");
-        URI programmer = VF.createURI("urn:Programmer");
-        URI thing = VF.createURI("urn:Thing");
+        IRI person = VF.createIRI("urn:Person");
+        IRI livingThing = VF.createIRI("urn:LivingThing");
+        IRI human = VF.createIRI("urn:Human");
+        IRI programmer = VF.createIRI("urn:Programmer");
+        IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
@@ -201,12 +200,12 @@
     @Test
     public void testVariableRename() throws Exception {
         // Insert data
-        URI alice = VF.createURI("urn:Alice");
-        URI bob = VF.createURI("urn:Bob");
-        URI carol = VF.createURI("urn:Carol");
-        URI dan = VF.createURI("urn:Dan");
-        URI eve = VF.createURI("urn:Eve");
-        URI friend = VF.createURI("urn:friend");
+        IRI alice = VF.createIRI("urn:Alice");
+        IRI bob = VF.createIRI("urn:Bob");
+        IRI carol = VF.createIRI("urn:Carol");
+        IRI dan = VF.createIRI("urn:Dan");
+        IRI eve = VF.createIRI("urn:Eve");
+        IRI friend = VF.createIRI("urn:friend");
         insert(alice, friend, bob);
         insert(alice, friend, carol);
         insert(bob, friend, eve);
@@ -247,10 +246,10 @@
     @Test
     public void testFilterQuery() throws Exception {
         // Insert data
-        URI alice = VF.createURI("urn:Alice");
-        URI bob = VF.createURI("urn:Bob");
-        URI eve = VF.createURI("urn:Eve");
-        URI relatedTo = VF.createURI("urn:relatedTo");
+        IRI alice = VF.createIRI("urn:Alice");
+        IRI bob = VF.createIRI("urn:Bob");
+        IRI eve = VF.createIRI("urn:Eve");
+        IRI relatedTo = VF.createIRI("urn:relatedTo");
         insert(alice, FOAF.KNOWS, bob);
         insert(alice, FOAF.KNOWS, alice);
         insert(alice, FOAF.KNOWS, eve);
@@ -285,12 +284,12 @@
     @Test
     public void testMultiConstruct() throws Exception {
         // Insert data
-        URI alice = VF.createURI("urn:Alice");
-        URI bob = VF.createURI("urn:Bob");
-        URI eve = VF.createURI("urn:Eve");
-        URI friend = VF.createURI("urn:friend");
-        URI knows = VF.createURI("urn:knows");
-        URI person = VF.createURI("urn:Person");
+        IRI alice = VF.createIRI("urn:Alice");
+        IRI bob = VF.createIRI("urn:Bob");
+        IRI eve = VF.createIRI("urn:Eve");
+        IRI friend = VF.createIRI("urn:friend");
+        IRI knows = VF.createIRI("urn:knows");
+        IRI person = VF.createIRI("urn:Person");
         insert(alice, friend, bob);
         insert(bob, knows, eve);
         insert(eve, knows, alice);
@@ -311,12 +310,12 @@
 
     @Test
     public void testTriplePipeline() throws Exception {
-        URI alice = VF.createURI("urn:Alice");
-        URI bob = VF.createURI("urn:Bob");
-        URI eve = VF.createURI("urn:Eve");
-        URI friend = VF.createURI("urn:friend");
-        URI knows = VF.createURI("urn:knows");
-        URI year = VF.createURI("urn:year");
+        IRI alice = VF.createIRI("urn:Alice");
+        IRI bob = VF.createIRI("urn:Bob");
+        IRI eve = VF.createIRI("urn:Eve");
+        IRI friend = VF.createIRI("urn:friend");
+        IRI knows = VF.createIRI("urn:knows");
+        IRI year = VF.createIRI("urn:year");
         Literal yearLiteral = VF.createLiteral("2017", XMLSchema.GYEAR);
         final String query = "CONSTRUCT {\n"
                 + "    ?x <urn:knows> ?y .\n"
@@ -350,11 +349,11 @@
     @Test
     public void testRequiredDerivationLevel() throws Exception {
         // Insert data
-        URI person = VF.createURI("urn:Person");
-        URI livingThing = VF.createURI("urn:LivingThing");
-        URI human = VF.createURI("urn:Human");
-        URI programmer = VF.createURI("urn:Programmer");
-        URI thing = VF.createURI("urn:Thing");
+        IRI person = VF.createIRI("urn:Person");
+        IRI livingThing = VF.createIRI("urn:LivingThing");
+        IRI human = VF.createIRI("urn:Human");
+        IRI programmer = VF.createIRI("urn:Programmer");
+        IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
@@ -405,11 +404,11 @@
     @Test
     public void testRequiredTimestamp() throws Exception {
         // Insert data
-        URI person = VF.createURI("urn:Person");
-        URI livingThing = VF.createURI("urn:LivingThing");
-        URI human = VF.createURI("urn:Human");
-        URI programmer = VF.createURI("urn:Programmer");
-        URI thing = VF.createURI("urn:Thing");
+        IRI person = VF.createIRI("urn:Person");
+        IRI livingThing = VF.createIRI("urn:LivingThing");
+        IRI human = VF.createIRI("urn:Human");
+        IRI programmer = VF.createIRI("urn:Programmer");
+        IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON, 2);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineResultIterationTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineResultIterationTest.java
index 6775235..c71a183 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineResultIterationTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/PipelineResultIterationTest.java
@@ -23,24 +23,24 @@
 import java.util.Iterator;
 
 import org.bson.Document;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.ListBindingSet;
 import org.junit.Assert;
 import org.junit.Test;
 import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.ListBindingSet;
 
 import com.google.common.collect.Sets;
 import com.mongodb.client.AggregateIterable;
 import com.mongodb.client.MongoCursor;
 
 public class PipelineResultIterationTest {
-    ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @SuppressWarnings("unchecked")
     private AggregateIterable<Document> documentIterator(Document ... documents) {
@@ -107,7 +107,7 @@
     @Test
     public void testIterationGivenBindingSet() throws QueryEvaluationException {
         BindingSet solution = new ListBindingSet(Arrays.asList("b", "c"),
-                VF.createURI("urn:Bob"), VF.createURI("urn:Charlie"));
+                VF.createIRI("urn:Bob"), VF.createIRI("urn:Charlie"));
         HashMap<String, String> nameMap = new HashMap<>();
         nameMap.put("bName", "b");
         nameMap.put("cName", "c");
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitorTest.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitorTest.java
index 506b8af..715e6bd 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitorTest.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/aggregation/SparqlToPipelineTransformVisitorTest.java
@@ -22,28 +22,28 @@
 import java.util.List;
 
 import org.bson.Document;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Not;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Not;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 import com.mongodb.MongoNamespace;
@@ -51,16 +51,16 @@
 
 public class SparqlToPipelineTransformVisitorTest {
 
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private static final String LUBM = "urn:lubm";
-    private static final URI UNDERGRAD = VF.createURI(LUBM, "UndergraduateStudent");
-    private static final URI PROFESSOR = VF.createURI(LUBM, "Professor");
-    private static final URI COURSE = VF.createURI(LUBM, "Course");
-    private static final URI TAKES = VF.createURI(LUBM, "takesCourse");
-    private static final URI TEACHES = VF.createURI(LUBM, "teachesCourse");
+    private static final IRI UNDERGRAD = VF.createIRI(LUBM, "UndergraduateStudent");
+    private static final IRI PROFESSOR = VF.createIRI(LUBM, "Professor");
+    private static final IRI COURSE = VF.createIRI(LUBM, "Course");
+    private static final IRI TAKES = VF.createIRI(LUBM, "takesCourse");
+    private static final IRI TEACHES = VF.createIRI(LUBM, "teachesCourse");
 
-    private static Var constant(URI value) {
+    private static Var constant(IRI value) {
         return new Var(value.stringValue(), value);
     }
 
diff --git a/extras/indexing/pom.xml b/extras/indexing/pom.xml
index 7abc83c..357c552 100644
--- a/extras/indexing/pom.xml
+++ b/extras/indexing/pom.xml
@@ -57,7 +57,7 @@
         </dependency>
         <dependency>
             <groupId>org.apache.lucene</groupId>
-            <artifactId>lucene-analyzers</artifactId>
+            <artifactId>lucene-analyzers-common</artifactId>
         </dependency>
 
         <dependency>
@@ -84,10 +84,10 @@
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.periodic.notification.api</artifactId>
         </dependency>
-        <!-- OpenRDF -->
+        <!-- RDF4J -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryresultio-text</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryresultio-text</artifactId>
         </dependency>
 
         <!--  testing dependencies -->
diff --git a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/BindingSetHashJoinIterator.java b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/BindingSetHashJoinIterator.java
index 79036ff..200f845 100644
--- a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/BindingSetHashJoinIterator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/BindingSetHashJoinIterator.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -31,11 +29,12 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
@@ -74,9 +73,9 @@
 	 */
 	public enum HashJoinType {
 		CONSTANT_JOIN_VAR, VARIABLE_JOIN_VAR
-	};
+	}
 
-	public BindingSetHashJoinIterator(
+    public BindingSetHashJoinIterator(
 			Multimap<String, BindingSet> bindingJoinVarHash,
 			CloseableIteration<Map.Entry<String, BindingSet>, QueryEvaluationException> joinIter,
 			Set<String> unAssuredVariables, HashJoinType type) {
@@ -104,10 +103,8 @@
 
 			isEmpty = true;
 			return false;
-		} else if (isEmpty) {
-			return false;
 		} else {
-			return true;
+			return !isEmpty;
 		}
 	}
 
@@ -213,7 +210,7 @@
 	private BindingSet removeConstants(BindingSet bs) {
 		QueryBindingSet bSet = new QueryBindingSet();
 		for (String s : bs.getBindingNames()) {
-			if (!s.startsWith(ExternalTupleSet.CONST_PREFIX)) {
+			if (!VarNameUtils.isConstant(s)) {
 				bSet.addBinding(bs.getBinding(s));
 			}
 		}
@@ -291,10 +288,8 @@
 				}
 				isEmpty = true;
 				return false;
-			} else if (isEmpty) {
-				return false;
 			} else {
-				return true;
+				return !isEmpty;
 			}
 		}
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/IteratorCombiner.java b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/IteratorCombiner.java
index 0de0d10..27735de 100644
--- a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/IteratorCombiner.java
+++ b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/IteratorCombiner.java
@@ -19,14 +19,13 @@
  * under the License.
  */
 
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.google.common.base.Preconditions;
 
@@ -69,10 +68,8 @@
 			}
 			isEmpty = true;
 			return false;
-		} else if (isEmpty) {
-			return false;
 		} else {
-			return true;
+			return !isEmpty;
 		}
 	}
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToCrossProductBindingSetIterator.java b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToCrossProductBindingSetIterator.java
index 5fe72cd..5889ca1 100644
--- a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToCrossProductBindingSetIterator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToCrossProductBindingSetIterator.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -29,17 +27,18 @@
 import java.util.NoSuchElementException;
 import java.util.Set;
 
-import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
 import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.core.data.Key;
+import org.apache.rya.api.domain.VarNameUtils;
+import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.collect.HashBiMap;
 
@@ -128,10 +127,8 @@
 			}
 			isEmpty = true;
 			return false;
-		} else if (isEmpty) {
-			return false;
 		} else {
-			return true;
+			return !isEmpty;
 		}
 	}
 
@@ -187,7 +184,7 @@
 				throw new QueryEvaluationException("PCJ Variable has no mapping to query variable.");
 			}
 			if (constantConstraintsExist) {
-				if (mappedVar.startsWith(ExternalTupleSet.CONST_PREFIX)
+				if (VarNameUtils.isConstant(mappedVar)
 						&& constantConstraints.containsKey(mappedVar)
 						&& !constantConstraints.get(mappedVar).equals(
 								bindingSet.getValue(var))) {
@@ -195,7 +192,7 @@
 				}
 			}
 
-			if (!mappedVar.startsWith(ExternalTupleSet.CONST_PREFIX)) {
+			if (!VarNameUtils.isConstant(mappedVar)) {
 					bs.addBinding(mappedVar, bindingSet.getValue(var));
 			}
 		}
diff --git a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToJoinBindingSetIterator.java b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToJoinBindingSetIterator.java
index 0dcdfd5..bafdda4 100644
--- a/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToJoinBindingSetIterator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/accumulo/pcj/iterators/PCJKeyToJoinBindingSetIterator.java
@@ -19,27 +19,26 @@
  * under the License.
  */
 
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NoSuchElementException;
 
-import org.apache.rya.api.RdfCloudTripleStoreUtils;
-import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
 import org.apache.accumulo.core.client.BatchScanner;
 import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.core.data.Key;
+import org.apache.rya.api.RdfCloudTripleStoreUtils;
+import org.apache.rya.api.domain.VarNameUtils;
+import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashBiMap;
@@ -121,10 +120,8 @@
 			}
 			isEmpty = true;
 			return false;
-		} else if (isEmpty) {
-			return false;
 		} else {
-			return true;
+			return !isEmpty;
 		}
 	}
 
@@ -173,7 +170,7 @@
 		QueryBindingSet bs = new QueryBindingSet();
 		for (String var : bindingSet.getBindingNames()) {
 			String mappedVar = pcjVarMap.get(var);
-			if (mappedVar.startsWith(ExternalTupleSet.CONST_PREFIX)
+			if (VarNameUtils.isConstant(mappedVar)
 					&& constantConstraints.containsKey(mappedVar)
 					&& !constantConstraints.get(mappedVar).equals(
 							bindingSet.getValue(var))) {
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
index f6002b6..c78bbb2 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJ.java
@@ -52,19 +52,18 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Uses an in memory Rya Client to batch update a PCJ index.
  */
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
index 9ac7c2a..243aea6 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJ.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -46,10 +46,10 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -160,7 +160,7 @@
                 new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
-                fluoAppName);) {
+                fluoAppName)) {
             // Initialize the PCJ within the Fluo application.
             final CreateFluoPcj fluoCreatePcj = new CreateFluoPcj();
             fluoCreatePcj.withRyaIntegration(pcjId, sparql, strategies, fluoClient, getConnector(), ryaInstance);
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
index 3ecb93e..a80bf2f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloCreatePeriodicPCJ.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -45,10 +45,10 @@
 import org.apache.rya.periodic.notification.notification.CommandNotification;
 import org.apache.rya.periodic.notification.registration.KafkaNotificationRegistrationClient;
 import org.apache.rya.periodic.notification.serialization.CommandNotificationSerializer;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 
@@ -125,7 +125,7 @@
                 new String(cd.getUserPass()),
                 cd.getInstanceName(),
                 cd.getZookeepers(),
-                fluoAppName);) {
+                fluoAppName)) {
             // Initialize the PCJ within the Fluo application.
             final CreatePeriodicQuery periodicPcj = new CreatePeriodicQuery(fluoClient, periodicStorage);
             PeriodicNotificationClient periodicClient = new KafkaNotificationRegistrationClient(periodicTopic, createProducer(bootStrapServers));
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
index d287af4..e8016cf 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloDeletePeriodicPCJ.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -43,7 +43,7 @@
 import org.apache.rya.periodic.notification.notification.CommandNotification;
 import org.apache.rya.periodic.notification.registration.KafkaNotificationRegistrationClient;
 import org.apache.rya.periodic.notification.serialization.CommandNotificationSerializer;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
index e9e2cbe..b97ae8a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloExecuteSparqlQuery.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -34,16 +34,16 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
index e5a8f50..7db7562 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloInstall.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -20,8 +20,6 @@
 
 import static java.util.Objects.requireNonNull;
 
-import java.util.Date;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
@@ -47,8 +45,8 @@
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinUpdaterType;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 
@@ -164,9 +162,9 @@
 
                 // Statistics values.
                 .setProspectorDetails(
-                        new ProspectorDetails(Optional.<Date>absent()) )
+                        new ProspectorDetails(Optional.absent()) )
                 .setJoinSelectivityDetails(
-                        new JoinSelectivityDetails(Optional.<Date>absent()) )
+                        new JoinSelectivityDetails(Optional.absent()) )
                 .build();
 
         // Initialize the table.
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatements.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatements.java
index 9556bcf..6635b8b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatements.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatements.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -32,12 +32,12 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.Statement;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
index 182432a..61e5717 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFile.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -35,14 +35,14 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.rio.UnsupportedRDFormatException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.rio.UnsupportedRDFormatException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJ.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJ.java
index 3fe99ef..115d3f8 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJ.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJ.java
@@ -51,19 +51,19 @@
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandlerBase;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.AbstractTupleQueryResultHandler;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -161,7 +161,7 @@
 
             // Execute the query.
             final List<VisibilityBindingSet> batch = new ArrayList<>(1000);
-            tupleQuery.evaluate(new TupleQueryResultHandlerBase() {
+            tupleQuery.evaluate(new AbstractTupleQueryResultHandler() {
                 @Override
                 public void handleSolution(final BindingSet bindingSet) throws TupleQueryResultHandlerException {
                     final VisibilityBindingSet result = new VisibilityBindingSet(bindingSet, "");
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQuery.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQuery.java
index 7ce396e..b0a31e2 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQuery.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQuery.java
@@ -32,16 +32,16 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
index 264dd78..359341d 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoInstall.java
@@ -43,8 +43,8 @@
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
index 8c9e0b5..8204f14 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatements.java
@@ -30,12 +30,12 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.Statement;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
index 244d02a..4dd79fa 100644
--- a/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
+++ b/extras/indexing/src/main/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFile.java
@@ -33,13 +33,13 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/DocIdIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/DocIdIndexer.java
index 42064f7..9f6eb78 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/DocIdIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/DocIdIndexer.java
@@ -19,29 +19,26 @@
  * under the License.
  */
 
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.Collection;
 
-import org.apache.rya.indexing.accumulo.entity.StarQuery;
-
 import org.apache.accumulo.core.client.TableNotFoundException;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
+import org.apache.rya.indexing.accumulo.entity.StarQuery;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 public interface DocIdIndexer extends Closeable {
 
   
 
-    public abstract CloseableIteration<BindingSet, QueryEvaluationException> queryDocIndex(StarQuery query,
+    public CloseableIteration<BindingSet, QueryEvaluationException> queryDocIndex(StarQuery query,
             Collection<BindingSet> constraints) throws TableNotFoundException, QueryEvaluationException;
 
    
 
     @Override
-    public abstract void close() throws IOException;
+    public void close() throws IOException;
     
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/FilterFunctionOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/FilterFunctionOptimizer.java
index 6c4e05b..d5653a0 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/FilterFunctionOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/FilterFunctionOptimizer.java
@@ -19,10 +19,10 @@
  * under the License.
  */
 
-
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
 
@@ -42,33 +42,32 @@
 import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
 import org.apache.rya.mongodb.MongoSecondaryIndex;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.And;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.And;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Lists;
 
 public class FilterFunctionOptimizer implements QueryOptimizer, Configurable {
     private static final Logger LOG = Logger.getLogger(FilterFunctionOptimizer.class);
-    private final ValueFactory valueFactory = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private Configuration conf;
     private FreeTextIndexer freeTextIndexer;
@@ -157,18 +156,18 @@
         tupleExpr.visit(fVisitor);
         final List<IndexingExpr> results = Lists.newArrayList();
         for(int i = 0; i < fVisitor.func.size(); i++){
-            results.add(new IndexingExpr(fVisitor.func.get(i), matchStatement, fVisitor.args.get(i)));
+            results.add(new IndexingExpr(fVisitor.func.get(i), matchStatement, Arrays.stream(fVisitor.args.get(i)).toArray()));
         }
         removeMatchedPattern(tupleExpr, matchStatement, new IndexerExprReplacer(results));
     }
 
     //find vars contained in filters
-    private static class SearchVarVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class SearchVarVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final Collection<Var> searchProperties = new ArrayList<>();
 
         @Override
         public void meet(final FunctionCall fn) {
-            final URI fun = new URIImpl(fn.getURI());
+            final IRI fun = VF.createIRI(fn.getURI());
             final Var result = IndexingFunctionRegistry.getResultVarFromFunctionCall(fun, fn.getArgs());
             if (result != null && !searchProperties.contains(result)) {
                 searchProperties.add(result);
@@ -177,7 +176,7 @@
     }
 
     //find StatementPatterns containing filter variables
-    private static class MatchStatementVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class MatchStatementVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final Collection<Var> propertyVars;
         private final Collection<Var> usedVars = new ArrayList<>();
         private final List<StatementPattern> matchStatements = new ArrayList<>();
@@ -199,16 +198,16 @@
         }
     }
 
-    private abstract class AbstractEnhanceVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private abstract class AbstractEnhanceVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         final String matchVar;
-        List<URI> func = Lists.newArrayList();
+        List<IRI> func = Lists.newArrayList();
         List<Value[]> args = Lists.newArrayList();
 
         public AbstractEnhanceVisitor(final String matchVar) {
             this.matchVar = matchVar;
         }
 
-        protected void addFilter(final URI uri, final Value[] values) {
+        protected void addFilter(final IRI uri, final Value[] values) {
             func.add(uri);
             args.add(values);
         }
@@ -223,12 +222,12 @@
 
         @Override
         public void meet(final FunctionCall call) {
-            final URI fnUri = valueFactory.createURI(call.getURI());
+            final IRI fnUri = VF.createIRI(call.getURI());
             final Var resultVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(fnUri, call.getArgs());
             if (resultVar != null && resultVar.getName().equals(matchVar)) {
-                addFilter(valueFactory.createURI(call.getURI()), extractArguments(matchVar, call));
+                addFilter(VF.createIRI(call.getURI()), extractArguments(matchVar, call));
                 if (call.getParentNode() instanceof Filter || call.getParentNode() instanceof And || call.getParentNode() instanceof LeftJoin) {
-                    call.replaceWith(new ValueConstant(valueFactory.createLiteral(true)));
+                    call.replaceWith(new ValueConstant(VF.createLiteral(true)));
                 } else {
                     throw new IllegalArgumentException("Query error: Found " + call + " as part of an expression that is too complex");
                 }
@@ -292,7 +291,7 @@
 
         public IndexerExprReplacer(final List<IndexingExpr> indxExpr) {
             this.indxExpr = indxExpr;
-            final URI func = indxExpr.get(0).getFunction();
+            final IRI func = indxExpr.get(0).getFunction();
             type = IndexingFunctionRegistry.getFunctionType(func);
         }
 
@@ -317,7 +316,7 @@
         }
     }
 
-    private static class VarExchangeVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class VarExchangeVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final  StatementPattern exchangeVar;
         public VarExchangeVisitor(final StatementPattern sp) {
             exchangeVar = sp;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/FreeTextIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/FreeTextIndexer.java
index 4dbbde7..7745b01 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/FreeTextIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/FreeTextIndexer.java
@@ -1,10 +1,3 @@
-package org.apache.rya.indexing;
-
-import java.io.IOException;
-
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -23,11 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing;
 
+import java.io.IOException;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 /**
  * A repository to store, index, and retrieve {@link Statement}s based on freetext features.
@@ -44,5 +40,5 @@
 	 * @return the set of statements that meet the query and other constraints.
 	 * @throws IOException
 	 */
-	public abstract CloseableIteration<Statement, QueryEvaluationException> queryText(String query, StatementConstraints contraints) throws IOException;
+    public CloseableIteration<Statement, QueryEvaluationException> queryText(String query, StatementConstraints contraints) throws IOException;
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/GeoConstants.java b/extras/indexing/src/main/java/org/apache/rya/indexing/GeoConstants.java
index 2cb8217..fc3402a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/GeoConstants.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/GeoConstants.java
@@ -19,29 +19,32 @@
  * under the License.
  */
 
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * A set of URIs used in GeoSPARQL
  */
 public class GeoConstants {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     public static final String NS_GEO = "http://www.opengis.net/ont/geosparql#";
     public static final String NS_GEOF = "http://www.opengis.net/def/function/geosparql/";
 
-    public static final URI XMLSCHEMA_OGC_WKT = new URIImpl(NS_GEO + "wktLiteral");
-    public static final URI GEO_AS_WKT = new URIImpl(NS_GEO + "asWKT");
+    public static final IRI XMLSCHEMA_OGC_WKT = VF.createIRI(NS_GEO + "wktLiteral");
+    public static final IRI GEO_AS_WKT = VF.createIRI(NS_GEO + "asWKT");
 
-    public static final URI XMLSCHEMA_OGC_GML = new URIImpl(NS_GEO + "gmlLiteral");
-    public static final URI GEO_AS_GML = new URIImpl(NS_GEO + "asGML");
+    public static final IRI XMLSCHEMA_OGC_GML = VF.createIRI(NS_GEO + "gmlLiteral");
+    public static final IRI GEO_AS_GML = VF.createIRI(NS_GEO + "asGML");
 
-    public static final URI GEO_SF_EQUALS = new URIImpl(NS_GEOF + "sfEquals");
-    public static final URI GEO_SF_DISJOINT = new URIImpl(NS_GEOF + "sfDisjoint");
-    public static final URI GEO_SF_INTERSECTS = new URIImpl(NS_GEOF + "sfIntersects");
-    public static final URI GEO_SF_TOUCHES = new URIImpl(NS_GEOF + "sfTouches");
-    public static final URI GEO_SF_CROSSES = new URIImpl(NS_GEOF + "sfCrosses");
-    public static final URI GEO_SF_WITHIN = new URIImpl(NS_GEOF + "sfWithin");
-    public static final URI GEO_SF_CONTAINS = new URIImpl(NS_GEOF + "sfContains");
-    public static final URI GEO_SF_OVERLAPS = new URIImpl(NS_GEOF + "sfOverlaps");
-    public static final URI GEO_SF_NEAR = new URIImpl(NS_GEOF + "sfNear");
+    public static final IRI GEO_SF_EQUALS = VF.createIRI(NS_GEOF + "sfEquals");
+    public static final IRI GEO_SF_DISJOINT = VF.createIRI(NS_GEOF + "sfDisjoint");
+    public static final IRI GEO_SF_INTERSECTS = VF.createIRI(NS_GEOF + "sfIntersects");
+    public static final IRI GEO_SF_TOUCHES = VF.createIRI(NS_GEOF + "sfTouches");
+    public static final IRI GEO_SF_CROSSES = VF.createIRI(NS_GEOF + "sfCrosses");
+    public static final IRI GEO_SF_WITHIN = VF.createIRI(NS_GEOF + "sfWithin");
+    public static final IRI GEO_SF_CONTAINS = VF.createIRI(NS_GEOF + "sfContains");
+    public static final IRI GEO_SF_OVERLAPS = VF.createIRI(NS_GEOF + "sfOverlaps");
+    public static final IRI GEO_SF_NEAR = VF.createIRI(NS_GEOF + "sfNear");
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java
index 1acbe2f..d014ca8 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ExternalIndexMatcher.java
@@ -19,10 +19,9 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public interface ExternalIndexMatcher {
     
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java
index 9cda09e..121aa79 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessor.java
@@ -19,10 +19,6 @@
  * under the License.
  */
 
-
-
-
-
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -30,17 +26,16 @@
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer.VarCollector;
-
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -186,7 +181,7 @@
 
     // moves StatementPatterns in query that also occur in index to bottom of
     // query tree.
-    private static class SPBubbleDownVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class SPBubbleDownVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private TupleExpr tuple;
         private QueryModelNode indexQNode;
@@ -266,7 +261,7 @@
     // element in the query tree that occurs in compSet with replacement and
     // returns
     // the element that was replaced.
-    private static class QNodeExchanger extends QueryModelVisitorBase<RuntimeException> {
+    private static class QNodeExchanger extends AbstractQueryModelVisitor<RuntimeException> {
 
         private QueryModelNode toBeReplaced;
         private QueryModelNode replacement;
@@ -308,7 +303,7 @@
     // SPBubbleDownVisitor has been called to position index StatementPatterns
     // within query tree.
     //could lead to problems if filter optimizer called before external processor
-    private static class FilterBubbleDownVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class FilterBubbleDownVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private QueryModelNode filter;
         private Set<QueryModelNode> compSet;
@@ -380,7 +375,7 @@
 
     // visitor which determines whether or not to reposition a filter by calling
     // FilterBubbleDownVisitor
-    private static class FilterBubbleManager extends QueryModelVisitorBase<RuntimeException> {
+    private static class FilterBubbleManager extends AbstractQueryModelVisitor<RuntimeException> {
 
         private TupleExpr tuple;
         private QueryModelNode indexQNode;
@@ -436,7 +431,7 @@
     // calling this method is that both SPBubbleDownVisitor and
     // FilterBubbleManager have been called
     // to position the StatementPatterns and Filters.
-    private static class SubsetEqualsVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class SubsetEqualsVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private TupleExpr tuple;
         private QueryModelNode indexQNode;
@@ -524,7 +519,7 @@
     // visitor which determines whether a query is valid (i.e. it does not
     // contain nodes other than
     // Projection, Join, Filter, StatementPattern )
-    private static class ValidQueryVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class ValidQueryVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private boolean isValid = true;
 
@@ -561,7 +556,7 @@
     }
 
     // repositions ExternalTuples above StatementPatterns within query tree
-    private static class ExtTupleExchangeVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class ExtTupleExchangeVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<QueryModelNode> extTuples;
 
@@ -597,7 +592,7 @@
 
     }
 
-    private static class ExternalTupleCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class ExternalTupleCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<QueryModelNode> eSet = new HashSet<QueryModelNode>();
 
@@ -615,7 +610,7 @@
 
     }
 
-    private static class FilterCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class FilterCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private List<QueryModelNode> filterList = Lists.newArrayList();
 
@@ -644,7 +639,7 @@
     }
 
     // repositions ExternalTuples above StatementPatterns within query tree
-    private static class BindingSetAssignmentExchangeVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class BindingSetAssignmentExchangeVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<QueryModelNode> bsas;
 
@@ -672,7 +667,7 @@
     }
 
 
-    public static class BindingSetAssignmentCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class BindingSetAssignmentCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<QueryModelNode> bindingSetList = Sets.newHashSet();
 
@@ -694,7 +689,7 @@
 
 
 
-    public static class QueryNodeCount extends QueryModelVisitorBase<RuntimeException> {
+    public static class QueryNodeCount extends AbstractQueryModelVisitor<RuntimeException> {
 
         private int nodeCount;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidator.java
index a5b4af2..f424f73 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidator.java
@@ -19,20 +19,18 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Sets;
 
@@ -106,10 +104,8 @@
                     }
                     isEmpty = true;
                     return false;
-                } else if(isEmpty) {
-                    return false;
-                }else {
-                    return true;
+                } else {
+                    return !isEmpty;
                 }
             }
 
@@ -150,17 +146,10 @@
         //System.out.println("Left binding names are " + leftBindingNames + " and right binding names are " + rightBindingNames);
         
         if (Sets.intersection(leftBindingNames, rightBindingNames).size() == 0) {
-            if (omitCrossProd) {
-                return false;
-            } else {
-                return true;
-            }
-
+            return !omitCrossProd;
         } else {
             if (join.getRightArg() instanceof ExternalTupleSet) {
-
                 return ((ExternalTupleSet) join.getRightArg()).supportsBindingSet(leftBindingNames);
-
             } else {
                 return true;
             }
@@ -168,7 +157,7 @@
 
     }
 
-    public class TupleValidateVisitor extends QueryModelVisitorBase<RuntimeException> {
+    public class TupleValidateVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private boolean isValid = true;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java
index 2e00cf5..fd4faab 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexTupleGenerator.java
@@ -19,10 +19,9 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public interface IndexTupleGenerator {
     
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
index 5683de5..34aa6ae 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGenerator.java
@@ -19,15 +19,14 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.collect.Lists;
 
@@ -70,10 +69,8 @@
                     }
                     isEmpty = true;
                     return false;
-                } else if(isEmpty) {
-                    return false;
                 } else {
-                    return true;
+                    return !isEmpty;
                 }
             }
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedQueryPlanSelector.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedQueryPlanSelector.java
index 1138fa7..974f616 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedQueryPlanSelector.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/IndexedQueryPlanSelector.java
@@ -19,14 +19,13 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public interface IndexedQueryPlanSelector {
     
-    public TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tupleList, double threshhold, 
+    TupleExpr getThreshholdQueryPlan(Iterator<TupleExpr> tupleList, double threshhold,
             double indexWeight, double commonVarWeight, double dirProdWeight);
 
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelector.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelector.java
index a260226..96f822f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelector.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelector.java
@@ -19,20 +19,19 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 import java.util.Set;
 
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Sets;
 
@@ -111,9 +110,9 @@
         double dirProductScale;
         
         if(queryNodeCount > nodeCount) {
-            dirProductScale = 1/((double)(queryNodeCount - nodeCount));
+            dirProductScale = 1/ (queryNodeCount - nodeCount);
         } else {
-            dirProductScale = 1/((double)(queryNodeCount - nodeCount + 1));
+            dirProductScale = 1/ (queryNodeCount - nodeCount + 1);
         }
         
         double joinVarRatio;
@@ -143,7 +142,7 @@
         return cost;
     }
 
-    public static class QueryNodeCount extends QueryModelVisitorBase<RuntimeException> {
+    public static class QueryNodeCount extends AbstractQueryModelVisitor<RuntimeException> {
 
         private int nodeCount = 0;
         private int commonJoinVars = 0;
@@ -210,13 +209,13 @@
             Set<String> rNames = node.getRightArg().getAssuredBindingNames();
             
             for(String s: node.getLeftArg().getBindingNames()) {
-                if(s.startsWith("-const-")) {
+                if (VarNameUtils.isConstant(s)) {
                     lNames.remove(s);
                 }
             }
             
             for(String s: node.getRightArg().getBindingNames()) {
-                if(s.startsWith("-const-")) {
+                if (VarNameUtils.isConstant(s)) {
                     rNames.remove(s);
                 }
             }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGenerator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGenerator.java
index a76e30d..78b1f92 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGenerator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGenerator.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
@@ -27,14 +26,14 @@
 import java.util.Set;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
@@ -77,10 +76,8 @@
                         isEmpty = true;
                         return false;
                     }
-                } else if (isEmpty) {
-                    return false;
                 } else {
-                    return true;
+                    return !isEmpty;
                 }
             }
 
@@ -167,7 +164,7 @@
 
     }
 
-    public static class NodeCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class NodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final Set<QueryModelNode> nodeSet = Sets.newHashSet();
         private final List<Filter> filterSet = Lists.newArrayList();
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArranger.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArranger.java
index 773481a..f4cbc9c 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArranger.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArranger.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -28,21 +27,21 @@
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Collections2;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 
-
-//A given TupleExpr can be broken up into "join segments", which are sections of the TupleExpr where nodes can
-//be freely exchanged.  This class creates a list of permuted TupleExpr from a specified TupleExpr by permuting the nodes
-//in each join segment.
+/**
+ * A given TupleExpr can be broken up into "join segments", which are sections of the TupleExpr where nodes can
+ * be freely exchanged.  This class creates a list of permuted TupleExpr from a specified TupleExpr by permuting the nodes
+ * in each join segment.
+ */
 public class TupleReArranger {
 
     private static Map<Join, List<List<TupleExpr>>> joinArgs;
@@ -81,10 +80,8 @@
                         isEmpty = true;
                         return false;
                     }
-                } else if (isEmpty) {
-                    return false;
                 } else {
-                    return true;
+                    return !isEmpty;
                 }
             }
 
@@ -186,7 +183,7 @@
    //creates a map which associates each first join of a TupleExpr join segment with all permutations of
     //the non-join nodes after it.  More specifically, each join is associated with a list of TupleExpr
     //lists, where each list represents an ordering of the non-join nodes following the associated join
-    private static class NodeCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class NodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private static List<Filter> filterList;
 
@@ -241,7 +238,7 @@
 
     //for a given reOrder map, searches through TupleExpr and places each reordered collection
     //of nodes at appropriate join
-    private static class PermInserter extends QueryModelVisitorBase<RuntimeException> {
+    private static class PermInserter extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Map<Join, List<TupleExpr>> reOrderMap = Maps.newHashMap();
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleValidator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleValidator.java
index 699b438..c8fdabc 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleValidator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/TupleValidator.java
@@ -19,10 +19,9 @@
  * under the License.
  */
 
-
 import java.util.Iterator;
 
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public interface TupleValidator {
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java
index 3aac2f7..92a4678 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGenerator.java
@@ -26,11 +26,11 @@
 import java.util.Set;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
@@ -86,10 +86,8 @@
 
 					}
 
-				} else if (isEmpty) {
-					return false;
 				} else {
-					return true;
+					return !isEmpty;
 				}
 			}
 
@@ -153,10 +151,8 @@
 					isEmpty = true;
 					return false;
 
-				} else if (isEmpty) {
-					return false;
 				} else {
-					return true;
+					return !isEmpty;
 				}
 			}
 
@@ -228,10 +224,8 @@
 						return true;
 
 					}
-				} else if (isEmpty) {
-					return false;
 				} else {
-					return true;
+					return !isEmpty;
 				}
 			}
 
@@ -304,10 +298,8 @@
 						}
 
 					}
-				} else if (isEmpty) {
-					return false;
 				} else {
-					return true;
+					return !isEmpty;
 				}
 
 			}
@@ -432,7 +424,7 @@
 	}
 
 	private static class SpFilterCollector extends
-			QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
 		private Set<QueryModelNode> spFilterSet = Sets.newHashSet();
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java
index 67cf7d6..c970b0e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPruner.java
@@ -19,20 +19,18 @@
  * under the License.
  */
 
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -96,7 +94,7 @@
     }
 
 
-    private static class ConstantCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class ConstantCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Map<String, Integer> constantMap = Maps.newHashMap();
         private int spCount = 0;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingExpr.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingExpr.java
index f919b18..71beea8 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingExpr.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingExpr.java
@@ -19,29 +19,27 @@
  * under the License.
  */
 
-
 import java.util.Set;
 
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
 public class IndexingExpr {
 
-    private final URI function;
+    private final IRI function;
     private final Object[] arguments;
     private final StatementPattern spConstraint;
 
-    public IndexingExpr(URI function, StatementPattern spConstraint, Object... arguments) {
+    public IndexingExpr(IRI function, StatementPattern spConstraint, Object... arguments) {
         this.function = function;
         this.arguments = arguments;
         this.spConstraint = spConstraint;
     }
 
-    public URI getFunction() {
+    public IRI getFunction() {
         return function;
     }
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingFunctionRegistry.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingFunctionRegistry.java
index 37f7116..9722fd9 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingFunctionRegistry.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IndexingFunctionRegistry.java
@@ -19,39 +19,38 @@
  * under the License.
  */
 
-
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.Maps;
 
 public class IndexingFunctionRegistry {
-
-    
-    private static final Map<URI, FUNCTION_TYPE> SEARCH_FUNCTIONS = Maps.newHashMap();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final Map<IRI, FUNCTION_TYPE> SEARCH_FUNCTIONS = Maps.newHashMap();
     
     static {
         
         String TEMPORAL_NS = "tag:rya-rdf.org,2015:temporal#";         
 
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"after"),FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"before"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"equals"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"beforeInterval"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"afterInterval"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"insideInterval"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"hasBeginningInterval"), FUNCTION_TYPE.TEMPORAL);
-        SEARCH_FUNCTIONS.put(new URIImpl(TEMPORAL_NS+"hasEndInterval"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"after"),FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"before"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"equals"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"beforeInterval"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"afterInterval"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"insideInterval"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"hasBeginningInterval"), FUNCTION_TYPE.TEMPORAL);
+        SEARCH_FUNCTIONS.put(VF.createIRI(TEMPORAL_NS+"hasEndInterval"), FUNCTION_TYPE.TEMPORAL);
         
         
-        SEARCH_FUNCTIONS.put(new URIImpl("http://rdf.useekm.com/fts#text"), FUNCTION_TYPE.FREETEXT);
+        SEARCH_FUNCTIONS.put(VF.createIRI("http://rdf.useekm.com/fts#text"), FUNCTION_TYPE.FREETEXT);
 
         SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_EQUALS, FUNCTION_TYPE.GEO);
         SEARCH_FUNCTIONS.put(GeoConstants.GEO_SF_DISJOINT, FUNCTION_TYPE.GEO);
@@ -65,15 +64,14 @@
 
     }
     
-    public enum FUNCTION_TYPE {GEO, TEMPORAL, FREETEXT};
-    
-    
-    public static Set<URI> getFunctions() {
+    public enum FUNCTION_TYPE {GEO, TEMPORAL, FREETEXT}
+
+    public static Set<IRI> getFunctions() {
         return SEARCH_FUNCTIONS.keySet();
     }
     
     
-    public static Var getResultVarFromFunctionCall(URI function, List<ValueExpr> args) {
+    public static Var getResultVarFromFunctionCall(IRI function, List<ValueExpr> args) {
         
         FUNCTION_TYPE type = SEARCH_FUNCTIONS.get(function);
         
@@ -91,7 +89,7 @@
     }
     
     
-    public static FUNCTION_TYPE getFunctionType(URI func) {
+    public static FUNCTION_TYPE getFunctionType(IRI func) {
         return SEARCH_FUNCTIONS.get(func);
     }
     
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/IteratorFactory.java b/extras/indexing/src/main/java/org/apache/rya/indexing/IteratorFactory.java
index 50b8746..73978cc 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/IteratorFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/IteratorFactory.java
@@ -19,24 +19,22 @@
  * under the License.
  */
 
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.NoSuchElementException;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 
 //Given StatementPattern constraint and SearchFunction associated with an Indexing Node,
@@ -87,12 +85,12 @@
                 // get the predicate constraint
                 if (match.getPredicateVar().isConstant()) {
                     // get the predicate binding from the filter/statement pair
-                    Set<URI> predicates = new HashSet<URI>(getPredicateRestrictions(match.getPredicateVar()));
+                    Set<IRI> predicates = new HashSet<IRI>(getPredicateRestrictions(match.getPredicateVar()));
                     contraints.setPredicates(predicates);
                 } else if (bindings.hasBinding(predicateBinding)) {
                     // get the predicate binding from the passed in bindings (eg from other statements/parts of the tree)
-                    URI predicateUri = (URI) bindings.getValue(predicateBinding);
-                    Set<URI> predicates = Collections.singleton(predicateUri);
+                    IRI predicateUri = (IRI) bindings.getValue(predicateBinding);
+                    Set<IRI> predicates = Collections.singleton(predicateUri);
                     contraints.setPredicates(predicates);
                 }
 
@@ -151,9 +149,9 @@
 
     }
    
-    public static Collection<URI> getPredicateRestrictions(Var predicate) {
+    public static Collection<IRI> getPredicateRestrictions(Var predicate) {
         if (predicate.hasValue())
-            return Collections.singleton((URI) predicate.getValue());
+            return Collections.singleton((IRI) predicate.getValue());
         return Collections.emptyList();
     }
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/KeyParts.java b/extras/indexing/src/main/java/org/apache/rya/indexing/KeyParts.java
index 11ff8c0..ac777aa 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/KeyParts.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/KeyParts.java
@@ -26,12 +26,11 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.commons.codec.binary.StringUtils;
 import org.apache.hadoop.io.Text;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * Store and format the various temporal index keys.
@@ -52,6 +51,8 @@
  *
  */
 public class KeyParts implements Iterable<KeyParts> {
+        private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     	private static final String CQ_S_P_AT = "spo";
     	private static final String CQ_P_AT = "po";
     	private static final String CQ_S_AT = "so";
@@ -179,9 +180,9 @@
 		 */
 	public Text getQueryKey() {
 		return getQueryKey(instant);
-	};
+	}
 
-	/**
+    /**
 	 * Query key is the prefix plus the datetime, but no uniqueness at the end.
 	 *
 	 * @return the row key for range queries.
@@ -194,9 +195,9 @@
         }
 		appendInstant(theInstant, keyText);
 		return keyText;
-	};
+	}
 
-		@Override
+    @Override
 		public String toString() {
 			return "KeyParts [contraintPrefix=" + toHumanString(constraintPrefix) + ", instant=" + toHumanString(instant.getAsKeyBytes()) + ", cf=" + cf + ", cq=" + cq + "]";
 		}
@@ -270,13 +271,13 @@
 		 */
 		static public List<KeyParts> keyPartsForQuery(final TemporalInstant queryInstant, final StatementConstraints contraints) {
 			final List<KeyParts> keys = new LinkedList<KeyParts>();
-			final URI urlNull = new URIImpl("urn:null");
+			final IRI urlNull = VF.createIRI("urn:null");
 			final Resource currentContext = contraints.getContext();
 			final boolean hasSubj = contraints.hasSubject();
 			if (contraints.hasPredicates()) {
-				for (final URI nextPredicate : contraints.getPredicates()) {
+				for (final IRI nextPredicate : contraints.getPredicates()) {
 					final Text contraintPrefix  = new Text();
-					final Statement statement = new ContextStatementImpl(hasSubj ? contraints.getSubject() : urlNull, nextPredicate, urlNull, contraints.getContext());
+					final Statement statement = VF.createStatement(hasSubj ? contraints.getSubject() : urlNull, nextPredicate, urlNull, contraints.getContext());
 					if (hasSubj) {
                         appendSubjectPredicate(statement, contraintPrefix);
                     } else {
@@ -287,7 +288,7 @@
 			}
 			else if (contraints.hasSubject()) { // and no predicates
 				final Text contraintPrefix = new Text();
-				final Statement statement = new StatementImpl(contraints.getSubject(), urlNull, urlNull);
+				final Statement statement = VF.createStatement(contraints.getSubject(), urlNull, urlNull);
 				appendSubject(statement, contraintPrefix);
 				keys.add( new KeyParts(contraintPrefix, queryInstant, (currentContext==null)?"":currentContext.toString(), CQ_S_AT) );
 			}
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunction.java b/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunction.java
index 838aea6..534cc7f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunction.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunction.java
@@ -19,10 +19,9 @@
  * under the License.
  */
 
-
-import info.aduna.iteration.CloseableIteration;
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 /**
  * A function used to perform a search.
@@ -39,7 +38,7 @@
      * @return
      * @throws QueryEvaluationException
      */
-    public abstract CloseableIteration<Statement, QueryEvaluationException> performSearch(String searchTerms, StatementConstraints contraints)
+    public CloseableIteration<Statement, QueryEvaluationException> performSearch(String searchTerms, StatementConstraints contraints)
             throws QueryEvaluationException;
 
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunctionFactory.java b/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunctionFactory.java
index f3b1678..15fe96d 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunctionFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/SearchFunctionFactory.java
@@ -19,12 +19,11 @@
  * under the License.
  */
 
-
 import java.util.Map;
 
 import org.apache.log4j.Logger;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.google.common.collect.Maps;
 
@@ -32,7 +31,7 @@
     
     private static final Logger logger = Logger.getLogger(SearchFunctionFactory.class);
 
-    private final Map<URI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
+    private final Map<IRI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
 
 
     /**
@@ -41,7 +40,7 @@
      * @param searchFunction
      * @return
      */
-    public SearchFunction getSearchFunction(final URI searchFunction) {
+    public SearchFunction getSearchFunction(final IRI searchFunction) {
 
         SearchFunction geoFunc = null;
 
@@ -54,7 +53,7 @@
         return geoFunc;
     }
 
-    private SearchFunction getSearchFunctionInternal(final URI searchFunction) throws QueryEvaluationException {
+    private SearchFunction getSearchFunctionInternal(final IRI searchFunction) throws QueryEvaluationException {
         SearchFunction sf = SEARCH_FUNCTION_MAP.get(searchFunction);
 
         if (sf != null) {
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/StatementConstraints.java b/extras/indexing/src/main/java/org/apache/rya/indexing/StatementConstraints.java
index 30096a5..76122e7 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/StatementConstraints.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/StatementConstraints.java
@@ -19,24 +19,22 @@
  * under the License.
  */
 
-
-
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
 
 public class StatementConstraints {
 	private Resource context = null;
 	private Resource subject = null;
-	private Set<URI> predicates = null;
+	private Set<IRI> predicates = null;
 
 	public StatementConstraints setContext(Resource context) {
 		this.context = context;
 		return this;
 	}
 
-	public StatementConstraints setPredicates(Set<URI> predicates) {
+	public StatementConstraints setPredicates(Set<IRI> predicates) {
 		this.predicates = predicates;
 		return this;
 	}
@@ -50,7 +48,7 @@
 		return context;
 	}
 
-	public Set<URI> getPredicates() {
+	public Set<IRI> getPredicates() {
 		return predicates;
 	}
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/StatementSerializer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/StatementSerializer.java
index b25a379..8ea44c5 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/StatementSerializer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/StatementSerializer.java
@@ -19,22 +19,18 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.util.Set;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * A set of Utilities to serialize {@link Statement}s to/from {@link String}s.
@@ -42,7 +38,7 @@
 public class StatementSerializer {
     private static String SEP = "\u0000";
 
-    private static ValueFactory VALUE_FACTORY = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * Read a {@link Statement} from a {@link String}
@@ -71,7 +67,7 @@
 
     public static Statement readStatement(String subjectString, String predicateString, String objectString, String contextString) {
         Resource subject = createResource(subjectString);
-        URI predicate = VALUE_FACTORY.createURI(predicateString);
+        IRI predicate = VF.createIRI(predicateString);
 
         boolean isObjectLiteral = objectString.startsWith("\"");
 
@@ -83,18 +79,18 @@
         }
 
         if (contextString == null || contextString.isEmpty()) {
-            return new StatementImpl(subject, predicate, object);
+            return VF.createStatement(subject, predicate, object);
         } else {
-            Resource context = VALUE_FACTORY.createURI(contextString);
-            return new ContextStatementImpl(subject, predicate, object, context);
+            Resource context = VF.createIRI(contextString);
+            return VF.createStatement(subject, predicate, object, context);
         }
     }
 
     private static Resource createResource(String str) {
         if (str.startsWith("_")) {
-            return VALUE_FACTORY.createBNode(str.substring(2));
+            return VF.createBNode(str.substring(2));
         }
-        return VALUE_FACTORY.createURI(str);
+        return VF.createIRI(str);
 
     }
 
@@ -104,7 +100,7 @@
 
         if (fullLiteralString.endsWith("\"")) {
             String fullLiteralWithoutQuotes = fullLiteralString.substring(1, fullLiteralString.length() - 1);
-            return VALUE_FACTORY.createLiteral(fullLiteralWithoutQuotes, (String) null);
+            return VF.createLiteral(fullLiteralWithoutQuotes);
         } else {
 
             // find the closing quote
@@ -117,12 +113,12 @@
             if (data.startsWith("@")) {
                 // the data is "language"
                 String lang = data.substring(1);
-                return VALUE_FACTORY.createLiteral(label, lang);
+                return VF.createLiteral(label, lang);
             } else if (data.startsWith("^^<")) {
                 // the data is a "datatype"
                 String datatype = data.substring(3, data.length() - 1);
-                URI datatypeUri = VALUE_FACTORY.createURI(datatype);
-                return VALUE_FACTORY.createLiteral(label, datatypeUri);
+                IRI datatypeUri = VF.createIRI(datatype);
+                return VF.createLiteral(label, datatypeUri);
             }
         }
         return null;
@@ -165,7 +161,7 @@
     public static String writeStatement(Statement statement) {
         Resource subject = statement.getSubject();
         Resource context = statement.getContext();
-        URI predicate = statement.getPredicate();
+        IRI predicate = statement.getPredicate();
         Value object = statement.getObject();
 
         Validate.notNull(subject);
@@ -197,7 +193,7 @@
     public static String createStatementRegex(StatementConstraints contraints) {
         Resource context = contraints.getContext();
         Resource subject = contraints.getSubject();
-        Set<URI> predicates = contraints.getPredicates();
+        Set<IRI> predicates = contraints.getPredicates();
         if (context == null && subject == null && (predicates == null || predicates.isEmpty())) {
             return null;
         }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalIndexer.java
index 0eac949..51160d3 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalIndexer.java
@@ -1,8 +1,3 @@
-package org.apache.rya.indexing;
-
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -21,10 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing;
 
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 /**
  * A repository to store, index, and retrieve {@link Statement}s based on time.
@@ -90,35 +87,35 @@
      *    and then the inverses, including after.
      */
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantEqualsInstant(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantEqualsInstant(
             TemporalInstant queryInstant, StatementConstraints contraints)
-            throws QueryEvaluationException;;
+            throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInstant(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInstant(
             TemporalInstant queryInstant, StatementConstraints contraints)
-            throws QueryEvaluationException;;
+            throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInstant(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInstant(
             TemporalInstant queryInstant, StatementConstraints contraints)
-            throws QueryEvaluationException;;
+            throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInterval(
-            TemporalInterval givenInterval, StatementConstraints contraints)
-            throws QueryEvaluationException;;
-
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInterval(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantBeforeInterval(
             TemporalInterval givenInterval, StatementConstraints contraints)
             throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantInsideInterval(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantAfterInterval(
             TemporalInterval givenInterval, StatementConstraints contraints)
             throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantHasBeginningInterval(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantInsideInterval(
+            TemporalInterval givenInterval, StatementConstraints contraints)
+            throws QueryEvaluationException;
+
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantHasBeginningInterval(
             TemporalInterval queryInterval, StatementConstraints contraints)
             throws QueryEvaluationException;
 
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryInstantHasEndInterval(
+    public CloseableIteration<Statement, QueryEvaluationException> queryInstantHasEndInterval(
             TemporalInterval queryInterval, StatementConstraints contraints)
             throws QueryEvaluationException;
 
@@ -133,7 +130,7 @@
      * @return
      * @throws QueryEvaluationException
      */
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalEquals(
+    public CloseableIteration<Statement, QueryEvaluationException> queryIntervalEquals(
             TemporalInterval query, StatementConstraints contraints)
             throws QueryEvaluationException;
 
@@ -147,7 +144,7 @@
      *            the {@link StatementConstraints}
      * @return
      */
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalBefore(
+    public CloseableIteration<Statement, QueryEvaluationException> queryIntervalBefore(
             TemporalInterval query, StatementConstraints contraints)
             throws QueryEvaluationException;
 
@@ -160,7 +157,7 @@
      *            the {@link StatementConstraints}
      * @return
      */
-    public abstract CloseableIteration<Statement, QueryEvaluationException> queryIntervalAfter(
+    public CloseableIteration<Statement, QueryEvaluationException> queryIntervalAfter(
             TemporalInterval query, StatementConstraints contraints)
             throws QueryEvaluationException;
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalTupleSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalTupleSet.java
index 3f20191..bb34609 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalTupleSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/TemporalTupleSet.java
@@ -1,22 +1,3 @@
-package org.apache.rya.indexing;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-import org.joda.time.DateTime;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.QueryModelVisitor;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -35,12 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing;
 
-import info.aduna.iteration.CloseableIteration;
+import java.util.Map;
+import java.util.Set;
 
-//Indexing Node for temporal expressions to be inserted into execution plan
-//to delegate temporal portion of query to temporal index
+import org.apache.hadoop.conf.Configuration;
+import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
+import org.joda.time.DateTime;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
+
+/**
+ * Indexing Node for temporal expressions to be inserted into execution plan
+ * to delegate temporal portion of query to temporal index
+ */
 public class TemporalTupleSet extends ExternalTupleSet {
+    private static final long serialVersionUID = 1L;
+
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private final Configuration conf;
     private final TemporalIndexer temporalIndexer;
@@ -111,7 +115,7 @@
     @Override
     public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(final BindingSet bindings)
             throws QueryEvaluationException {
-        final URI funcURI = filterInfo.getFunction();
+        final IRI funcURI = filterInfo.getFunction();
         final SearchFunction searchFunction = new TemporalSearchFunctionFactory(conf, temporalIndexer).getSearchFunction(funcURI);
 
         if(filterInfo.getArguments().length > 1) {
@@ -125,7 +129,7 @@
     //returns appropriate search function for a given URI
     //search functions used by TemporalIndexer to query Temporal Index
     public static class TemporalSearchFunctionFactory  {
-        private final Map<URI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
+        private final Map<IRI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
         private final TemporalIndexer temporalIndexer;
 
         public TemporalSearchFunctionFactory(final Configuration conf, final TemporalIndexer temporalIndexer) {
@@ -138,7 +142,7 @@
          * @param searchFunction
          * @return
          */
-        public SearchFunction getSearchFunction(final URI searchFunction) {
+        public SearchFunction getSearchFunction(final IRI searchFunction) {
             SearchFunction geoFunc = null;
             try {
                 geoFunc = getSearchFunctionInternal(searchFunction);
@@ -149,7 +153,7 @@
             return geoFunc;
         }
 
-        private SearchFunction getSearchFunctionInternal(final URI searchFunction) throws QueryEvaluationException {
+        private SearchFunction getSearchFunctionInternal(final IRI searchFunction) throws QueryEvaluationException {
             final SearchFunction sf = SEARCH_FUNCTION_MAP.get(searchFunction);
 
             if (sf != null) {
@@ -170,7 +174,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantAfterInstant";
-            };
+            }
         };
         private final SearchFunction TEMPORAL_InstantBeforeInstant = new SearchFunction() {
             @Override
@@ -183,7 +187,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantBeforeInstant";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantEqualsInstant = new SearchFunction() {
@@ -197,7 +201,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantEqualsInstant";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantAfterInterval = new SearchFunction() {
@@ -211,7 +215,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantAfterInterval";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantBeforeInterval = new SearchFunction() {
@@ -225,7 +229,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantBeforeInterval";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantInsideInterval = new SearchFunction() {
@@ -239,7 +243,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantInsideInterval";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantHasBeginningInterval = new SearchFunction() {
@@ -253,7 +257,7 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantHasBeginningInterval";
-            };
+            }
         };
 
         private final SearchFunction TEMPORAL_InstantHasEndInterval = new SearchFunction() {
@@ -267,22 +271,22 @@
             @Override
             public String toString() {
                 return "TEMPORAL_InstantHasEndInterval";
-            };
+            }
         };
 
         {
             final String TEMPORAL_NS = "tag:rya-rdf.org,2015:temporal#";
 
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"after"), TEMPORAL_InstantAfterInstant);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"before"), TEMPORAL_InstantBeforeInstant);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"equals"), TEMPORAL_InstantEqualsInstant);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"after"), TEMPORAL_InstantAfterInstant);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"before"), TEMPORAL_InstantBeforeInstant);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"equals"), TEMPORAL_InstantEqualsInstant);
 
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"beforeInterval"), TEMPORAL_InstantBeforeInterval);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"afterInterval"), TEMPORAL_InstantAfterInterval);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"insideInterval"), TEMPORAL_InstantInsideInterval);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"hasBeginningInterval"),
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"beforeInterval"), TEMPORAL_InstantBeforeInterval);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"afterInterval"), TEMPORAL_InstantAfterInterval);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"insideInterval"), TEMPORAL_InstantInsideInterval);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"hasBeginningInterval"),
                     TEMPORAL_InstantHasBeginningInterval);
-            SEARCH_FUNCTION_MAP.put(new URIImpl(TEMPORAL_NS+"hasEndInterval"), TEMPORAL_InstantHasEndInterval);
+            SEARCH_FUNCTION_MAP.put(VF.createIRI(TEMPORAL_NS+"hasEndInterval"), TEMPORAL_InstantHasEndInterval);
         }
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/AccumuloIndexingConfiguration.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/AccumuloIndexingConfiguration.java
index 8379215..9e6e92b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/AccumuloIndexingConfiguration.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/AccumuloIndexingConfiguration.java
@@ -33,7 +33,7 @@
 import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexer;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataOptimizer;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.sail.Sail;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/ConfigUtils.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/ConfigUtils.java
index 561f6c6..d2fe58a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/ConfigUtils.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/ConfigUtils.java
@@ -60,8 +60,8 @@
 import org.apache.rya.indexing.mongodb.temporal.MongoTemporalIndexer;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataOptimizer;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
@@ -210,11 +210,11 @@
         return conf.getInt(FREE_TEXT_QUERY_TERM_LIMIT, 100);
     }
 
-    public static Set<URI> getFreeTextPredicates(final Configuration conf) {
+    public static Set<IRI> getFreeTextPredicates(final Configuration conf) {
         return getPredicates(conf, FREETEXT_PREDICATES_LIST);
     }
 
-    public static Set<URI> getGeoPredicates(final Configuration conf) {
+    public static Set<IRI> getGeoPredicates(final Configuration conf) {
         return getPredicates(conf, GEO_PREDICATES_LIST);
     }
 
@@ -225,15 +225,15 @@
      * @return Set of predicate URI's whose objects should be date time
      *         literals.
      */
-    public static Set<URI> getTemporalPredicates(final Configuration conf) {
+    public static Set<IRI> getTemporalPredicates(final Configuration conf) {
         return getPredicates(conf, TEMPORAL_PREDICATES_LIST);
     }
 
-    protected static Set<URI> getPredicates(final Configuration conf, final String confName) {
+    protected static Set<IRI> getPredicates(final Configuration conf, final String confName) {
         final String[] validPredicateStrings = conf.getStrings(confName, new String[] {});
-        final Set<URI> predicates = new HashSet<>();
+        final Set<IRI> predicates = new HashSet<>();
         for (final String prediateString : validPredicateStrings) {
-            predicates.add(new URIImpl(prediateString));
+            predicates.add(SimpleValueFactory.getInstance().createIRI(prediateString));
         }
         return predicates;
     }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
index c87b240..1b20514 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIdIndexer.java
@@ -54,25 +54,22 @@
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.apache.rya.indexing.DocIdIndexer;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Bytes;
 
-import info.aduna.iteration.CloseableIteration;
-
-import info.aduna.iteration.CloseableIteration;
-
 public class AccumuloDocIdIndexer implements DocIdIndexer {
 
 
@@ -192,10 +189,8 @@
                         isEmpty = true;
                         return false;
 
-                    } else if (isEmpty) {
-                        return false;
                     } else {
-                        return true;
+                        return !isEmpty;
                     }
 
                 }
@@ -314,10 +309,8 @@
                         isEmpty = true;
                         return false;
 
-                    } else if (isEmpty) {
-                        return false;
                     } else {
-                        return true;
+                        return !isEmpty;
                     }
                 }
 
@@ -366,7 +359,7 @@
 
             if (tripleComponent.equals("object")) {
                 final byte[] object = Bytes.concat(cqContent, objType);
-                org.openrdf.model.Value v = null;
+                org.eclipse.rdf4j.model.Value v = null;
                 try {
                     v = RyaToRdfConversions.convertValue(RyaContext.getInstance().deserialize(
                             object));
@@ -378,7 +371,7 @@
             } else if (tripleComponent.equals("subject")) {
                 if (!commonVarSet) {
                     final byte[] object = Bytes.concat(row.getBytes(), objType);
-                    org.openrdf.model.Value v = null;
+                    org.eclipse.rdf4j.model.Value v = null;
                     try {
                         v = RyaToRdfConversions.convertValue(RyaContext.getInstance().deserialize(
                                 object));
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
index ab4bd55..300d8ba 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndex.java
@@ -58,7 +58,7 @@
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
@@ -384,7 +384,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return null;
     }
 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizer.java
index d06cfd7..59a260e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizer.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -31,21 +30,22 @@
 import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
 import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -132,7 +132,7 @@
         tupleExpr.visit(new JoinVisitor());
     }
 
-    protected class JoinVisitor extends QueryModelVisitorBase<RuntimeException> {
+    protected class JoinVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         @Override
         public void meet(Join node) {
@@ -332,7 +332,7 @@
 
                 // weight starQuery where common Var is constant slightly more -- this factor is subject
                 // to change
-                if(s.startsWith("-const-")) {
+                if (VarNameUtils.isConstant(s)) {
                     tempPriority *= 10;
                 }
                 if (tempPriority > priority) {
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityTupleSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityTupleSet.java
index c8675cd..3b7c19b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityTupleSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/EntityTupleSet.java
@@ -23,6 +23,8 @@
 import java.util.List;
 import java.util.Set;
 
+import com.google.common.base.Joiner;
+import com.google.common.collect.Sets;
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
@@ -37,21 +39,17 @@
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStoreConnection;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.Sets;
-import com.google.common.base.Joiner;
-
-import info.aduna.iteration.CloseableIteration;
-
 public class EntityTupleSet extends ExternalSet implements ExternalBatchingIterator {
     private static final Logger LOG = LoggerFactory.getLogger(EntityTupleSet.class);
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
index a37b14ad..fc1b15e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/entity/StarQuery.java
@@ -1,7 +1,3 @@
-package org.apache.rya.indexing.accumulo.entity;
-
-import java.nio.charset.StandardCharsets;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,8 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.accumulo.entity;
 
-
+import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -32,14 +29,15 @@
 import org.apache.rya.accumulo.documentIndex.TextColumn;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
 import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -520,7 +518,7 @@
 
 
             for (final String s : bindings) {
-                if (!s.startsWith("-const-")) {
+                if (!VarNameUtils.isConstant(s)) {
                     varCount++;
                 }
                 if (varCount > 1) {
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
index 9078015..0a44d09 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexer.java
@@ -75,16 +75,15 @@
 import org.apache.rya.indexing.accumulo.freetext.query.QueryParserTreeConstants;
 import org.apache.rya.indexing.accumulo.freetext.query.SimpleNode;
 import org.apache.rya.indexing.accumulo.freetext.query.TokenMgrError;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * The {@link AccumuloFreeTextIndexer} stores and queries "free text" data from statements into tables in Accumulo. Specifically, this class
  * stores data into two different Accumulo Tables. This is the <b>document table</b> (default name: triplestore_text) and the <b>terms
@@ -208,7 +207,7 @@
 
     private int docTableNumPartitions;
 
-    private Set<URI> validPredicates;
+    private Set<IRI> validPredicates;
 
     private Configuration conf;
 
@@ -393,7 +392,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return validPredicates;
     }
 
@@ -530,7 +529,7 @@
         if (contraints.hasPredicates()) {
             constrainedQuery.append(" AND (");
             final List<String> predicates = new ArrayList<String>();
-            for (final URI u : contraints.getPredicates()) {
+            for (final IRI u : contraints.getPredicates()) {
                 predicates.add(ColumnPrefixes.getPredColFam(u.stringValue()).toString());
             }
             constrainedQuery.append(StringUtils.join(predicates, " OR "));
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/ColumnPrefixes.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/ColumnPrefixes.java
index e8825f4..a232c44 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/ColumnPrefixes.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/ColumnPrefixes.java
@@ -19,16 +19,13 @@
  * under the License.
  */
 
-
-
 import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.io.Text;
-import org.openrdf.model.Statement;
-
 import org.apache.rya.indexing.StatementSerializer;
+import org.eclipse.rdf4j.model.Statement;
 
 /**
  * Row ID: shardId
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/FreeTextTupleSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/FreeTextTupleSet.java
index 0e74f5e..e98cccb 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/FreeTextTupleSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/FreeTextTupleSet.java
@@ -19,26 +19,23 @@
  * under the License.
  */
 
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.io.IOException;
 import java.util.Set;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.indexing.FreeTextIndexer;
 import org.apache.rya.indexing.IndexingExpr;
 import org.apache.rya.indexing.IteratorFactory;
 import org.apache.rya.indexing.SearchFunction;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-
-import org.apache.hadoop.conf.Configuration;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.QueryModelVisitor;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
 
 import com.google.common.base.Joiner;
 
@@ -128,7 +125,7 @@
             throws QueryEvaluationException {
         
       
-        URI funcURI = filterInfo.getFunction();
+        IRI funcURI = filterInfo.getFunction();
         
         SearchFunction searchFunction = new SearchFunction() {
 
@@ -147,7 +144,7 @@
             @Override
             public String toString() {
                 return "TEXT";
-            };
+            }
         };
 
         if (filterInfo.getArguments().length > 1) {
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/LuceneTokenizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/LuceneTokenizer.java
index 3378fc0..3b945fd 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/LuceneTokenizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/freetext/LuceneTokenizer.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.SortedSet;
@@ -30,19 +28,17 @@
 import org.apache.lucene.analysis.TokenStream;
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
-import org.apache.lucene.util.Version;
 
 /**
  * A {@link Tokenizer} that delegates to Lucene functions
  */
 public class LuceneTokenizer implements Tokenizer {
-	private static final Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_36);
+	private static final Analyzer ANALYZER = new StandardAnalyzer();
 
 	@Override
 	public SortedSet<String> tokenize(String string) {
 		SortedSet<String> set = new TreeSet<String>();
-		try {
-			TokenStream stream = analyzer.tokenStream(null, new StringReader(string));
+		try (final TokenStream stream = ANALYZER.tokenStream(null, new StringReader(string))) {
 			stream.reset();
 			while (stream.incrementToken()) {
 				set.add(stream.getAttribute(CharTermAttribute.class).toString());
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
index 48434ca..ce660f9 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexer.java
@@ -68,14 +68,13 @@
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.TemporalInterval;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.joda.time.DateTime;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
-
-import info.aduna.iteration.CloseableIteration;
 
 public class AccumuloTemporalIndexer extends AbstractAccumuloIndexer implements TemporalIndexer {
 
@@ -98,7 +97,7 @@
 
     private BatchWriter temporalIndexBatchWriter;
 
-    private Set<URI> validPredicates;
+    private Set<IRI> validPredicates;
     private String temporalIndexTableName;
 
     private boolean isInit = false;
@@ -873,7 +872,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
 
         return validPredicates;
     }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexOptimizer.java
index cec776b..6d47060 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexOptimizer.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -37,9 +37,9 @@
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.external.matching.TopOfQueryFilterRelocator;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Optional;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexSetProvider.java
index 1052b38..e52b92b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityIndexSetProvider.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -36,11 +36,12 @@
 import org.apache.rya.indexing.entity.storage.TypeStorage.TypeStorageException;
 import org.apache.rya.indexing.external.matching.ExternalSetProvider;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
@@ -49,6 +50,7 @@
  * Provides {@link EntityQueryNodes}s.
  */
 public class EntityIndexSetProvider implements ExternalSetProvider<EntityQueryNode> {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private Multimap<Type, StatementPattern> typeMap;
     private Map<String, Type> subjectTypeMap;
     private final TypeStorage typeStorage;
@@ -102,7 +104,7 @@
         final String subjStr = subj.getName();
         final RyaURI predURI = getPredURI(pattern);
         //check to see if current node is type
-        if(new URIImpl(predURI.getData()).equals(RDF.TYPE)) {
+        if(VF.createIRI(predURI.getData()).equals(RDF.TYPE)) {
             final Var obj = pattern.getObjectVar();
             final RyaURI objURI = new RyaURI(obj.getValue().stringValue());
             try {
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityToSegmentConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityToSegmentConverter.java
index c76a3ab..eb0e7d6 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityToSegmentConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/EntityToSegmentConverter.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -28,9 +28,9 @@
 import org.apache.rya.indexing.external.matching.ExternalSetConverter;
 import org.apache.rya.indexing.external.matching.JoinSegment;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/model/Entity.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/model/Entity.java
index 3804de4..fb64ccf 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/model/Entity.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/model/Entity.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -34,7 +34,7 @@
 import org.apache.rya.indexing.entity.storage.EntityStorage;
 import org.apache.rya.indexing.smarturi.SmartUriAdapter;
 import org.apache.rya.indexing.smarturi.SmartUriException;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
@@ -89,7 +89,7 @@
 
     private final int version;
 
-    private URI smartUri = null;
+    private IRI smartUri = null;
 
     /**
      * To construct an instance of this class, use {@link Builder}.
@@ -101,7 +101,7 @@
      * Entity, grouped by Type ID.
      * @param version The version of this Entity. This value is used by the
      * {@link EntityStorage} to prevent stale updates.
-     * @param smartUri the Smart {@link URI} representation of this
+     * @param smartUri the Smart {@link IRI} representation of this
      * {@link Entity}.
      */
     private Entity(
@@ -109,7 +109,7 @@
             final ImmutableList<RyaURI> explicitTypeIds,
             final ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> typeProperties,
             final int version,
-            final URI smartUri) {
+            final IRI smartUri) {
         this.subject = requireNonNull(subject);
         this.explicitTypeIds = requireNonNull(explicitTypeIds);
         properties = requireNonNull(typeProperties);
@@ -175,9 +175,9 @@
     }
 
     /**
-     * @return the Smart {@link URI} representation of this {@link Entity}.
+     * @return the Smart {@link IRI} representation of this {@link Entity}.
      */
-    public URI getSmartUri() {
+    public IRI getSmartUri() {
         return smartUri;
     }
 
@@ -292,7 +292,7 @@
         private RyaURI subject = null;
         private final List<RyaURI> explicitTypes = new ArrayList<>();
         private final Map<RyaURI, Map<RyaURI, Property>> properties = new HashMap<>();
-        private URI smartUri = null;
+        private IRI smartUri = null;
 
         private int version = 0;
 
@@ -392,11 +392,11 @@
         }
 
         /**
-         * @param smartUri - the Smart {@link URI} representation of this
+         * @param smartUri - the Smart {@link IRI} representation of this
          * {@link Entity}.
          * @return This {@link Builder} so that method invocations may be chained.
          */
-        public Builder setSmartUri(final URI smartUri) {
+        public Builder setSmartUri(final IRI smartUri) {
             this.smartUri = smartUri;
             return this;
         }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/query/EntityQueryNode.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/query/EntityQueryNode.java
index 793252e..70efc3a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/query/EntityQueryNode.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/query/EntityQueryNode.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -42,16 +42,17 @@
 import org.apache.rya.indexing.entity.storage.mongo.ConvertingCursor;
 import org.apache.rya.indexing.entity.update.EntityIndexer;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.evaluation.iterator.CollectionIteration;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.iterator.CollectionIteration;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +62,6 @@
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * Indexing Node for {@link Entity} expressions to be inserted into execution plan
@@ -133,7 +133,7 @@
         }
 
         // Any constant that appears in the Object portion of the SP will be used to make sure they match.
-        final Builder<RyaURI, Var> builder = ImmutableMap.<RyaURI, Var>builder();
+        final Builder<RyaURI, Var> builder = ImmutableMap.builder();
         for(final StatementPattern sp : patterns) {
             final Var object = sp.getObjectVar();
             final Var pred = sp.getPredicateVar();
@@ -297,7 +297,7 @@
                     if(prop.isPresent()) {
                         final RyaType type = prop.get();
                         final String bindingName = objectVariables.get(key).getName();
-                        resultSet.addBinding(bindingName, ValueFactoryImpl.getInstance().createLiteral(type.getData()));
+                        resultSet.addBinding(bindingName, SimpleValueFactory.getInstance().createLiteral(type.getData()));
                     }
                 }
             }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java
index f2647ef..7333de1 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverter.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -29,7 +29,7 @@
 import org.apache.rya.indexing.entity.model.Property;
 import org.apache.rya.indexing.entity.storage.mongo.key.MongoDbSafeKey;
 import org.bson.Document;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -130,7 +130,7 @@
 
         builder.setVersion( document.getInteger(VERSION) );
 
-        builder.setSmartUri( new URIImpl(document.getString(SMART_URI)) );
+        builder.setSmartUri( SimpleValueFactory.getInstance().createIRI(document.getString(SMART_URI)) );
 
         return builder.build();
     }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverter.java
index c0afd73..80c489e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverter.java
@@ -22,8 +22,8 @@
 
 import org.apache.rya.api.domain.RyaType;
 import org.bson.Document;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -34,7 +34,7 @@
 @DefaultAnnotation(NonNull.class)
 public class RyaTypeDocumentConverter implements DocumentConverter<RyaType> {
 
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     public static final String DATA_TYPE = "dataType";
     public static final String VALUE = "value";
@@ -63,7 +63,7 @@
         }
 
         return new RyaType(
-                VF.createURI( document.getString(DATA_TYPE) ),
+                VF.createIRI( document.getString(DATA_TYPE) ),
                 document.getString(VALUE));
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/update/BaseEntityIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/update/BaseEntityIndexer.java
index 7392318..52d6f4d 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/entity/update/BaseEntityIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/entity/update/BaseEntityIndexer.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -49,8 +49,8 @@
 import org.apache.rya.indexing.mongodb.IndexingException;
 import org.apache.rya.mongodb.MongoSecondaryIndex;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 
 import com.google.common.base.Objects;
 
@@ -260,7 +260,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         // This isn't used anywhere in Rya, so it will not be implemented.
         return null;
     }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
index 6de8e3b..c2086d2 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/PrecomputedJoinIndexer.java
@@ -43,7 +43,7 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.update.PrecomputedJoinUpdater;
 import org.apache.rya.indexing.pcj.update.PrecomputedJoinUpdater.PcjUpdateException;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Supplier;
@@ -274,7 +274,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return new HashSet<>();
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/accumulo/AccumuloPcjStorageConfig.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/accumulo/AccumuloPcjStorageConfig.java
index 6c82ee0..096dc13 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/accumulo/AccumuloPcjStorageConfig.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/accumulo/AccumuloPcjStorageConfig.java
@@ -21,9 +21,8 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 
 /**
  * Configuration values required to initialize a {@link AccumuloPcjStorage}.
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/fluo/FluoPcjUpdaterConfig.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/fluo/FluoPcjUpdaterConfig.java
index ee8c295..528cb15 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/fluo/FluoPcjUpdaterConfig.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/fluo/FluoPcjUpdaterConfig.java
@@ -20,11 +20,10 @@
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
+import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 
-import org.apache.hadoop.conf.Configuration;
-
 import com.google.common.base.Optional;
 
 /**
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcher.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcher.java
index 0f34030..0cf1ebc 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcher.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcher.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,58 +17,20 @@
  * under the License.
  */
 package org.apache.rya.indexing.external.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
 import java.util.ArrayList;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
 import org.apache.rya.indexing.external.matching.QueryNodesToTupleExpr.TupleExprAndNodes;
-import org.openrdf.query.algebra.BinaryTupleOperator;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 /**
  * This class provides implementations of methods common to all implementations
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcherFactory.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcherFactory.java
index ca7ede4..099b08c 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcherFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetMatcherFactory.java
@@ -36,9 +36,9 @@
  * under the License.
  */
 
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 /**
  * This class takes in a given {@link Join}, {@Filter}, or {@link LeftJoin}
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetOptimizer.java
index 9ba40fd..9c420e7 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractExternalSetOptimizer.java
@@ -24,18 +24,18 @@
 
 import org.apache.rya.indexing.external.matching.QueryNodesToTupleExpr.TupleExprAndNodes;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.BinaryTupleOperator;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.base.Optional;
 
@@ -67,7 +67,7 @@
      * the nodes returned by {@link ExternalSetMatcher#getUnmatchedArgs()}.
      *
      */
-    protected class QuerySegmentMatchVisitor extends QueryModelVisitorBase<RuntimeException> {
+    protected class QuerySegmentMatchVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final QuerySegmentFactory<T> factory = new QuerySegmentFactory<T>();
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractQuerySegment.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractQuerySegment.java
index 49f39f4..18a36fa 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractQuerySegment.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/AbstractQuerySegment.java
@@ -28,10 +28,10 @@
 import java.util.Set;
 
 import org.apache.rya.indexing.external.matching.QueryNodesToTupleExpr.TupleExprAndNodes;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/BasicRater.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/BasicRater.java
index 6166d8a..f61fd3f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/BasicRater.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/BasicRater.java
@@ -40,13 +40,14 @@
 import java.util.List;
 import java.util.Set;
 
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 
+import org.apache.rya.api.domain.VarNameUtils;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+
 /**
  * This implementation of the QueryNodeListRater assigns a score to a specified
  * list between and 0 and 1, where the lower the score, the better the list. It
@@ -84,7 +85,7 @@
                 TupleExpr tup = (TupleExpr) node;
                 Set<String> bindingNames = tup.getAssuredBindingNames();
                 for (String name : bindingNames) {
-                    if (!name.startsWith("-const-")) {
+                    if (!VarNameUtils.isConstant(name)) {
                         commonVarBin.put(name, i);
                     }
                 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetConverter.java
index 900e6a8..d3e0ff2 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetConverter.java
@@ -36,7 +36,7 @@
  * under the License.
  */
 
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 public interface ExternalSetConverter<T extends ExternalSet> {
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetMatcher.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetMatcher.java
index 5456bed..c90d95c 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetMatcher.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetMatcher.java
@@ -1,4 +1,3 @@
-package org.apache.rya.indexing.external.matching;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,7 +7,7 @@
  * "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
+ *     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
@@ -17,38 +16,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.external.matching;
 
 import java.util.Collection;
 import java.util.Iterator;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
 import java.util.List;
 import java.util.Set;
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Optional;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetProvider.java
index e2d6b34..a9f31c6 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/ExternalSetProvider.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,29 +17,11 @@
  * under the License.
  */
 package org.apache.rya.indexing.external.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
 import java.util.Iterator;
 import java.util.List;
 
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 /**
  * Interface for extracting {@link ExternalSet}s from specified {@link QuerySegment}s.
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/FlattenedOptional.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/FlattenedOptional.java
index a0cbdb8..d975753 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/FlattenedOptional.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/FlattenedOptional.java
@@ -24,17 +24,17 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNodeBase;
-import org.openrdf.query.algebra.QueryModelVisitor;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.AbstractQueryModelNode;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
@@ -51,7 +51,7 @@
  * bound and unbound variables do not change.
  *
  */
-public class FlattenedOptional extends QueryModelNodeBase implements TupleExpr {
+public class FlattenedOptional extends AbstractQueryModelNode implements TupleExpr {
 
     private Set<TupleExpr> rightArgs;
     private Set<String> boundVars;
@@ -124,11 +124,7 @@
         // unbound vars
         if (te instanceof FlattenedOptional) {
             FlattenedOptional lj = (FlattenedOptional) te;
-            if (Sets.intersection(lj.rightArg.getBindingNames(), unboundVars).size() > 0) {
-                return false;
-            } else {
-                return true;
-            }
+            return Sets.intersection(lj.rightArg.getBindingNames(), unboundVars).size() <= 0;
         }
 
         return Sets.intersection(te.getBindingNames(), unboundVars).size() == 0;
@@ -246,11 +242,7 @@
         // unbound vars
         if (te instanceof FlattenedOptional) {
             FlattenedOptional lj = (FlattenedOptional) te;
-            if (Sets.intersection(lj.getRightArg().getBindingNames(), unboundVars).size() > 0) {
-                return false;
-            } else {
-                return true;
-            }
+            return Sets.intersection(lj.getRightArg().getBindingNames(), unboundVars).size() <= 0;
         }
         Set<String> vars = te.getBindingNames();
         Set<String> intersection = Sets.intersection(vars, boundVars);
@@ -267,9 +259,9 @@
 
     private void incrementVarCounts(Set<String> vars) {
         for (String s : vars) {
-            if (!s.startsWith("-const-") && leftArgVarCounts.containsKey(s)) {
+            if (!VarNameUtils.isConstant(s) && leftArgVarCounts.containsKey(s)) {
                 leftArgVarCounts.put(s, leftArgVarCounts.get(s) + 1);
-            } else if (!s.startsWith("-const-")) {
+            } else if (!VarNameUtils.isConstant(s)) {
                 leftArgVarCounts.put(s, 1);
             }
         }
@@ -295,7 +287,7 @@
     private Set<String> setWithOutConstants(Set<String> vars) {
         Set<String> copy = new HashSet<>();
         for (String s : vars) {
-            if (!s.startsWith("-const-")) {
+            if (!VarNameUtils.isConstant(s)) {
                 copy.add(s);
             }
         }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
index 9d97b32..5a700a7 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegment.java
@@ -1,4 +1,3 @@
-package org.apache.rya.indexing.external.matching;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -8,7 +7,7 @@
  * "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
+ *     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
@@ -17,41 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.external.matching;
 
 import java.util.ArrayList;
 import java.util.HashMap;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegmentMatcher.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegmentMatcher.java
index 8f4e43a..6c5167b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegmentMatcher.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/JoinSegmentMatcher.java
@@ -24,8 +24,8 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -38,7 +38,6 @@
  * the QueryModelNodes in the JoinSegment.
  *
  */
-
 public class JoinSegmentMatcher<T extends ExternalSet> extends AbstractExternalSetMatcher<T> {
 
     private ExternalSetConverter<T> converter;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/MatcherUtilities.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/MatcherUtilities.java
index 1f8e287..7c6a20a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/MatcherUtilities.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/MatcherUtilities.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,30 +17,12 @@
  * under the License.
  */
 package org.apache.rya.indexing.external.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 public class MatcherUtilities {
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegment.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegment.java
index 6f3d409..9d79708 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegment.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegment.java
@@ -27,13 +27,13 @@
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegmentMatcher.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegmentMatcher.java
index a359d02..cc1b9d9 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegmentMatcher.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/OptionalJoinSegmentMatcher.java
@@ -24,8 +24,8 @@
 import java.util.Iterator;
 import java.util.List;
 
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -37,7 +37,6 @@
  * OptionalJoinSegment and ordered to match the ExternalSet query.
  *
  */
-
 public class OptionalJoinSegmentMatcher<T extends ExternalSet> extends AbstractExternalSetMatcher<T> {
 
     private ExternalSetConverter<T> converter;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeConsolidator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeConsolidator.java
index 9a2d3be..faf5c27 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeConsolidator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeConsolidator.java
@@ -27,9 +27,9 @@
 import java.util.SortedSet;
 import java.util.TreeSet;
 
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeListRater.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeListRater.java
index e8b1553..7953661 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeListRater.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodeListRater.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,28 +17,10 @@
  * under the License.
  */
 package org.apache.rya.indexing.external.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
 import java.util.List;
 
-import org.openrdf.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
 
 /**
  * Class used for determining an optimal query plan.  It assigns a score
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodesToTupleExpr.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodesToTupleExpr.java
index 5bffb63..93dc80d 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodesToTupleExpr.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QueryNodesToTupleExpr.java
@@ -24,11 +24,11 @@
 import java.util.List;
 import java.util.Set;
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegment.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegment.java
index a8f687e..ca492d7 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegment.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegment.java
@@ -23,9 +23,9 @@
 import java.util.Set;
 
 import org.apache.rya.indexing.external.matching.QueryNodesToTupleExpr.TupleExprAndNodes;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 /**
  * A QuerySegment represents a subset of a query to be compared to ExternalSets for
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegmentFactory.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegmentFactory.java
index 0c1eb7e..9d1d3fe 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegmentFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/QuerySegmentFactory.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,30 +17,12 @@
  * under the License.
  */
 package org.apache.rya.indexing.external.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/TopOfQueryFilterRelocator.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/TopOfQueryFilterRelocator.java
index 6ebbe39..ada8329 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/TopOfQueryFilterRelocator.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/matching/TopOfQueryFilterRelocator.java
@@ -24,11 +24,11 @@
 import java.util.List;
 import java.util.Set;
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Class consisting of a single utility method for relocating filters.
@@ -73,7 +73,7 @@
 
     }
 
-    static class ProjectionAndFilterGatherer extends QueryModelVisitorBase<RuntimeException> {
+    static class ProjectionAndFilterGatherer extends AbstractQueryModelVisitor<RuntimeException> {
 
         Set<ValueExpr> filterCond = new HashSet<>();
         Projection projection;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
index f1d56b8..20f5768 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSet.java
@@ -44,6 +44,7 @@
 import org.apache.rya.accumulo.pcj.iterators.PCJKeyToCrossProductBindingSetIterator;
 import org.apache.rya.accumulo.pcj.iterators.PCJKeyToJoinBindingSetIterator;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.utils.IteratorWrapper;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
@@ -55,18 +56,19 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
-import org.openrdf.model.Value;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.BindingImpl;
-import org.openrdf.query.parser.ParsedTupleQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.SimpleBinding;
+import org.eclipse.rdf4j.query.parser.ParsedTupleQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
@@ -77,8 +79,6 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Sets;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * During query planning, this node is inserted into the parsed query to
  * represent part of the original query (a sub-query). This sub-query is the
@@ -290,7 +290,7 @@
 		}
 
 		final List<BindingSet> crossProductBs = new ArrayList<>();
-		final Map<String, org.openrdf.model.Value> constantConstraints = new HashMap<>();
+		final Map<String, Value> constantConstraints = new HashMap<>();
 		final Set<Range> hashJoinRanges = new HashSet<>();
 		final Range EMPTY_RANGE = new Range("", true, "~", false);
 		Range crossProductRange = EMPTY_RANGE;
@@ -546,8 +546,8 @@
 
 		final QueryBindingSet constants = new QueryBindingSet();
 		for (final String s : keys) {
-			if (s.startsWith("-const-")) {
-				constants.addBinding(new BindingImpl(s, getConstantValueMap()
+			if (VarNameUtils.isConstant(s)) {
+				constants.addBinding(new SimpleBinding(s, getConstantValueMap()
 						.get(s)));
 			}
 		}
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ExternalTupleSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ExternalTupleSet.java
index 48dc17e..e029114 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ExternalTupleSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ExternalTupleSet.java
@@ -18,24 +18,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.apache.rya.api.domain.VarNameUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
@@ -58,12 +56,16 @@
 public abstract class ExternalTupleSet extends ExternalSet {
 
 	public static final String VAR_ORDER_DELIM = ";";
-	public static final String CONST_PREFIX = "-const-";
+	/**
+	 * @deprecated use {@link VarNameUtils#CONSTANT_PREFIX}.
+	 */
+	@Deprecated
+	public static final String CONST_PREFIX = VarNameUtils.CONSTANT_PREFIX;
 	public static final String VALUE_DELIM = "\u0000";
 	private Projection tupleExpr;
     private Map<String, String> tableVarMap = Maps.newHashMap();  //maps vars in tupleExpr to var in stored binding sets
     private Map<String, Set<String>> supportedVarOrders = Maps.newHashMap(); //indicates supported var orders
-    private Map<String, org.openrdf.model.Value> valMap;
+    private Map<String, Value> valMap;
 
     public ExternalTupleSet() {
     }
@@ -134,7 +136,7 @@
         return supportedVarOrders;
     }
 
-    public Map<String, org.openrdf.model.Value> getConstantValueMap() {
+    public Map<String, Value> getConstantValueMap() {
     	return valMap;
     }
 
@@ -166,7 +168,7 @@
 			if (bindingNames.contains(s)) {
 				bNames.add(s);
 				bNamesWithConstants.add(s);
-			} else if(s.startsWith(CONST_PREFIX)) {
+			} else if(VarNameUtils.isConstant(s)) {
 				bNamesWithConstants.add(s);
 			}
 		}
@@ -202,7 +204,7 @@
 	 */
 	private void updateSupportedVarOrderMap() {
 
-		Preconditions.checkArgument(supportedVarOrders.size() != 0);;
+		Preconditions.checkArgument(supportedVarOrders.size() != 0);
 		final Map<String, Set<String>> newSupportedOrders = Maps.newHashMap();
 		final BiMap<String, String> biMap = HashBiMap.create(tableVarMap)
 				.inverse();
@@ -262,11 +264,7 @@
             return false;
         } else {
             final ExternalTupleSet arg = (ExternalTupleSet) other;
-            if (this.getTupleExpr().equals(arg.getTupleExpr())) {
-                return true;
-            } else {
-                return false;
-            }
+            return this.getTupleExpr().equals(arg.getTupleExpr());
         }
     }
 
@@ -277,7 +275,7 @@
         return result;
     }
 
-    private Map<String, org.openrdf.model.Value> getValMap() {
+    private Map<String, Value> getValMap() {
 		ValueMapVisitor valMapVis = new ValueMapVisitor();
 		tupleExpr.visit(valMapVis);
 		return valMapVis.getValMap();
@@ -290,16 +288,16 @@
 	 * create binding sets from range scan
 	 */
 	private class ValueMapVisitor extends
-			QueryModelVisitorBase<RuntimeException> {
-		Map<String, org.openrdf.model.Value> valMap = Maps.newHashMap();
+            AbstractQueryModelVisitor<RuntimeException> {
+		Map<String, Value> valMap = Maps.newHashMap();
 
-		public Map<String, org.openrdf.model.Value> getValMap() {
+		public Map<String, Value> getValMap() {
 			return valMap;
 		}
 
 		@Override
 		public void meet(Var node) {
-			if (node.getName().startsWith("-const-")) {
+			if (VarNameUtils.isConstant(node.getName())) {
 				valMap.put(node.getName(), node.getValue());
 			}
 		}
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtil.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtil.java
index 98d61e7..3c43808 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtil.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtil.java
@@ -22,15 +22,15 @@
 
 import java.util.concurrent.atomic.AtomicReference;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
 
 import com.google.common.base.Optional;
 
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
 /**
  * Utilities that help applications inspect {@link ParsedQuery} objects.
  */
@@ -49,7 +49,7 @@
         // When a projection is encountered for the requested index, store it in atomic reference and quit searching.
         final AtomicReference<Projection> projectionRef = new AtomicReference<>();
 
-        query.getTupleExpr().visit(new QueryModelVisitorBase<RuntimeException>() {
+        query.getTupleExpr().visit(new AbstractQueryModelVisitor<RuntimeException>() {
             @Override
             public void meet(Projection projection) {
                 projectionRef.set(projection);
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSet.java b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSet.java
index 02d0a58..cef49db 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSet.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSet.java
@@ -21,14 +21,12 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelVisitor;
-
 import com.google.common.base.Joiner;
-
-import info.aduna.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
 
 /**
  *  This a testing class to create mock pre-computed join nodes in order to
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/AbstractMongoIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/AbstractMongoIndexer.java
index 1c4c2fa..36839b3 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/AbstractMongoIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/AbstractMongoIndexer.java
@@ -39,10 +39,11 @@
 import org.apache.rya.mongodb.batch.MongoDbBatchWriterException;
 import org.apache.rya.mongodb.batch.MongoDbBatchWriterUtils;
 import org.apache.rya.mongodb.batch.collection.DbCollectionType;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.mongodb.DB;
 import com.mongodb.DBCollection;
@@ -51,8 +52,6 @@
 import com.mongodb.MongoClient;
 import com.mongodb.QueryBuilder;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Secondary Indexer using MondoDB
  * @param <T> - The {@link AbstractMongoIndexingStorageStrategy} this indexer uses.
@@ -68,7 +67,7 @@
     protected String dbName;
     protected DB db;
     protected DBCollection collection;
-    protected Set<URI> predicates;
+    protected Set<IRI> predicates;
 
     protected T storageStrategy;
 
@@ -129,7 +128,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return predicates;
     }
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/IndexingMongoDBStorageStrategy.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/IndexingMongoDBStorageStrategy.java
index eebc7b7..dd7d47d 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/IndexingMongoDBStorageStrategy.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/IndexingMongoDBStorageStrategy.java
@@ -21,14 +21,12 @@
 
 import java.util.Set;
 
-import org.openrdf.model.URI;
-
 import com.mongodb.BasicDBObject;
 import com.mongodb.DBObject;
 import com.mongodb.QueryBuilder;
-
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy;
+import org.eclipse.rdf4j.model.IRI;
 
 public class IndexingMongoDBStorageStrategy extends SimpleMongoDBStorageStrategy {
     public DBObject getQuery(final StatementConstraints contraints) {
@@ -38,9 +36,9 @@
         }
 
         if (contraints.hasPredicates()){
-            final Set<URI> predicates = contraints.getPredicates();
+            final Set<IRI> predicates = contraints.getPredicates();
             if (predicates.size() > 1){
-                for (final URI pred : predicates){
+                for (final IRI pred : predicates){
                     final DBObject currentPred = new BasicDBObject(PREDICATE, pred.toString());
                     queryBuilder.or(currentPred);
                 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoDbSmartUri.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoDbSmartUri.java
index a50d293..f392b5e 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoDbSmartUri.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoDbSmartUri.java
@@ -40,8 +40,8 @@
 import org.apache.rya.indexing.smarturi.SmartUriException;
 import org.apache.rya.indexing.smarturi.SmartUriStorage;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
 
 import com.mongodb.MongoClient;
 import com.mongodb.MongoException;
@@ -64,10 +64,10 @@
     }
 
     @Override
-    public void storeEntity(final RyaURI subject, final Map<URI, Value> map) throws SmartUriException {
+    public void storeEntity(final RyaURI subject, final Map<IRI, Value> map) throws SmartUriException {
         checkInit();
 
-        final URI uri = SmartUriAdapter.serializeUri(subject, map);
+        final IRI uri = SmartUriAdapter.serializeUri(subject, map);
         final Entity entity = SmartUriAdapter.deserializeUriEntity(uri);
 
         // Create it.
@@ -116,7 +116,7 @@
     }
 
     @Override
-    public ConvertingCursor<TypedEntity> queryEntity(final Type type, final Map<URI, Value> map) throws SmartUriException {
+    public ConvertingCursor<TypedEntity> queryEntity(final Type type, final Map<IRI, Value> map) throws SmartUriException {
         checkInit();
 
         // Query it.
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoIndexingConfiguration.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoIndexingConfiguration.java
index ebdb914..3ccdc9a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoIndexingConfiguration.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/MongoIndexingConfiguration.java
@@ -29,7 +29,7 @@
 import org.apache.rya.mongodb.AbstractMongoDBRdfConfigurationBuilder;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRdfConfigurationBuilder;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.sail.Sail;
 
 import com.google.common.base.Preconditions;
 
@@ -44,7 +44,7 @@
 public class MongoIndexingConfiguration extends MongoDBRdfConfiguration {
 
     private MongoIndexingConfiguration() {
-    };
+    }
 
     private MongoIndexingConfiguration(final Configuration conf) {
         super(conf);
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/freetext/MongoFreeTextIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/freetext/MongoFreeTextIndexer.java
index 913a4fd..f13e4c1 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/freetext/MongoFreeTextIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/freetext/MongoFreeTextIndexer.java
@@ -25,13 +25,12 @@
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.AbstractMongoIndexer;
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.mongodb.QueryBuilder;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class MongoFreeTextIndexer extends AbstractMongoIndexer<TextMongoDBStorageStrategy> implements FreeTextIndexer {
     private static final String COLLECTION_SUFFIX = "freetext";
     private static final Logger logger = Logger.getLogger(MongoFreeTextIndexer.class);
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjIndexSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjIndexSetProvider.java
index d3fa07e..274651f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjIndexSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjIndexSetProvider.java
@@ -31,7 +31,7 @@
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjStorage;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjQueryNode.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjQueryNode.java
index c03ee99..265158a 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjQueryNode.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/pcj/MongoPcjQueryNode.java
@@ -36,13 +36,14 @@
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjDocuments;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedTupleQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedTupleQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
@@ -51,7 +52,6 @@
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * Indexing Node for PCJs expressions to be inserted into execution plans.
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/temporal/MongoTemporalIndexer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/temporal/MongoTemporalIndexer.java
index fe8a7fa..653844f 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/temporal/MongoTemporalIndexer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/mongodb/temporal/MongoTemporalIndexer.java
@@ -29,15 +29,14 @@
 import org.apache.rya.indexing.TemporalInterval;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.AbstractMongoIndexer;
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.mongodb.DBCollection;
 import com.mongodb.QueryBuilder;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Indexes MongoDB based on time instants or intervals.
  */
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizer.java
index 8067a85..adc8a52 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizer.java
@@ -37,14 +37,13 @@
 import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
 
-import com.google.common.base.Optional;;
-
+import com.google.common.base.Optional;
 
 /**
  * {@link QueryOptimizer} which matches {@link TupleExpr}s associated with
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilities.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilities.java
index 09a2706..274a053 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilities.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilities.java
@@ -27,21 +27,21 @@
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer.VarCollector;
-import org.openrdf.query.algebra.Difference;
-import org.openrdf.query.algebra.EmptySet;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Intersection;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.VarNameCollector;
+import org.eclipse.rdf4j.query.algebra.Difference;
+import org.eclipse.rdf4j.query.algebra.EmptySet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Intersection;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.VarNameCollector;
 
 import com.google.common.collect.Sets;
 
@@ -114,7 +114,7 @@
 		return visitor.node;
 	}
 
-	static class ProjectionVisitor extends QueryModelVisitorBase<RuntimeException> {
+	static class ProjectionVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
 		Projection node = null;
 
@@ -155,7 +155,7 @@
 	 *
 	 */
 	private static class ValidQueryVisitor extends
-			QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
 		private boolean isValid = true;
 		private final Set<QueryModelNode> filterSet = Sets.newHashSet();
@@ -232,7 +232,7 @@
 	 */
 
 	protected static class FilterRelocator extends
-			QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
 		protected Filter filter;
 		protected Set<String> filterVars;
@@ -356,7 +356,7 @@
         return lj.containsLeftJoin;
     }
 
-    protected static class LeftJoinVisitor extends QueryModelVisitorBase<RuntimeException> {
+    protected static class LeftJoinVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         boolean containsLeftJoin = false;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJToSegmentConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJToSegmentConverter.java
index 5744f41..4495bed 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJToSegmentConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/PCJToSegmentConverter.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -17,35 +17,17 @@
  * under the License.
  */
 package org.apache.rya.indexing.pcj.matching;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
 
 import org.apache.rya.indexing.external.matching.ExternalSetConverter;
 import org.apache.rya.indexing.external.matching.JoinSegment;
 import org.apache.rya.indexing.external.matching.OptionalJoinSegment;
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.base.Preconditions;
 
@@ -75,11 +57,11 @@
      * specified PCJ.
      *
      */
-    static class PCJToJoinSegment extends QueryModelVisitorBase<RuntimeException> {
+    static class PCJToJoinSegment extends AbstractQueryModelVisitor<RuntimeException> {
 
         private JoinSegment<ExternalTupleSet> segment;
 
-        private PCJToJoinSegment(){};
+        private PCJToJoinSegment(){}
 
         public QuerySegment<ExternalTupleSet> getSegment(final ExternalTupleSet pcj) {
             segment = null;
@@ -103,11 +85,11 @@
      * This class extracts the {@link OptionalJoinSegment} of PCJ query.
      *
      */
-    static class PCJToOptionalJoinSegment extends QueryModelVisitorBase<RuntimeException> {
+    static class PCJToOptionalJoinSegment extends AbstractQueryModelVisitor<RuntimeException> {
 
         private OptionalJoinSegment<ExternalTupleSet> segment;
 
-        private PCJToOptionalJoinSegment(){};
+        private PCJToOptionalJoinSegment(){}
 
         public QuerySegment<ExternalTupleSet> getSegment(final ExternalTupleSet pcj) {
             segment = null;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/QueryVariableNormalizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/QueryVariableNormalizer.java
index 2ed66c4..b2ed8d7 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/QueryVariableNormalizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/QueryVariableNormalizer.java
@@ -18,8 +18,6 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -29,20 +27,19 @@
 import java.util.Set;
 import java.util.TreeMap;
 
-import org.openrdf.model.Literal;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.NAryValueOperator;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.apache.rya.api.domain.VarNameUtils;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.NAryValueOperator;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -72,7 +69,7 @@
 
         // if tuples are equal, no need to do anything
         if (tuple1.equals(tuple2)) {
-            tupleList.add((TupleExpr) tuple1.clone());
+            tupleList.add(tuple1.clone());
             return tupleList;
         }
 
@@ -399,11 +396,7 @@
             if ((vars1.get(i) instanceof ValueConstant) && (vars2.get(i) instanceof Var)) {
                 
                 ValueConstant vc = (ValueConstant) vars1.get(i);
-                String s = vc.getValue().toString();
-                if(vc.getValue() instanceof Literal) {
-                    s = s.substring(1, s.length() - 1);
-                } 
-                s = "-const-" + s;
+                final String s = VarNameUtils.createUniqueConstVarName(vc.getValue());
                 varList1.add(s);
                 varList2.add(((Var)vars2.get(i)).getName());
             } else if(!(vars1.get(i) instanceof ValueConstant)){
@@ -482,10 +475,7 @@
             return false;
         } else {
 
-            if (hMap.get(key).equals(val)) {
-                return true;
-            } else
-                return false;
+            return hMap.get(key).equals(val);
 
         }
 
@@ -728,7 +718,7 @@
 
     
 
-    public static class ValueMapVisitor extends QueryModelVisitorBase<Exception> {
+    public static class ValueMapVisitor extends AbstractQueryModelVisitor<Exception> {
 
         
         private Map<String, Value> valMap = Maps.newHashMap();
@@ -749,13 +739,7 @@
 
         public void meet(ValueConstant val) {
 
-            String s = val.getValue().toString();
-            
-            if (val.getValue() instanceof Literal) {
-                s = s.substring(1, s.length() - 1);
-            }
-            
-            s = "-const-" + s;
+            final String s = VarNameUtils.createUniqueConstVarName(val.getValue());
             valMap.put(s, val.getValue());
         }
 
@@ -767,7 +751,7 @@
     
     
     
-    public static class NodeCollector extends QueryModelVisitorBase<Exception> {
+    public static class NodeCollector extends AbstractQueryModelVisitor<Exception> {
 
         
         private List<QueryModelNode> nodes = Lists.newArrayList();
@@ -784,11 +768,10 @@
 
     }
 
-    public static class SpVarReNamer extends QueryModelVisitorBase<RuntimeException> {
+    public static class SpVarReNamer extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final HashMap<String, String> hMap;
         private Map<String, Value> valMap;
-        private final ValueFactoryImpl vf = new ValueFactoryImpl();
 
         public SpVarReNamer(HashMap<String, String> hMap, Map<String, Value> valMap) {
             this.valMap = valMap;
@@ -798,7 +781,7 @@
         public void meet(Var var) {
             if (!var.isConstant() && hMap.containsKey(var.getName())) {
                 String val = hMap.get(var.getName());
-                if (val.startsWith("-const-")) {
+                if (VarNameUtils.isConstant(val)) {
                    var.setName(val);
                    var.setValue(valMap.get(val));
                    var.setAnonymous(true); //TODO this might be a hack -- when are Vars not anonymous?
@@ -813,11 +796,10 @@
     
     
     
-    public static class FilterVarReNamer extends QueryModelVisitorBase<RuntimeException> {
+    public static class FilterVarReNamer extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final HashMap<String, String> hMap;
         private Map<String, Value> valMap;
-        private final ValueFactoryImpl vf = new ValueFactoryImpl();
 
         public FilterVarReNamer(HashMap<String, String> hMap, Map<String, Value> valMap) {
             this.valMap = valMap;
@@ -830,7 +812,7 @@
             if (!(var.getParentNode() instanceof NAryValueOperator)) {
                 if (!var.isConstant() && hMap.containsKey(var.getName())) {
                     String val = hMap.get(var.getName());
-                    if (val.startsWith("-const-")) {
+                    if (VarNameUtils.isConstant(val)) {
                         var.replaceWith(new ValueConstant(valMap.get(val)));
                     } else {
                         var.setName(val);
@@ -852,7 +834,7 @@
                     Var var = (Var) v;
                     if (!(var.isConstant() && hMap.containsKey(var.getName()))) {
                         String val = hMap.get(var.getName());
-                        if (val.startsWith("-const-")) {
+                        if (VarNameUtils.isConstant(val)) {
                             newValues.add(new ValueConstant(valMap.get(val)));
                         } else {
                             var.setName(val);
@@ -874,7 +856,7 @@
     
     
 
-    public static class TupleVarRenamer extends QueryModelVisitorBase<RuntimeException> {
+    public static class TupleVarRenamer extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final HashMap<String, String> varChanges;
         private Map<String, Value> valMap;
@@ -918,7 +900,7 @@
 
     }
 
-    public static class VarCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class VarCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         public static List<String> process(QueryModelNode node) {
             VarCollector collector = new VarCollector();
@@ -952,7 +934,7 @@
         }
     }
     
-    public static class FilterVarValueCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class FilterVarValueCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         public static List<QueryModelNode> process(QueryModelNode node) {
             FilterVarValueCollector collector = new FilterVarValueCollector();
@@ -986,7 +968,7 @@
     
     
 
-    public static class NormalizeQueryVisitor extends QueryModelVisitorBase<Exception> {
+    public static class NormalizeQueryVisitor extends AbstractQueryModelVisitor<Exception> {
 
         private TreeMap<String, List<QueryModelNode>> map = new TreeMap<String, List<QueryModelNode>>();
         private TreeMap<String, Integer> varMap = new TreeMap<String, Integer>();
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AbstractPcjIndexSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AbstractPcjIndexSetProvider.java
index 984153a..b5dddbd 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AbstractPcjIndexSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AbstractPcjIndexSetProvider.java
@@ -34,7 +34,7 @@
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizerUtilities;
 import org.apache.rya.indexing.pcj.matching.PCJToSegmentConverter;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.annotations.VisibleForTesting;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AccumuloIndexSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AccumuloIndexSetProvider.java
index 1fa3677..96ee75c 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AccumuloIndexSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/pcj/matching/provider/AccumuloIndexSetProvider.java
@@ -41,9 +41,9 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriAdapter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriAdapter.java
index f637d0d..b6fe556 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriAdapter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriAdapter.java
@@ -41,12 +41,13 @@
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.indexing.entity.model.Entity;
 import org.apache.rya.indexing.entity.model.Property;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.joda.time.DateTime;
 import org.joda.time.format.ISODateTimeFormat;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.base.Charsets;
 import com.google.common.collect.HashBiMap;
@@ -60,8 +61,9 @@
  * Interface for serializing and deserializing Smart URIs.
  */
 public class SmartUriAdapter {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final String ENTITY_TYPE_MAP_URN = "urn://entityTypeMap";
-    private static final URI RYA_TYPES_URI = new URIImpl("urn://ryaTypes");
+    private static final IRI RYA_TYPES_URI = VF.createIRI("urn://ryaTypes");
 
     /**
      * Private constructor to prevent instantiation.
@@ -69,12 +71,12 @@
     private SmartUriAdapter() {
     }
 
-    private static URI createTypePropertiesUri(final ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> typeProperties) throws SmartUriException {
+    private static IRI createTypePropertiesUri(final ImmutableMap<RyaURI, ImmutableMap<RyaURI, Property>> typeProperties) throws SmartUriException {
         final List<NameValuePair> nameValuePairs = new ArrayList<>();
         for (final Entry<RyaURI, ImmutableMap<RyaURI, Property>> typeProperty : typeProperties.entrySet()) {
             final RyaURI type = typeProperty.getKey();
             final Map<RyaURI, Property> propertyMap = typeProperty.getValue();
-            final URI typeUri = createIndividualTypeWithPropertiesUri(type, propertyMap);
+            final IRI typeUri = createIndividualTypeWithPropertiesUri(type, propertyMap);
             final String keyString = type.getDataType().getLocalName();
             final String valueString = typeUri.getLocalName();
             nameValuePairs.add(new BasicNameValuePair(keyString, valueString));
@@ -92,24 +94,24 @@
             throw new SmartUriException("Unable to create type properties for the Smart URI", e);
         }
 
-        return new URIImpl(uriString);
+        return VF.createIRI(uriString);
     }
 
     private static String getShortNameForType(final RyaURI type) throws SmartUriException {
-        final String shortName = new URIImpl(type.getData()).getLocalName();
+        final String shortName = VF.createIRI(type.getData()).getLocalName();
         return shortName;
     }
 
 
     private static String addTypePrefixToUri(final String uriString, final String typePrefix) {
-        final String localName = new URIImpl(uriString).getLocalName();
+        final String localName = VF.createIRI(uriString).getLocalName();
         final String beginning = StringUtils.removeEnd(uriString, localName);
         final String formattedUriString = beginning + typePrefix + localName;
         return formattedUriString;
     }
 
     private static String removeTypePrefixFromUri(final String uriString, final String typePrefix) {
-        final String localName = new URIImpl(uriString).getLocalName();
+        final String localName = VF.createIRI(uriString).getLocalName();
         final String beginning = StringUtils.removeEnd(uriString, localName);
         final String replacement = localName.replaceFirst(typePrefix + ".", "");
         final String formattedUriString = beginning + replacement;
@@ -125,7 +127,7 @@
         return map;
     }
 
-    private static URI createTypeMapUri(final List<RyaURI> types) throws SmartUriException {
+    private static IRI createTypeMapUri(final List<RyaURI> types) throws SmartUriException {
         final List<NameValuePair> nameValuePairs = new ArrayList<>();
         for (final RyaURI type : types) {
             final String shortName = getShortNameForType(type);
@@ -144,10 +146,10 @@
             throw new SmartUriException("Unable to create type properties for the Smart URI", e);
         }
 
-        return new URIImpl(uriString);
+        return VF.createIRI(uriString);
     }
 
-    private static Map<RyaURI, String> convertUriToTypeMap(final URI typeMapUri) throws SmartUriException {
+    private static Map<RyaURI, String> convertUriToTypeMap(final IRI typeMapUri) throws SmartUriException {
         final Map<RyaURI, String> map = new HashMap<>();
         java.net.URI uri;
         try {
@@ -168,14 +170,14 @@
         return map;
     }
 
-    private static URI createIndividualTypeWithPropertiesUri(final RyaURI type, final Map<RyaURI, Property> map) throws SmartUriException {
+    private static IRI createIndividualTypeWithPropertiesUri(final RyaURI type, final Map<RyaURI, Property> map) throws SmartUriException {
         final List<NameValuePair> nameValuePairs = new ArrayList<>();
         for (final Entry<RyaURI, Property> entry : map.entrySet()) {
             final RyaURI key = entry.getKey();
             final Property property = entry.getValue();
 
             final RyaType ryaType = property.getValue();
-            final String keyString = (new URIImpl(key.getData())).getLocalName();
+            final String keyString = (VF.createIRI(key.getData())).getLocalName();
             final Value value = RyaToRdfConversions.convertValue(ryaType);
             final String valueString = value.stringValue();
             nameValuePairs.add(new BasicNameValuePair(keyString, valueString));
@@ -188,24 +190,24 @@
         try {
             final java.net.URI uri = uriBuilder.build();
             final String queryString = uri.getRawSchemeSpecificPart();
-            uriString = type.getData()/*new URIImpl(type.getData()).getLocalName()*/ + queryString;
+            uriString = type.getData()/*VF.createIRI(type.getData()).getLocalName()*/ + queryString;
         } catch (final URISyntaxException e) {
             throw new SmartUriException("Unable to create type URI with all its properties for the Smart URI", e);
         }
 
-        return new URIImpl(uriString);
+        return VF.createIRI(uriString);
     }
 
-    private static Entity convertMapToEntity(final RyaURI subject, final Map<RyaURI, Map<URI, Value>> map) {
+    private static Entity convertMapToEntity(final RyaURI subject, final Map<RyaURI, Map<IRI, Value>> map) {
         final Entity.Builder entityBuilder = Entity.builder();
         entityBuilder.setSubject(subject);
 
-        for (final Entry<RyaURI, Map<URI, Value>> typeEntry : map.entrySet()) {
+        for (final Entry<RyaURI, Map<IRI, Value>> typeEntry : map.entrySet()) {
             final RyaURI type = typeEntry.getKey();
-            final Map<URI, Value> subMap = typeEntry.getValue();
+            final Map<IRI, Value> subMap = typeEntry.getValue();
             entityBuilder.setExplicitType(type);
-            for (final Entry<URI, Value> entry : subMap.entrySet()) {
-                final URI uri = entry.getKey();
+            for (final Entry<IRI, Value> entry : subMap.entrySet()) {
+                final IRI uri = entry.getKey();
                 final Value value = entry.getValue();
                 final RyaURI ryaUri = new RyaURI(uri.stringValue());
                 final RyaURI ryaName = new RyaURI(uri.stringValue());
@@ -218,7 +220,7 @@
         return entity;
     }
 
-    public static RyaURI findSubject(final URI uri) throws SmartUriException {
+    public static RyaURI findSubject(final IRI uri) throws SmartUriException {
         final String uriString = uri.stringValue();
         return findSubject(uriString);
     }
@@ -256,18 +258,18 @@
 
 
     /**
-     * Serializes an {@link Entity} into a Smart {@link URI}.
+     * Serializes an {@link Entity} into a Smart {@link IRI}.
      * @param entity the {@link Entity} to serialize into a Smart URI.
-     * @return the Smart {@link URI}.
+     * @return the Smart {@link IRI}.
      * @throws SmartUriException
      */
-    public static URI serializeUriEntity(final Entity entity) throws SmartUriException {
-        final Map<URI, Value> objectMap = new LinkedHashMap<>();
+    public static IRI serializeUriEntity(final Entity entity) throws SmartUriException {
+        final Map<IRI, Value> objectMap = new LinkedHashMap<>();
 
         // Adds the entity's types to the Smart URI
         final List<RyaURI> typeIds = entity.getExplicitTypeIds();
         final Map<RyaURI, String> ryaTypeMap = createTypeMap(typeIds);
-        final URI ryaTypeMapUri = createTypeMapUri(typeIds);
+        final IRI ryaTypeMapUri = createTypeMapUri(typeIds);
         final RyaType valueRyaType = new RyaType(XMLSchema.ANYURI, ryaTypeMapUri.stringValue());
         final Value typeValue = RyaToRdfConversions.convertValue(valueRyaType);
         objectMap.put(RYA_TYPES_URI, typeValue);
@@ -285,7 +287,7 @@
                 final String valueString = property.getValue().getData();
                 final RyaType ryaType = property.getValue();
 
-                //final RyaType ryaType = new RyaType(new URIImpl(key.getData()), valueString);
+                //final RyaType ryaType = new RyaType(VF.createIRI(key.getData()), valueString);
 
                 final Value value = RyaToRdfConversions.convertValue(ryaType);
 
@@ -293,7 +295,7 @@
                 if (StringUtils.isNotBlank(typeShortName)) {
                     formattedKey = addTypePrefixToUri(formattedKey, typeShortName);
                 }
-                final URI uri = new URIImpl(formattedKey);
+                final IRI uri = VF.createIRI(formattedKey);
                 objectMap.put(uri, value);
             }
         }
@@ -305,11 +307,11 @@
      * Serializes a map into a URI.
      * @param subject the {@link RyaURI} subject of the Entity. Identifies the
      * thing that is being represented as an Entity.
-     * @param map the {@link Map} of {@link URI}s to {@link Value}s.
-     * @return the Smart {@link URI}.
+     * @param map the {@link Map} of {@link IRI}s to {@link Value}s.
+     * @return the Smart {@link IRI}.
      * @throws SmartUriException
      */
-    public static URI serializeUri(final RyaURI subject, final Map<URI, Value> map) throws SmartUriException {
+    public static IRI serializeUri(final RyaURI subject, final Map<IRI, Value> map) throws SmartUriException {
         final String subjectData = subject.getData();
         final int fragmentPosition = subjectData.indexOf("#");
         String prefix = subjectData;
@@ -331,15 +333,15 @@
         }
         final List<NameValuePair> nameValuePairs = new ArrayList<>();
 
-        for (final Entry<URI, Value> entry : map.entrySet()) {
-            final URI key = entry.getKey();
+        for (final Entry<IRI, Value> entry : map.entrySet()) {
+            final IRI key = entry.getKey();
             final Value value = entry.getValue();
             nameValuePairs.add(new BasicNameValuePair(key.getLocalName(), value.stringValue()));
         }
 
         uriBuilder.setParameters(nameValuePairs);
 
-        URI uri = null;
+        IRI uri = null;
         try {
             if (fragmentPosition > -1) {
                 final java.net.URI partialUri = uriBuilder.build();
@@ -347,10 +349,10 @@
                 final URIBuilder fragmentUriBuilder = new URIBuilder(new java.net.URI(prefix));
                 fragmentUriBuilder.setFragment(uriString);
                 final String fragmentUriString = fragmentUriBuilder.build().toString();
-                uri = new URIImpl(fragmentUriString);
+                uri = VF.createIRI(fragmentUriString);
             } else {
                 final String uriString = uriBuilder.build().toString();
-                uri = new URIImpl(uriString);
+                uri = VF.createIRI(uriString);
             }
         } catch (final URISyntaxException e) {
             throw new SmartUriException("Smart URI could not serialize the property map.", e);
@@ -361,11 +363,11 @@
 
     /**
      * Deserializes a URI into a map of URI's to values.
-     * @param uri the {@link URI}.
-     * @return the {@link Map} of {@link URI}s to {@link Value}s.
+     * @param uri the {@link IRI}.
+     * @return the {@link Map} of {@link IRI}s to {@link Value}s.
      * @throws SmartUriException
      */
-    public static Map<URI, Value> deserializeUri(final URI uri) throws SmartUriException {
+    public static Map<IRI, Value> deserializeUri(final IRI uri) throws SmartUriException {
         final String uriString = uri.stringValue();
         final int fragmentPosition = uriString.indexOf("#");
         String prefix = uriString.substring(0, fragmentPosition + 1);
@@ -386,28 +388,28 @@
         } catch (final URISyntaxException e) {
             throw new SmartUriException("Unable to deserialize Smart URI", e);
         }
-        final Map<URI, Value> map = new HashMap<>();
+        final Map<IRI, Value> map = new HashMap<>();
         final RyaURI subject = findSubject(uri.stringValue());
 
         final List<NameValuePair> parameters = uriBuilder.getQueryParams();
         Map<RyaURI, String> entityTypeMap = new LinkedHashMap<>();
         Map<String, RyaURI> invertedEntityTypeMap = new LinkedHashMap<>();
-        final Map<RyaURI, Map<URI, Value>> fullMap = new LinkedHashMap<>();
+        final Map<RyaURI, Map<IRI, Value>> fullMap = new LinkedHashMap<>();
         for (final NameValuePair pair : parameters) {
             final String keyString = pair.getName();
             final String valueString = pair.getValue();
 
-            final URI keyUri = new URIImpl(prefix + keyString);
+            final IRI keyUri = VF.createIRI(prefix + keyString);
             final String decoded;
             try {
                 decoded = URLDecoder.decode(valueString, Charsets.UTF_8.name());
             } catch (final UnsupportedEncodingException e) {
                 throw new SmartUriException("", e);
             }
-            final URI type = TypeDeterminer.determineType(decoded);
+            final IRI type = TypeDeterminer.determineType(decoded);
             if (type == XMLSchema.ANYURI) {
                 if (keyString.equals(RYA_TYPES_URI.getLocalName())) {
-                    entityTypeMap = convertUriToTypeMap(new URIImpl(decoded));
+                    entityTypeMap = convertUriToTypeMap(VF.createIRI(decoded));
                     invertedEntityTypeMap = HashBiMap.create(entityTypeMap).inverse();
                 }
             } else {
@@ -420,7 +422,7 @@
                 final Value value = RyaToRdfConversions.convertValue(ryaType);
 
                 final String formattedKeyUriString = removeTypePrefixFromUri(keyUri.stringValue(), keyPrefix);
-                final URI formattedKeyUri = new URIImpl(formattedKeyUriString);
+                final IRI formattedKeyUri = VF.createIRI(formattedKeyUriString);
 
                 map.put(formattedKeyUri, value);
             }
@@ -428,7 +430,7 @@
         return map;
     }
 
-    public static Entity deserializeUriEntity(final URI uri) throws SmartUriException {
+    public static Entity deserializeUriEntity(final IRI uri) throws SmartUriException {
         final String uriString = uri.stringValue();
         final int fragmentPosition = uriString.indexOf("#");
         String prefix = uriString.substring(0, fragmentPosition + 1);
@@ -455,22 +457,22 @@
         final List<NameValuePair> parameters = uriBuilder.getQueryParams();
         Map<RyaURI, String> entityTypeMap = new LinkedHashMap<>();
         Map<String, RyaURI> invertedEntityTypeMap = new LinkedHashMap<>();
-        final Map<RyaURI, Map<URI, Value>> fullMap = new LinkedHashMap<>();
+        final Map<RyaURI, Map<IRI, Value>> fullMap = new LinkedHashMap<>();
         for (final NameValuePair pair : parameters) {
             final String keyString = pair.getName();
             final String valueString = pair.getValue();
 
-            final URI keyUri = new URIImpl(prefix + keyString);
+            final IRI keyUri = VF.createIRI(prefix + keyString);
             final String decoded;
             try {
                 decoded = URLDecoder.decode(valueString, Charsets.UTF_8.name());
             } catch (final UnsupportedEncodingException e) {
                 throw new SmartUriException("", e);
             }
-            final URI type = TypeDeterminer.determineType(decoded);
+            final IRI type = TypeDeterminer.determineType(decoded);
             if (type == XMLSchema.ANYURI) {
                 if (keyString.equals(RYA_TYPES_URI.getLocalName())) {
-                    entityTypeMap = convertUriToTypeMap(new URIImpl(decoded));
+                    entityTypeMap = convertUriToTypeMap(VF.createIRI(decoded));
                     invertedEntityTypeMap = HashBiMap.create(entityTypeMap).inverse();
                 }
             } else {
@@ -483,11 +485,11 @@
                 final Value value = RyaToRdfConversions.convertValue(ryaType);
 
                 final String formattedKeyUriString = removeTypePrefixFromUri(keyUri.stringValue(), keyPrefix);
-                final URI formattedKeyUri = new URIImpl(formattedKeyUriString);
-                final Map<URI, Value> map = fullMap.get(keyCorrespondingType);
+                final IRI formattedKeyUri = VF.createIRI(formattedKeyUriString);
+                final Map<IRI, Value> map = fullMap.get(keyCorrespondingType);
 
                 if (map == null) {
-                    final Map<URI, Value> subMap = new HashMap<>();
+                    final Map<IRI, Value> subMap = new HashMap<>();
                     subMap.put(formattedKeyUri, value);
                     fullMap.put(keyCorrespondingType, subMap);
                 } else {
@@ -507,7 +509,7 @@
         private TypeDeterminer() {
         }
 
-        private static URI determineType(final String data) {
+        private static IRI determineType(final String data) {
             if (Ints.tryParse(data) != null) {
                 return XMLSchema.INTEGER;
             } else if (Doubles.tryParse(data) != null) {
@@ -564,7 +566,7 @@
         private static boolean isUri(final String data) {
             try {
                 final String decoded = URLDecoder.decode(data, Charsets.UTF_8.name());
-                new URIImpl(decoded);
+                VF.createIRI(decoded);
                 return true;
             } catch (final IllegalArgumentException | UnsupportedEncodingException e) {
                 // not a URI
@@ -573,12 +575,12 @@
         }
     }
 
-    public static Map<URI, Value> entityToValueMap(final Entity entity) {
-        final Map<URI, Value> map = new LinkedHashMap<>();
+    public static Map<IRI, Value> entityToValueMap(final Entity entity) {
+        final Map<IRI, Value> map = new LinkedHashMap<>();
         for (final Entry<RyaURI, ImmutableMap<RyaURI, Property>> entry : entity.getProperties().entrySet()) {
             for (final Entry<RyaURI, Property> property : entry.getValue().entrySet()) {
                 final RyaURI propertyKey = property.getKey();
-                final URI uri = new URIImpl(propertyKey.getData());
+                final IRI uri = VF.createIRI(propertyKey.getData());
                 final Property propertyValue = property.getValue();
                 final Value value = RyaToRdfConversions.convertValue(propertyValue.getValue());
                 map.put(uri, value);
@@ -588,15 +590,15 @@
     }
 
     /**
-     * Converts a {@link Map} of {@link URI}/{@link Value}s to a {@link Set} of
+     * Converts a {@link Map} of {@link IRI}/{@link Value}s to a {@link Set} of
      * {@link Property}s.
-     * @param map the {@link Map} of {@link URI}/{@link Value}.
+     * @param map the {@link Map} of {@link IRI}/{@link Value}.
      * @return the {@link Set} of {@link Property}s.
      */
-    public static Set<Property> mapToProperties(final Map<URI, Value> map) {
+    public static Set<Property> mapToProperties(final Map<IRI, Value> map) {
         final Set<Property> properties = new LinkedHashSet<>();
-        for (final Entry<URI, Value> entry : map.entrySet()) {
-            final URI uri = entry.getKey();
+        for (final Entry<IRI, Value> entry : map.entrySet()) {
+            final IRI uri = entry.getKey();
             final Value value = entry.getValue();
 
             final RyaURI ryaUri = new RyaURI(uri.stringValue());
@@ -608,10 +610,10 @@
         return properties;
     }
 
-    public static Map<URI, Value> propertiesToMap(final Set<Property> properties) {
-        final Map<URI, Value> map = new LinkedHashMap<>();
+    public static Map<IRI, Value> propertiesToMap(final Set<Property> properties) {
+        final Map<IRI, Value> map = new LinkedHashMap<>();
         for (final Property property : properties) {
-            final URI uri = new URIImpl(property.getName().getData());
+            final IRI uri = VF.createIRI(property.getName().getData());
             final Value value = RyaToRdfConversions.convertValue(property.getValue());
             map.put(uri, value);
         }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriStorage.java b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriStorage.java
index 1043d42..03c2dbb 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriStorage.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/SmartUriStorage.java
@@ -26,8 +26,8 @@
 import org.apache.rya.indexing.entity.model.TypedEntity;
 import org.apache.rya.indexing.entity.storage.mongo.ConvertingCursor;
 import org.calrissian.mango.collect.CloseableIterator;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Interface for interacting with a Smart URI's datastore.
@@ -37,10 +37,10 @@
      * Stores the map into the datastore.
      * @param subject the {@link RyaURI} subject of the Entity. Identifies the
      * thing that is being represented as an Entity.
-     * @param map the {@link Map} of {@link URI}s to {@link Value}s.
+     * @param map the {@link Map} of {@link IRI}s to {@link Value}s.
      * @throws SmartUriException
      */
-    public void storeEntity(final RyaURI subject, final Map<URI, Value> map) throws SmartUriException;
+    public void storeEntity(final RyaURI subject, final Map<IRI, Value> map) throws SmartUriException;
 
     /**
      * Stores the entity into the datastore.
@@ -69,10 +69,10 @@
     /**
      * Queries the datastore for the map.
      * @param type the type associated with the entity values.
-     * @param map the {@link Map} of {@link URI}s to {@link Value}s.
+     * @param map the {@link Map} of {@link IRI}s to {@link Value}s.
      * @return a {@link CloseableIterator} over the {@link TypedEntity}s that
      * match the search parameters.
      * @throws SmartUriException
      */
-   public ConvertingCursor<TypedEntity> queryEntity(final Type type, final Map<URI, Value> map) throws SmartUriException;
+    public ConvertingCursor<TypedEntity> queryEntity(final Type type, final Map<IRI, Value> map) throws SmartUriException;
 }
\ No newline at end of file
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/ApproxEqualsDetector.java b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/ApproxEqualsDetector.java
index c450951..fbd0aff 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/ApproxEqualsDetector.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/ApproxEqualsDetector.java
@@ -19,7 +19,7 @@
 package org.apache.rya.indexing.smarturi.duplication;
 
 import org.apache.rya.indexing.smarturi.SmartUriException;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 /**
  * Interface for detecting if two objects of type {@code T} are considered
@@ -57,10 +57,10 @@
     public Class<?> getTypeClass();
 
     /**
-     * @return the {@link URI} for the XML schema type this detector is used
+     * @return the {@link IRI} for the XML schema type this detector is used
      * for.
      */
-    public URI getXmlSchemaUri();
+    public IRI getXmlSchemaUri();
 
     /**
      * Checks if two string representations of objects are approximately equal.
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetector.java b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetector.java
index 220db30..1d17097 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetector.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetector.java
@@ -44,10 +44,10 @@
 import org.apache.rya.indexing.smarturi.SmartUriException;
 import org.apache.rya.indexing.smarturi.duplication.conf.DuplicateDataConfig;
 import org.calrissian.mango.types.exception.TypeEncodingException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.joda.time.DateTime;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -63,7 +63,7 @@
  * compared.
  */
 public class DuplicateDataDetector {
-    private final Map<URI, ApproxEqualsDetector<?>> uriMap = new HashMap<>();
+    private final Map<IRI, ApproxEqualsDetector<?>> uriMap = new HashMap<>();
     private final Map<Class<?>, ApproxEqualsDetector<?>> classMap = new HashMap<>();
 
     private boolean isDetectionEnabled;
@@ -137,7 +137,7 @@
      * if not specified.
      * @param stringTolerance the {@link String} tolerance value or {@code null}
      * if not specified.
-     * @param uriTolerance the {@link URI} tolerance value or {@code null} if
+     * @param uriTolerance the {@link IRI} tolerance value or {@code null} if
      * not specified.
      * @param equivalentTermsMap the {@link Map} of terms that are considered
      * equivalent to each other. (not {@code null})
@@ -224,13 +224,13 @@
 
     /**
      * Compares two Smart URI's to determine if they have nearly identical data.
-     * @param uri1 the first Smart {@link URI}. (not {@code null})
-     * @param uri2 the second Smart {@link URI}. (not {@code null})
+     * @param uri1 the first Smart {@link IRI}. (not {@code null})
+     * @param uri2 the second Smart {@link IRI}. (not {@code null})
      * @return {@code true} if the two Smart URI's have nearly identical data.
      * {@code false} otherwise.
      * @throws SmartUriException
      */
-    public boolean compareSmartUris(final URI uri1, final URI uri2) throws SmartUriException {
+    public boolean compareSmartUris(final IRI uri1, final IRI uri2) throws SmartUriException {
         requireNonNull(uri1);
         requireNonNull(uri2);
         final Entity entity1 = SmartUriAdapter.deserializeUriEntity(uri1);
@@ -270,7 +270,7 @@
                     final RyaType value2 = property2.getValue();
                     final String data1 = value1.getData();
                     final String data2 = value2.getData();
-                    final URI xmlSchemaUri1 = value1.getDataType();
+                    final IRI xmlSchemaUri1 = value1.getDataType();
                     final ApproxEqualsDetector<?> approxEqualsDetector = uriMap.get(xmlSchemaUri1);
                     if (approxEqualsDetector == null) {
                         throw new SmartUriException("No appropriate detector found for the type: " + xmlSchemaUri1);
@@ -328,7 +328,7 @@
         public boolean areObjectsApproxEquals(final Boolean lhs, final Boolean rhs) {
             // Should never be almost equals when tolerance is 0, only exactly equals
             // Otherwise if there's any tolerance specified everything is equal
-            return tolerance.getValue() == 0 ? Objects.equals(lhs, rhs) : true;
+            return tolerance.getValue() != 0 || Objects.equals(lhs, rhs);
         }
 
         @Override
@@ -347,7 +347,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.BOOLEAN;
         }
     }
@@ -412,7 +412,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.BYTE;
         }
     }
@@ -486,7 +486,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.DATE;
         }
     }
@@ -559,7 +559,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.DATETIME;
         }
     }
@@ -638,7 +638,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.DOUBLE;
         }
     }
@@ -718,7 +718,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.FLOAT;
         }
     }
@@ -783,7 +783,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.INTEGER;
         }
     }
@@ -848,7 +848,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.LONG;
         }
     }
@@ -913,7 +913,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.SHORT;
         }
     }
@@ -988,7 +988,7 @@
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.STRING;
         }
     }
@@ -997,7 +997,7 @@
      * Class to detect if two URIs are considered approximately equal to each
      * other.
      */
-    public static class UriApproxEqualsDetector implements ApproxEqualsDetector<URI> {
+    public static class UriApproxEqualsDetector implements ApproxEqualsDetector<IRI> {
         private static final Tolerance DEFAULT_TOLERANCE = new Tolerance(1.0, ToleranceType.DIFFERENCE);
         private final Tolerance tolerance;
 
@@ -1010,7 +1010,7 @@
         }
 
         @Override
-        public boolean areObjectsApproxEquals(final URI lhs, final URI rhs) {
+        public boolean areObjectsApproxEquals(final IRI lhs, final IRI rhs) {
             if (isOnlyOneNull(lhs, rhs)) {
                 return false;
             }
@@ -1049,17 +1049,17 @@
         }
 
         @Override
-        public URI convertStringToObject(final String string) throws SmartUriException {
-            return new URIImpl(string);
+        public IRI convertStringToObject(final String string) throws SmartUriException {
+            return SimpleValueFactory.getInstance().createIRI(string);
         }
 
         @Override
         public Class<?> getTypeClass() {
-            return URI.class;
+            return IRI.class;
         }
 
         @Override
-        public URI getXmlSchemaUri() {
+        public IRI getXmlSchemaUri() {
             return XMLSchema.ANYURI;
         }
     }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/MetadataNodeToSegmentConverter.java b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/MetadataNodeToSegmentConverter.java
index 9ee21d0..4b3322b 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/MetadataNodeToSegmentConverter.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/MetadataNodeToSegmentConverter.java
@@ -17,19 +17,19 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import org.apache.rya.indexing.external.matching.ExternalSetConverter;
 import org.apache.rya.indexing.external.matching.JoinSegment;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.ValueExpr;
-
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
 
 public class MetadataNodeToSegmentConverter implements ExternalSetConverter<StatementMetadataNode<?>> {
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/OWLReify.java b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/OWLReify.java
index 640f358..cb81773 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/OWLReify.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/OWLReify.java
@@ -17,31 +17,32 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
+
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
 
 public class OWLReify {
 
     /** http://www.w3.org/2002/07/owl#Annotation*/
-    public final static URI ANNOTATION;
+    public final static IRI ANNOTATION;
 
     /** http://www.w3.org/2002/07/owl#annotatedSource*/
-    public static final URI SOURCE;
+    public static final IRI SOURCE;
     
     /** http://www.w3.org/2002/07/owl#annotatedProperty*/
-    public static final URI PROPERTY;
+    public static final IRI PROPERTY;
     
     /** http://www.w3.org/2002/07/owl#annotatedTarget*/
-    public static final URI TARGET;
+    public static final IRI TARGET;
 
     static {
-        ValueFactory factory = ValueFactoryImpl.getInstance();
-        ANNOTATION = factory.createURI(OWL.NAMESPACE, "Annotation");
-        PROPERTY = factory.createURI(OWL.NAMESPACE, "annotatedProperty");
-        SOURCE = factory.createURI(OWL.NAMESPACE, "annotatedSource");
-        TARGET = factory.createURI(OWL.NAMESPACE, "annotatedTarget");
+        ValueFactory factory = SimpleValueFactory.getInstance();
+        ANNOTATION = factory.createIRI(OWL.NAMESPACE, "Annotation");
+        PROPERTY = factory.createIRI(OWL.NAMESPACE, "annotatedProperty");
+        SOURCE = factory.createIRI(OWL.NAMESPACE, "annotatedSource");
+        TARGET = factory.createIRI(OWL.NAMESPACE, "annotatedTarget");
     }
 }
     
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataExternalSetProvider.java b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataExternalSetProvider.java
index bfa0dfa..6571c83 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataExternalSetProvider.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataExternalSetProvider.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,11 +31,11 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.indexing.external.matching.ExternalSetProvider;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
@@ -100,8 +101,8 @@
         
         for (StatementPattern pattern : patterns) {
             Var var = pattern.getPredicateVar();
-            if (var.getValue() != null && var.getValue() instanceof URI) {
-                RyaURI uri = RdfToRyaConversions.convertURI((URI) var.getValue());
+            if (var.getValue() != null && var.getValue() instanceof IRI) {
+                RyaURI uri = RdfToRyaConversions.convertURI((IRI) var.getValue());
                 if(expectedURI.contains(uri) || metadataProperties.contains(uri)) {
                     finalPatterns.add(pattern);
                 }
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataNode.java b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataNode.java
index 363dba2..3d3b7ba 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataNode.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataNode.java
@@ -18,6 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static java.util.Objects.requireNonNull;
 
 import java.io.IOException;
@@ -45,24 +46,23 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
-import org.openrdf.model.BNode;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.EmptyIteration;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.EmptyIteration;
-
 /**
  * This class provides users with the ability to issue reified queries to Rya.
  * As opposed to a single triple representing a statement, a reified query
@@ -361,13 +361,13 @@
         RyaURI context = null;
 
         if (subjValue != null) {
-            Preconditions.checkArgument(subjValue instanceof URI);
-            subj = RdfToRyaConversions.convertURI((URI) subjValue);
+            Preconditions.checkArgument(subjValue instanceof IRI);
+            subj = RdfToRyaConversions.convertURI((IRI) subjValue);
         }
 
         if (predValue != null) {
-            Preconditions.checkArgument(predValue instanceof URI);
-            pred = RdfToRyaConversions.convertURI((URI) predValue);
+            Preconditions.checkArgument(predValue instanceof IRI);
+            pred = RdfToRyaConversions.convertURI((IRI) predValue);
         }
 
         if (objValue != null) {
@@ -375,7 +375,7 @@
         }
         
         if(contextValue != null) {
-            context = RdfToRyaConversions.convertURI((URI) contextValue);
+            context = RdfToRyaConversions.convertURI((IRI) contextValue);
         }
         return new RyaStatement(subj, pred, obj, context);
     }
@@ -480,7 +480,7 @@
      * This is an {@link CloseableIteration} class that serves a number of
      * purposes. It's primary purpose is to filter a CloseableIteration over
      * {@link Map.Entry<RyaStatement,BindingSet>} using a specified property Map
-     * from {@link RyaURI} to {@link org.openrdf.query.algebra.Var}. This
+     * from {@link RyaURI} to {@link org.eclipse.rdf4j.query.algebra.Var}. This
      * Iteration iterates over the Entries in the user specified Iteration,
      * comparing properties in the {@link StatementMetadata} Map contained in
      * the RyaStatements with the property Map for this class. If the properties
@@ -657,7 +657,7 @@
          * Builds the BindingSet from the specified RyaStatement by using the
          * StatementPattern for this class. This method checks whether
          * StatementPattern has a {@link Value} for each position
-         * {@link org.openrdf.query.algebra.Var} (Subject, Predicate, Object).
+         * {@link org.eclipse.rdf4j.query.algebra.Var} (Subject, Predicate, Object).
          * If it doesn't have a Value, a Binding is created from the
          * RyaStatement using the {@link RyaType} for the corresponding position
          * (Subject, Predicate, Object).
diff --git a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataOptimizer.java b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataOptimizer.java
index 02c174e..9207e26 100644
--- a/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataOptimizer.java
+++ b/extras/indexing/src/main/java/org/apache/rya/indexing/statement/metadata/matching/StatementMetadataOptimizer.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import org.apache.hadoop.conf.Configurable;
@@ -28,9 +29,9 @@
 import org.apache.rya.indexing.external.matching.ExternalSetProvider;
 import org.apache.rya.indexing.external.matching.QueryNodeListRater;
 import org.apache.rya.indexing.external.matching.QuerySegment;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.base.Optional;
 
diff --git a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailConfig.java b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailConfig.java
index 23b6ee7..43af1fb 100644
--- a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailConfig.java
+++ b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailConfig.java
@@ -1,16 +1,3 @@
-package org.apache.rya.sail.config;
-
-import org.openrdf.model.Graph;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.util.GraphUtil;
-import org.openrdf.model.util.GraphUtilException;
-import org.openrdf.sail.config.SailConfigException;
-import org.openrdf.sail.config.SailImplConfigBase;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -29,30 +16,41 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.sail.config;
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.util.GraphUtil;
+import org.eclipse.rdf4j.model.util.GraphUtilException;
+import org.eclipse.rdf4j.sail.config.AbstractSailImplConfig;
+import org.eclipse.rdf4j.sail.config.SailConfigException;
 
 /**
  * @deprecated Use {@link AccumuloRdfConfiguration} instead.
  */
 @Deprecated
-public class RyaAccumuloSailConfig extends SailImplConfigBase {
+public class RyaAccumuloSailConfig extends AbstractSailImplConfig {
 
     public static final String NAMESPACE = "http://rya.apache.org/RyaAccumuloSail/Config#";
 
-    public static final URI INSTANCE;
-    public static final URI USER;
-    public static final URI PASSWORD;
-    public static final URI ZOOKEEPERS;
-    public static final URI IS_MOCK;
+    public static final IRI INSTANCE;
+    public static final IRI USER;
+    public static final IRI PASSWORD;
+    public static final IRI ZOOKEEPERS;
+    public static final IRI IS_MOCK;
 
     static {
-        final ValueFactory factory = ValueFactoryImpl.getInstance();
-        USER = factory.createURI(NAMESPACE, "user");
-        PASSWORD = factory.createURI(NAMESPACE, "password");
-        INSTANCE = factory.createURI(NAMESPACE, "instance");
-        ZOOKEEPERS = factory.createURI(NAMESPACE, "zookeepers");
-        IS_MOCK = factory.createURI(NAMESPACE, "isMock");
+        final ValueFactory factory = SimpleValueFactory.getInstance();
+        USER = factory.createIRI(NAMESPACE, "user");
+        PASSWORD = factory.createIRI(NAMESPACE, "password");
+        INSTANCE = factory.createIRI(NAMESPACE, "instance");
+        ZOOKEEPERS = factory.createIRI(NAMESPACE, "zookeepers");
+        IS_MOCK = factory.createIRI(NAMESPACE, "isMock");
     }
 
     private String user = "root";
@@ -116,45 +114,45 @@
     }
 
     @Override
-    public Resource export(final Graph graph) {
-        final Resource implNode = super.export(graph);
+    public Resource export(final Model model) {
+        final Resource implNode = super.export(model);
 
         @SuppressWarnings("deprecation")
         final
-        ValueFactory v = graph.getValueFactory();
+        ValueFactory v = model.getValueFactory();
 
-        graph.add(implNode, USER, v.createLiteral(user));
-        graph.add(implNode, PASSWORD, v.createLiteral(password));
-        graph.add(implNode, INSTANCE, v.createLiteral(instance));
-        graph.add(implNode, ZOOKEEPERS, v.createLiteral(zookeepers));
-        graph.add(implNode, IS_MOCK, v.createLiteral(isMock));
+        model.add(implNode, USER, v.createLiteral(user));
+        model.add(implNode, PASSWORD, v.createLiteral(password));
+        model.add(implNode, INSTANCE, v.createLiteral(instance));
+        model.add(implNode, ZOOKEEPERS, v.createLiteral(zookeepers));
+        model.add(implNode, IS_MOCK, v.createLiteral(isMock));
 
         return implNode;
     }
 
     @Override
-    public void parse(final Graph graph, final Resource implNode) throws SailConfigException {
-        super.parse(graph, implNode);
+    public void parse(final Model model, final Resource implNode) throws SailConfigException {
+        super.parse(model, implNode);
         System.out.println("parsing");
 
         try {
-            final Literal userLit = GraphUtil.getOptionalObjectLiteral(graph, implNode, USER);
+            final Literal userLit = GraphUtil.getOptionalObjectLiteral(model, implNode, USER);
             if (userLit != null) {
                 setUser(userLit.getLabel());
             }
-            final Literal pwdLit = GraphUtil.getOptionalObjectLiteral(graph, implNode, PASSWORD);
+            final Literal pwdLit = GraphUtil.getOptionalObjectLiteral(model, implNode, PASSWORD);
             if (pwdLit != null) {
                 setPassword(pwdLit.getLabel());
             }
-            final Literal instLit = GraphUtil.getOptionalObjectLiteral(graph, implNode, INSTANCE);
+            final Literal instLit = GraphUtil.getOptionalObjectLiteral(model, implNode, INSTANCE);
             if (instLit != null) {
                 setInstance(instLit.getLabel());
             }
-            final Literal zooLit = GraphUtil.getOptionalObjectLiteral(graph, implNode, ZOOKEEPERS);
+            final Literal zooLit = GraphUtil.getOptionalObjectLiteral(model, implNode, ZOOKEEPERS);
             if (zooLit != null) {
                 setZookeepers(zooLit.getLabel());
             }
-            final Literal mockLit = GraphUtil.getOptionalObjectLiteral(graph, implNode, IS_MOCK);
+            final Literal mockLit = GraphUtil.getOptionalObjectLiteral(model, implNode, IS_MOCK);
             if (mockLit != null) {
                 setMock(Boolean.parseBoolean(mockLit.getLabel()));
             }
diff --git a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailFactory.java b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailFactory.java
index 6f4d6c5..492dcbe 100644
--- a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaAccumuloSailFactory.java
@@ -1,17 +1,3 @@
-package org.apache.rya.sail.config;
-
-import org.apache.accumulo.core.client.AccumuloException;
-import org.apache.accumulo.core.client.AccumuloSecurityException;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.Instance;
-import org.apache.accumulo.core.client.ZooKeeperInstance;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.config.SailConfigException;
-import org.openrdf.sail.config.SailFactory;
-import org.openrdf.sail.config.SailImplConfig;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -30,12 +16,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.sail.config;
 
+import org.apache.accumulo.core.client.AccumuloException;
+import org.apache.accumulo.core.client.AccumuloSecurityException;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Instance;
+import org.apache.accumulo.core.client.ZooKeeperInstance;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.config.SailConfigException;
+import org.eclipse.rdf4j.sail.config.SailFactory;
+import org.eclipse.rdf4j.sail.config.SailImplConfig;
 
 /**
  * @deprecated Use {@link RyaSailFactory} instead.
diff --git a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaSailFactory.java b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaSailFactory.java
index 56af9b4..15c89eb 100644
--- a/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaSailFactory.java
+++ b/extras/indexing/src/main/java/org/apache/rya/sail/config/RyaSailFactory.java
@@ -47,8 +47,8 @@
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/indexing/src/main/resources/META-INF/services/org.openrdf.sail.config.SailFactory b/extras/indexing/src/main/resources/META-INF/services/org.eclipse.rdf4j.sail.config.SailFactory
similarity index 97%
rename from extras/indexing/src/main/resources/META-INF/services/org.openrdf.sail.config.SailFactory
rename to extras/indexing/src/main/resources/META-INF/services/org.eclipse.rdf4j.sail.config.SailFactory
index 56f4407..df3610d 100644
--- a/extras/indexing/src/main/resources/META-INF/services/org.openrdf.sail.config.SailFactory
+++ b/extras/indexing/src/main/resources/META-INF/services/org.eclipse.rdf4j.sail.config.SailFactory
@@ -1 +1 @@
-org.apache.rya.sail.config.RyaAccumuloSailFactory
+org.apache.rya.sail.config.RyaAccumuloSailFactory
\ No newline at end of file
diff --git a/extras/indexing/src/main/resources/org/openrdf/repository/config/RyaAccumuloSail.ttl b/extras/indexing/src/main/resources/org/eclipse/rdf4j/repository/config/RyaAccumuloSail.ttl
similarity index 100%
rename from extras/indexing/src/main/resources/org/openrdf/repository/config/RyaAccumuloSail.ttl
rename to extras/indexing/src/main/resources/org/eclipse/rdf4j/repository/config/RyaAccumuloSail.ttl
diff --git a/extras/indexing/src/test/java/org/apache/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java b/extras/indexing/src/test/java/org/apache/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
index a237118..7108ae6 100644
--- a/extras/indexing/src/test/java/org/apache/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/accumulo/documentIndex/DocumentIndexIntersectingIteratorTest.java
@@ -23,18 +23,6 @@
 import java.util.List;
 import java.util.Map;
 
-import junit.framework.Assert;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.RyaTableMutationsFactory;
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.apache.rya.api.resolver.RyaContext;
-import org.apache.rya.api.resolver.RyaToRdfConversions;
-import org.apache.rya.api.resolver.RyaTripleContext;
-import org.apache.rya.indexing.accumulo.entity.EntityCentricIndex;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchWriter;
@@ -49,29 +37,40 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.RyaTableMutationsFactory;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.apache.rya.api.resolver.RyaContext;
+import org.apache.rya.api.resolver.RyaToRdfConversions;
+import org.apache.rya.api.resolver.RyaTripleContext;
+import org.apache.rya.indexing.accumulo.entity.EntityCentricIndex;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
 
 import com.google.common.primitives.Bytes;
 
 
 public class DocumentIndexIntersectingIteratorTest {
 
-    
- 
+
+
     private Connector accCon;
     String tablename = "table";
-    
+
 
     @Before
     public void init() throws RepositoryException, TupleQueryResultHandlerException, QueryEvaluationException,
@@ -81,433 +80,427 @@
         accCon.tableOperations().create(tablename);
 
     }
-    
-    
-    
-    
-    
-    
-    
-@Test
+
+    @Test
     public void testBasicColumnObj() throws Exception {
 
         BatchWriter bw = null;
 
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                m.put(new Text("cf"), new Text(null + "\u0000" + "obj" + "\u0000" + "cq"), new Value(new byte[0]));
-                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
-
-                if (i == 30 || i == 60) {
-                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ"), new Value(new byte[0]));
-                }
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq" ));
-            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ" ));
-            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj" + "\u0000" + "CQ" ));
-
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 1****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(2, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-    
-    
-    
-@Test
-    public void testBasicColumnObjPrefix()  throws Exception {
-
-        BatchWriter bw = null;
-
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" ), new Value(new byte[0]));
-                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
-
-                if (i == 30 || i == 60) {
-                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ" ), new Value(new byte[0]));
-                }
-                
-                
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq"));
-            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ"));
-            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj"));
-
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-            
-            tc3.setIsPrefix(true);
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 2****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(2, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-@Test
-    public void testBasicColumnSubjObjPrefix() throws Exception {
-
-        BatchWriter bw = null;
-
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + "\u0000" + "cq"), new Value(new byte[0]));
-                m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
-
-                if (i == 30 ) {
-                    m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ"), new Value(new byte[0]));
-                }
-                
-                if  (i == 60) {
-                    m.put(new Text("CF"), new Text(null + "\u0000" +"subj" + "\u0000" + "CQ"), new Value(new byte[0]));
-                }
-                
-                
-                
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq" ));
-            TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ"));
-            TextColumn tc3 = new TextColumn(new Text("CF"), new Text("subj"));
-
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-            
-            tc3.setIsPrefix(true);
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 3****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(1, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-@Test
-    public void testOneHundredColumnSubjObj() throws Exception {
-
-        BatchWriter bw = null;
-
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                
-                for(int j= 0; j < 100; j++) {
-                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
-                }
-                
-                if (i == 30 ) {
-                    m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
-                }
-                
-                if  (i == 60) {
-                    m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
-                }
-                
-                
-                
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
-            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
-            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj" + "\u0000" + "cq" + 100));
-
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 4****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(1, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-@Test
-    public void testOneHundredColumnObjPrefix() throws Exception {
-
-        BatchWriter bw = null;
-
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                
-                for(int j= 0; j < 100; j++) {
-                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j ), new Value(new byte[0]));
-                }
-                
-                if (i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
-                }
-                
-                
-                
-                
-                
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
-            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
-            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj"));
-
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-            
-            tc3.setIsPrefix(true);
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 5****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(4, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-    
-    
-    
-@Test
-    public void testOneHundredColumnMultipleEntriesPerSubject() throws Exception {
-
-        BatchWriter bw = null;
-
-            bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-            for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-                
-                for(int j= 0; j < 100; j++) {
-                    m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j ), new Value(new byte[0]));
-                }
-                
-                if (i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
-                    m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
-                }
-                
-                
-                
-                
-                
-
-                bw.addMutation(m);
-
-            }
-            
-            DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-            TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20 ));
-            TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
-            TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj"));
-
-            tc3.setIsPrefix(true);
-            
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            dii.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 6****************************");
-            for (Map.Entry<Key, Value> e : scan) {
-                System.out.println(e);
-                results++;
-            }
-            
-            
-            Assert.assertEquals(8, results);
-
-            
-            
-
-    }
-    
-    
-    
-    
-
-@Test
-public void testOneHundredColumnSubjObjPrefix() throws Exception {
-
-    BatchWriter bw = null;
-
         bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
 
         for (int i = 0; i < 100; i++) {
 
             Mutation m = new Mutation(new Text("" + i));
-            
-            for(int j= 0; j < 100; j++) {
-                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
+            m.put(new Text("cf"), new Text(null + "\u0000" + "obj" + "\u0000" + "cq"), new Value(new byte[0]));
+            m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
+
+            if (i == 30 || i == 60) {
+                m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ"), new Value(new byte[0]));
             }
-            
-            if (i == 30 || i == 60 || i == 90 || i == 99) {
-                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
-                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
-            }
-            
-            
-            
-            
-            
 
             bw.addMutation(m);
 
         }
-        
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq" ));
+        TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ" ));
+        TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj" + "\u0000" + "CQ" ));
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 1****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(2, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+    @Test
+    public void testBasicColumnObjPrefix()  throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+            m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" ), new Value(new byte[0]));
+            m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
+
+            if (i == 30 || i == 60) {
+                m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ" ), new Value(new byte[0]));
+            }
+
+
+
+            bw.addMutation(m);
+
+        }
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq"));
+        TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ"));
+        TextColumn tc3 = new TextColumn(new Text("CF"), new Text("obj"));
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        tc3.setIsPrefix(true);
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 2****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(2, results);
+
+
+
+
+    }
+
+
+
+
+    @Test
+    public void testBasicColumnSubjObjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+            m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + "\u0000" + "cq"), new Value(new byte[0]));
+            m.put(new Text("cF"), new Text(null + "\u0000" +"obj" + "\u0000" + "cQ"), new Value(new byte[0]));
+
+            if (i == 30 ) {
+                m.put(new Text("CF"), new Text(null + "\u0000" +"obj" + "\u0000" + "CQ"), new Value(new byte[0]));
+            }
+
+            if  (i == 60) {
+                m.put(new Text("CF"), new Text(null + "\u0000" +"subj" + "\u0000" + "CQ"), new Value(new byte[0]));
+            }
+
+
+
+
+            bw.addMutation(m);
+
+        }
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq" ));
+        TextColumn tc2 = new TextColumn(new Text("cF"), new Text("obj" + "\u0000" + "cQ"));
+        TextColumn tc3 = new TextColumn(new Text("CF"), new Text("subj"));
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        tc3.setIsPrefix(true);
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 3****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(1, results);
+
+
+
+
+    }
+
+
+
+
+    @Test
+    public void testOneHundredColumnSubjObj() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
+            }
+
+            if (i == 30 ) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
+            }
+
+            if  (i == 60) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 100), new Value(new byte[0]));
+            }
+
+
+
+
+            bw.addMutation(m);
+
+        }
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj" + "\u0000" + "cq" + 100));
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 4****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(1, results);
+
+
+
+
+    }
+
+
+
+
+    @Test
+    public void testOneHundredColumnObjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j ), new Value(new byte[0]));
+            }
+
+            if (i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+            }
+
+
+
+
+
+
+            bw.addMutation(m);
+
+        }
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj"));
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        tc3.setIsPrefix(true);
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 5****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(4, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+    @Test
+    public void testOneHundredColumnMultipleEntriesPerSubject() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j ), new Value(new byte[0]));
+            }
+
+            if (i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
+            }
+
+
+
+
+
+
+            bw.addMutation(m);
+
+        }
+
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20 ));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 6****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(8, results);
+
+
+
+
+    }
+
+
+
+
+
+    @Test
+    public void testOneHundredColumnSubjObjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            for(int j= 0; j < 100; j++) {
+                m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
+            }
+
+            if (i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
+                m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
+            }
+
+
+
+
+
+
+            bw.addMutation(m);
+
+        }
+
         DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
         TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
         TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
         TextColumn tc3 = new TextColumn(new Text("cf" + 100), new Text("subj"));
 
         tc3.setIsPrefix(true);
-        
+
         TextColumn[] tc = new TextColumn[3];
         tc[0] = tc1;
         tc[1] = tc2;
@@ -526,49 +519,49 @@
             System.out.println(e);
             results++;
         }
-        
-        
+
+
         Assert.assertEquals(4, results);
 
-        
-        
 
-}
+
+
+    }
 
 
 
 
 
 
-@Test
-public void testOneHundredColumnSubjObjPrefixFourTerms() throws Exception {
+    @Test
+    public void testOneHundredColumnSubjObjPrefixFourTerms() throws Exception {
 
-    BatchWriter bw = null;
+        BatchWriter bw = null;
 
         bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
 
         for (int i = 0; i < 100; i++) {
 
             Mutation m = new Mutation(new Text("" + i));
-            
+
             for(int j= 0; j < 100; j++) {
                 m.put(new Text("cf" + j), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
             }
-            
+
             if (i == 30 || i == 60 || i == 90 || i == 99) {
                 m.put(new Text("cf" + 100), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + (100 + i)), new Value(new byte[0]));
                 m.put(new Text("cf" + 100), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + (100 + i + 1)), new Value(new byte[0]));
             }
-            
-            
-            
-            
-            
+
+
+
+
+
 
             bw.addMutation(m);
 
         }
-        
+
         DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
         TextColumn tc1 = new TextColumn(new Text("cf" + 20), new Text("obj" + "\u0000" + "cq" + 20));
         TextColumn tc2 = new TextColumn(new Text("cf" + 50), new Text("obj" + "\u0000" + "cq" + 50));
@@ -577,7 +570,7 @@
 
         tc3.setIsPrefix(true);
         tc4.setIsPrefix(true);
-        
+
         TextColumn[] tc = new TextColumn[4];
         tc[0] = tc1;
         tc[1] = tc2;
@@ -597,41 +590,41 @@
             System.out.println(e);
             results++;
         }
-        
-        
+
+
         Assert.assertEquals(4, results);
 
-        
-        
 
-}
+
+
+    }
 
 
 
 
 
 
-//@Test
-public void testOneHundredColumnSameCf() throws Exception {
+    //@Test
+    public void testOneHundredColumnSameCf() throws Exception {
 
-    BatchWriter bw = null;
+        BatchWriter bw = null;
 
         bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
 
         for (int i = 0; i < 100; i++) {
 
             Mutation m = new Mutation(new Text("" + i));
-            
+
             for(int j= 0; j < 100; j++) {
                 m.put(new Text("cf"), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + j), new Value(new byte[0]));
             }
-             
-            
+
+
 
             bw.addMutation(m);
 
         }
-        
+
         DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
         TextColumn tc1 = new TextColumn(new Text("cf" ), new Text("obj" + "\u0000" + "cq" + 20));
         TextColumn tc2 = new TextColumn(new Text("cf"), new Text("obj" + "\u0000" + "cq" + 50));
@@ -639,7 +632,7 @@
         TextColumn tc4 = new TextColumn(new Text("cf"), new Text("obj"));
 
         tc4.setIsPrefix(true);
-        
+
         TextColumn[] tc = new TextColumn[4];
         tc[0] = tc1;
         tc[1] = tc2;
@@ -659,1235 +652,374 @@
             //System.out.println(e);
             results++;
         }
-        
-        
+
+
         Assert.assertEquals(10000, results);
 
-        
-        
 
-}
 
 
+    }
 
 
 
-@Test
-public void testGeneralStarQuery() throws Exception {
 
-  BatchWriter bw = null;
 
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+    @Test
+    public void testGeneralStarQuery() throws Exception {
 
-     
-      
-      for (int i = 0; i < 100; i++) {
+        BatchWriter bw = null;
 
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                
-                
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
 
-                if(i == 30 || i == 60 ) {
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                }
-                
-                bw.addMutation(m);
 
-      }
-     
-      
-      DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3));
 
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
+        for (int i = 0; i < 100; i++) {
 
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+            Mutation m = new Mutation(new Text("" + i));
 
-      dii.setColumnFamilies(is, tc);
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
 
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.addScanIterator(is);
 
-      int results = 0;
-      System.out.println("************************Test 10****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(2, results);
 
-      
-      
-
-}
-
-
-
-
-
-
-
-@Test
-public void testGeneralStarQuerySubjPrefix() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-      DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      dii.setColumnFamilies(is, tc);
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 11****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(4, results);
-
-      
-      
-
-}
-
-
-
-
-
-@Test
-public void testGeneralStarQueryMultipleSubjPrefix() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 12****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(12, results);
-
-      
-      
-
-}
-
-
-
-
-@Test
-public void testFixedRangeColumnValidateExact() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3));
-      TextColumn tc4 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 4));
-      TextColumn tc5 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 5));
-
-
-      
-      TextColumn[] tc = new TextColumn[5];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-      tc[3] = tc4;
-      tc[4] = tc5;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.setRange(Range.exact(new Text("" + 30)));
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 14****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(1, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-@Test
-public void testLubmLikeTest() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m1 = new Mutation(new Text("ProfessorA" + i));
-                Mutation m2= new Mutation(new Text("ProfessorB" + i));
-    
-                m1.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom"), 
-                        new Text(null + "\u0000" +"object" + "\u0000" + "http://www.University" + i + ".edu"), new Value(new byte[0]));
-                m2.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom"), 
-                        new Text(null + "\u0000" +"object" + "\u0000" + "http://www.University" + i + ".edu"), new Value(new byte[0]));
-                m1.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"), 
-                        new Text(null + "\u0000" +"object" + "\u0000" + "http://Course" + i), new Value(new byte[0]));
-                m2.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"), 
-                        new Text(null + "\u0000" +"object" + "\u0000" + "http://Course" + i), new Value(new byte[0]));
-            
-                
-                bw.addMutation(m1);
-                bw.addMutation(m2);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom" ), 
-              new Text("object" + "\u0000" + "http://www.University" + 30 + ".edu"));
-      TextColumn tc2 = new TextColumn(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"), 
-              new Text("object" + "\u0000" + "http://Course" + 30));
-      
-
-
-      
-      TextColumn[] tc = new TextColumn[2];
-      tc[0] = tc1;
-      tc[1] = tc2;
-     
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 15****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(2, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-@Test
-public void testFixedRangeColumnValidateSubjPrefix() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-      scan.setRange(Range.exact(new Text("" + 30)));
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 13****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(3, results);
-
-      
-      
-
-}
-
-
-
-
-
-//@Test
-//public void testRangeBound() {
-//
-//  BatchWriter bw = null;
-//
-//  try {
-//    
-//
-//     
-//      
-//      for (int i = 0; i < 100; i++) {
-//
-//                Mutation m = new Mutation(new Text("" + i));
-//    
-//                m.put(new Text("cf" + 1), new Text("obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-//                m.put(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-//                m.put(new Text("cf" + 1), new Text("subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-//                m.put(new Text("cf" + 2), new Text("subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-//                
-//                
-//
-//                if(i == 30 || i == 60 || i == 90 || i == 99) {
-//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
-//                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-//                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
-//                }
-//                
-//                bw.addMutation(m);
-//
-//      }
-//     
-//    
-//      
-//     Text cf = new Text("cf" + 3); 
-//     Text cq = new Text("obj" + "\u0000" + "cq" + 3);
-//    
-//      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-//      scan.fetchColumn(cf, cq );
-//      scan.setRange(new Range());
-//      
-//
-//      int results = 0;
-//      System.out.println("************************Test 14****************************");
-//      for (Map.Entry<Key, Value> e : scan) {
-//          System.out.println(e);
-//          results++;
-//      }
-//      
-//      
-//      
-//
-//      
-//      
-//  } catch (MutationsRejectedException e) {
-//      // TODO Auto-generated catch block
-//      e.printStackTrace();
-//  } catch (TableNotFoundException e) {
-//      // TODO Auto-generated catch block
-//      e.printStackTrace();
-//  }
-//
-//}
-
-
-
-  
-
-@Test
-public void testContext1() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" + "obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
-                 
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-      DocumentIndexIntersectingIterator.setContext(is, "context1");
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 14****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(8, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-
-@Test
-public void testContext2() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context3" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
-                 
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-      DocumentIndexIntersectingIterator.setContext(is, "context2");
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 15****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(0, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-
-
-@Test
-public void testContext3() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context1"), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context1"), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context2"), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context2"), new Value(new byte[0]));
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context3" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
-                 
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-      DocumentIndexIntersectingIterator.setContext(is, "context2");
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 16****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(4, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-
-
-
-@Test
-public void testContext4() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    
-                 
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-     
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 17****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(8, results);
-
-      
-      
-
-
-}
-
-
-
-
-
-@Test
-public void testContext5() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("" + i));
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text(null + "\u0000" + "obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text(null + "\u0000" + "obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
-                
-
-                if(i == 30 || i == 60 || i == 90 || i == 99) {
-                    m.put(new Text("cf" + 3), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    m.put(new Text("cf" + 3), new Text(null + "\u0000"  + "obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
-                    
-                 
-                }
-                
-                bw.addMutation(m);
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
-      TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
-
-      tc3.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[3];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      tc[2] = tc3;
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-     
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 18****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(12, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-@Test
-public void testContext6() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 100; i++) {
-
-                Mutation m = new Mutation(new Text("row" + i));
-               
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-     
-                
-                bw.addMutation(m);
-                
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("subj" ));
-      
-
-      tc1.setIsPrefix(true);
-      tc2.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[2];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-      DocumentIndexIntersectingIterator.setContext(is, "context2");
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 19****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(100, results);
-
-      
-      
-
-}
-
-
-
-@Test
-public void testContext7() throws Exception {
-
-  BatchWriter bw = null;
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 10; i++) {
-
-                Mutation m = new Mutation(new Text("row" + i));
-               
-    
-                m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 100 + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
-                m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 100+i), new Value(new byte[0]));
-     
-                
-                bw.addMutation(m);
-                
-
-      }
-     
-      
-     
-      TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
-      TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" ));
-      
-
-      tc1.setIsPrefix(true);
-      tc2.setIsPrefix(true);
-      
-      TextColumn[] tc = new TextColumn[2];
-      tc[0] = tc1;
-      tc[1] = tc2;
-      
-    
-
-      IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-      DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-      
-
-      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-     
-      scan.addScanIterator(is);
-
-      int results = 0;
-      System.out.println("************************Test 20****************************");
-      for (Map.Entry<Key, Value> e : scan) {
-          System.out.println(e);
-          results++;
-      }
-      
-      
-      Assert.assertEquals(40, results);
-
-      
-      
-
-}
-
-
-
-
-
-
-
-@Test
-public void testSerialization1() throws Exception {
-
-  BatchWriter bw = null;
-  AccumuloRdfConfiguration acc = new AccumuloRdfConfiguration();
-  acc.set(AccumuloRdfConfiguration.CONF_ADDITIONAL_INDEXERS, EntityCentricIndex.class.getName());
-  RyaTableMutationsFactory rtm = new RyaTableMutationsFactory(RyaTripleContext.getInstance(acc));
-
-      bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
-
-     
-      
-      for (int i = 0; i < 20; i++) {
-                  
-          
-                RyaStatement rs1 = new RyaStatement(new RyaURI("uri:" + i ), new RyaURI("uri:cf1"), new RyaType(XMLSchema.STRING, "cq1"));
-                RyaStatement rs2 = new RyaStatement(new RyaURI("uri:" + i ), new RyaURI("uri:cf2"), new RyaType(XMLSchema.STRING, "cq2"));
-                RyaStatement rs3 = null;
-                RyaStatement rs4 = null;
-               
-                if(i == 5 || i == 15) {
-                    rs3 = new RyaStatement(new RyaURI("uri:" +i ), new RyaURI("uri:cf3"), new RyaType(XMLSchema.INTEGER,Integer.toString(i)));
-                    rs4 = new RyaStatement(new RyaURI("uri:" +i ), new RyaURI("uri:cf3"), new RyaType(XMLSchema.STRING,Integer.toString(i)));
-                }
-                
-
-                
-                Collection<Mutation> m1 = EntityCentricIndex.createMutations(rs1);
-                for (Mutation m : m1) {
-                    bw.addMutation(m);
-                }
-                Collection<Mutation> m2 = EntityCentricIndex.createMutations(rs2);
-                for (Mutation m : m2) {
-                    bw.addMutation(m);
-                }
-                if (rs3 != null) {
-                    Collection<Mutation> m3 = EntityCentricIndex.createMutations(rs3);
-                    for (Mutation m : m3) {
-                        bw.addMutation(m);
-                    }
-                }
-                if (rs4 != null) {
-                    Collection<Mutation> m4 = EntityCentricIndex.createMutations(rs4);
-                    for (Mutation m : m4) {
-                        bw.addMutation(m);
-                    }
-                }
-     
-                
-                
-                
-
-      }
-     
-      String q1 = "" //
-              + "SELECT ?X ?Y1 ?Y2 " //
-              + "{"//
-              +  "?X <uri:cf1> ?Y1 ."//
-              +  "?X <uri:cf2> ?Y2 ."//
-              +  "?X <uri:cf3> 5 ."//
-              +  "}";
-      
-      
-      String q2 = "" //
-              + "SELECT ?X ?Y1 ?Y2 " //
-              + "{"//
-              +  "?X <uri:cf1> ?Y1  ."//
-              +  "?X <uri:cf2> ?Y2 ."//
-              +  "?X <uri:cf3> \"15\" ."//
-              +  "}";
-      
-           
-      
-            SPARQLParser parser = new SPARQLParser();
-
-            ParsedQuery pq1 = parser.parseQuery(q1, null);
-            ParsedQuery pq2 = parser.parseQuery(q2, null);
-
-            TupleExpr te1 = pq1.getTupleExpr();
-            TupleExpr te2 = pq2.getTupleExpr();
-
-            List<StatementPattern> spList1 = StatementPatternCollector.process(te1);
-            List<StatementPattern> spList2 = StatementPatternCollector.process(te2);
-
-            System.out.println(spList1);
-            System.out.println(spList2);
-
-            RyaType rt1 = RdfToRyaConversions.convertValue(spList1.get(2).getObjectVar().getValue());
-            RyaType rt2 = RdfToRyaConversions.convertValue(spList2.get(2).getObjectVar().getValue());
-            
-            RyaURI predURI1 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(0).getPredicateVar().getValue());
-            RyaURI predURI2 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(1).getPredicateVar().getValue());
-            RyaURI predURI3 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(2).getPredicateVar().getValue());
-            
-//            System.out.println("to string" + spList1.get(2).getObjectVar().getValue().stringValue());
-//            System.out.println("converted obj" + rt1.getData());
-//            System.out.println("equal: " + rt1.getData().equals(spList1.get(2).getObjectVar().getValue().stringValue()));
-            
-            
-            System.out.println(rt1);
-            System.out.println(rt2);
-
-            RyaContext rc = RyaContext.getInstance();
-
-            byte[][] b1 = rc.serializeType(rt1);
-            byte[][] b2 = rc.serializeType(rt2);
-
-            byte[] b3 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), b1[0], b1[1]);
-            byte[] b4 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), b2[0], b2[1]);
-
-            System.out.println(new String(b3));
-            System.out.println(new String(b4));
-
-            TextColumn tc1 = new TextColumn(new Text(predURI1.getData()), new Text("object"));
-            TextColumn tc2 = new TextColumn(new Text(predURI2.getData()), new Text("object"));
-            TextColumn tc3 = new TextColumn(new Text(predURI3.getData()), new Text(b3));
-
-            tc1.setIsPrefix(true);
-            tc2.setIsPrefix(true);
-      
-            TextColumn[] tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
-
-            IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
-
-            DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
-
-            Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
-
-            scan.addScanIterator(is);
-
-            int results = 0;
-            System.out.println("************************Test 21****************************");
-            Text t = null;
-            for (Map.Entry<Key, Value> e : scan) {
-                t = e.getKey().getColumnQualifier();
-                System.out.println(e);
-                results++;
+            if(i == 30 || i == 60 ) {
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
             }
 
-            Assert.assertEquals(1, results);
-            String [] s = t.toString().split("\u001D" + "\u001E");
-            String[] s1 = s[2].split("\u0000");
-            RyaType rt = rc.deserialize(s1[2].getBytes());
-            System.out.println("Rya type is " + rt);
-            org.openrdf.model.Value v = RyaToRdfConversions.convertValue(rt);
-            Assert.assertTrue(v.equals(spList1.get(2).getObjectVar().getValue()));
+            bw.addMutation(m);
 
-            tc1 = new TextColumn(new Text(predURI1.getData()), new Text("object"));
-            tc2 = new TextColumn(new Text(predURI2.getData()), new Text("object"));
-            tc3 = new TextColumn(new Text(predURI3.getData()), new Text(b4));
+        }
 
-            tc1.setIsPrefix(true);
-            tc2.setIsPrefix(true);
 
-            tc = new TextColumn[3];
-            tc[0] = tc1;
-            tc[1] = tc2;
-            tc[2] = tc3;
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3));
 
-            is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
 
-            DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
 
-            scan = accCon.createScanner(tablename, new Authorizations("auths"));
 
-            scan.addScanIterator(is);
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
 
-            results = 0;
-            System.out.println("************************Test 21****************************");
-            
-            for (Map.Entry<Key, Value> e : scan) {
-                t = e.getKey().getColumnQualifier();
-                System.out.println(e);
-                results++;
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 10****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(2, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+    @Test
+    public void testGeneralStarQuerySubjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
             }
 
-            Assert.assertEquals(1, results);
-            s = t.toString().split("\u001D" + "\u001E");
-            s1 = s[2].split("\u0000");
-            rt = rc.deserialize(s1[2].getBytes());
-            System.out.println("Rya type is " + rt);
-            v = RyaToRdfConversions.convertValue(rt);
-            Assert.assertTrue(v.equals(spList2.get(2).getObjectVar().getValue()));
-            
-            
+            bw.addMutation(m);
+
+        }
 
 
-}
+        DocumentIndexIntersectingIterator dii = new DocumentIndexIntersectingIterator();
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        dii.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 11****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(4, results);
+
+
+
+
+    }
+
+
+
+
+
+    @Test
+    public void testGeneralStarQueryMultipleSubjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 12****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(12, results);
+
+
+
+
+    }
+
+
+
+
+    @Test
+    public void testFixedRangeColumnValidateExact() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3));
+        TextColumn tc4 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 4));
+        TextColumn tc5 = new TextColumn(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 5));
+
+
+
+        TextColumn[] tc = new TextColumn[5];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+        tc[3] = tc4;
+        tc[4] = tc5;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.setRange(Range.exact(new Text("" + 30)));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 14****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(1, results);
+
+
+
+
+    }
+
+
+
+
+
+
+    @Test
+    public void testLubmLikeTest() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m1 = new Mutation(new Text("ProfessorA" + i));
+            Mutation m2= new Mutation(new Text("ProfessorB" + i));
+
+            m1.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom"),
+                    new Text(null + "\u0000" +"object" + "\u0000" + "http://www.University" + i + ".edu"), new Value(new byte[0]));
+            m2.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom"),
+                    new Text(null + "\u0000" +"object" + "\u0000" + "http://www.University" + i + ".edu"), new Value(new byte[0]));
+            m1.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"),
+                    new Text(null + "\u0000" +"object" + "\u0000" + "http://Course" + i), new Value(new byte[0]));
+            m2.put(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"),
+                    new Text(null + "\u0000" +"object" + "\u0000" + "http://Course" + i), new Value(new byte[0]));
+
+
+            bw.addMutation(m1);
+            bw.addMutation(m2);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#doctoralDegreeFrom" ),
+                new Text("object" + "\u0000" + "http://www.University" + 30 + ".edu"));
+        TextColumn tc2 = new TextColumn(new Text("http://swat.cse.lehigh.edu/onto/univ-bench.owl#teacherOf"),
+                new Text("object" + "\u0000" + "http://Course" + 30));
+
+
+
+
+        TextColumn[] tc = new TextColumn[2];
+        tc[0] = tc1;
+        tc[1] = tc2;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 15****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(2, results);
+
+
+
+
+    }
 
 
 
@@ -1897,7 +1029,868 @@
 
 
 
-    
-    
+
+
+
+
+
+
+
+
+    @Test
+    public void testFixedRangeColumnValidateSubjPrefix() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000" +"subj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("subj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+        scan.setRange(Range.exact(new Text("" + 30)));
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 13****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(3, results);
+
+
+
+
+    }
+
+
+
+
+
+    //@Test
+    //public void testRangeBound() {
+    //
+    //  BatchWriter bw = null;
+    //
+    //  try {
+    //
+    //
+    //
+    //
+    //      for (int i = 0; i < 100; i++) {
+    //
+    //                Mutation m = new Mutation(new Text("" + i));
+    //
+    //                m.put(new Text("cf" + 1), new Text("obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+    //                m.put(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+    //                m.put(new Text("cf" + 1), new Text("subj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+    //                m.put(new Text("cf" + 2), new Text("subj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+    //
+    //
+    //
+    //                if(i == 30 || i == 60 || i == 90 || i == 99) {
+    //                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+    //                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+    //                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+    //                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 4), new Value(new byte[0]));
+    //                    m.put(new Text("cf" + 3), new Text("obj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+    //                    m.put(new Text("cf" + 3), new Text("subj" + "\u0000" + "cq" + 5), new Value(new byte[0]));
+    //                }
+    //
+    //                bw.addMutation(m);
+    //
+    //      }
+    //
+    //
+    //
+    //     Text cf = new Text("cf" + 3);
+    //     Text cq = new Text("obj" + "\u0000" + "cq" + 3);
+    //
+    //      Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+    //      scan.fetchColumn(cf, cq );
+    //      scan.setRange(new Range());
+    //
+    //
+    //      int results = 0;
+    //      System.out.println("************************Test 14****************************");
+    //      for (Map.Entry<Key, Value> e : scan) {
+    //          System.out.println(e);
+    //          results++;
+    //      }
+    //
+    //
+    //
+    //
+    //
+    //
+    //  } catch (MutationsRejectedException e) {
+    //      // TODO Auto-generated catch block
+    //      e.printStackTrace();
+    //  } catch (TableNotFoundException e) {
+    //      // TODO Auto-generated catch block
+    //      e.printStackTrace();
+    //  }
+    //
+    //}
+
+
+
+
+
+    @Test
+    public void testContext1() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000" + "obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+        DocumentIndexIntersectingIterator.setContext(is, "context1");
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 14****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(8, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+    @Test
+    public void testContext2() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context3" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+        DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 15****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(0, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+
+    @Test
+    public void testContext3() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context1"), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context1"), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 1 + "\u0000" + "context2"), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2 + "\u0000" + "context2"), new Value(new byte[0]));
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 4 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context3" + "\u0000" +"obj" + "\u0000" + "cq" + 5 ), new Value(new byte[0]));
+
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+        DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 16****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(4, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+
+
+    @Test
+    public void testContext4() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context2" + "\u0000" +"obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+
+
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 17****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(8, results);
+
+
+
+
+
+    }
+
+
+
+
+
+    @Test
+    public void testContext5() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("" + i));
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 1), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 2), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text(null + "\u0000" + "obj" + "\u0000" + "cq" + 1 ), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text(null + "\u0000" + "obj" + "\u0000" + "cq" + 2 ), new Value(new byte[0]));
+
+
+            if(i == 30 || i == 60 || i == 90 || i == 99) {
+                m.put(new Text("cf" + 3), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 3), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+                m.put(new Text("cf" + 3), new Text(null + "\u0000"  + "obj" + "\u0000" + "cq" + 3 ), new Value(new byte[0]));
+
+
+            }
+
+            bw.addMutation(m);
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" + "\u0000" + "cq" + 1));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" + "\u0000" + "cq" + 2));
+        TextColumn tc3 = new TextColumn(new Text("cf" + 3), new Text("obj"));
+
+        tc3.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 18****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(12, results);
+
+
+
+
+    }
+
+
+
+
+
+
+    @Test
+    public void testContext6() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 100; i++) {
+
+            Mutation m = new Mutation(new Text("row" + i));
+
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "subj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+
+
+            bw.addMutation(m);
+
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("subj" ));
+
+
+        tc1.setIsPrefix(true);
+        tc2.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[2];
+        tc[0] = tc1;
+        tc[1] = tc2;
+
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+        DocumentIndexIntersectingIterator.setContext(is, "context2");
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 19****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(100, results);
+
+
+
+
+    }
+
+
+
+    @Test
+    public void testContext7() throws Exception {
+
+        BatchWriter bw = null;
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 10; i++) {
+
+            Mutation m = new Mutation(new Text("row" + i));
+
+
+            m.put(new Text("cf" + 1), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context1" + "\u0000"  + "obj" + "\u0000" + "cq" + 100 + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 1), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + i), new Value(new byte[0]));
+            m.put(new Text("cf" + 2), new Text("context2" + "\u0000"  + "obj" + "\u0000" + "cq" + 100+i), new Value(new byte[0]));
+
+
+            bw.addMutation(m);
+
+
+        }
+
+
+
+        TextColumn tc1 = new TextColumn(new Text("cf" + 1 ), new Text("obj" ));
+        TextColumn tc2 = new TextColumn(new Text("cf" + 2), new Text("obj" ));
+
+
+        tc1.setIsPrefix(true);
+        tc2.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[2];
+        tc[0] = tc1;
+        tc[1] = tc2;
+
+
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 20****************************");
+        for (Map.Entry<Key, Value> e : scan) {
+            System.out.println(e);
+            results++;
+        }
+
+
+        Assert.assertEquals(40, results);
+
+
+
+
+    }
+
+
+
+
+
+
+
+    @Test
+    public void testSerialization1() throws Exception {
+
+        BatchWriter bw = null;
+        AccumuloRdfConfiguration acc = new AccumuloRdfConfiguration();
+        acc.set(AccumuloRdfConfiguration.CONF_ADDITIONAL_INDEXERS, EntityCentricIndex.class.getName());
+        RyaTableMutationsFactory rtm = new RyaTableMutationsFactory(RyaTripleContext.getInstance(acc));
+
+        bw = accCon.createBatchWriter(tablename, 500L * 1024L * 1024L, Long.MAX_VALUE, 30);
+
+
+
+        for (int i = 0; i < 20; i++) {
+
+
+            RyaStatement rs1 = new RyaStatement(new RyaURI("uri:" + i ), new RyaURI("uri:cf1"), new RyaType(XMLSchema.STRING, "cq1"));
+            RyaStatement rs2 = new RyaStatement(new RyaURI("uri:" + i ), new RyaURI("uri:cf2"), new RyaType(XMLSchema.STRING, "cq2"));
+            RyaStatement rs3 = null;
+            RyaStatement rs4 = null;
+
+            if(i == 5 || i == 15) {
+                rs3 = new RyaStatement(new RyaURI("uri:" +i ), new RyaURI("uri:cf3"), new RyaType(XMLSchema.INTEGER,Integer.toString(i)));
+                rs4 = new RyaStatement(new RyaURI("uri:" +i ), new RyaURI("uri:cf3"), new RyaType(XMLSchema.STRING,Integer.toString(i)));
+            }
+
+
+
+            Collection<Mutation> m1 = EntityCentricIndex.createMutations(rs1);
+            for (Mutation m : m1) {
+                bw.addMutation(m);
+            }
+            Collection<Mutation> m2 = EntityCentricIndex.createMutations(rs2);
+            for (Mutation m : m2) {
+                bw.addMutation(m);
+            }
+            if (rs3 != null) {
+                Collection<Mutation> m3 = EntityCentricIndex.createMutations(rs3);
+                for (Mutation m : m3) {
+                    bw.addMutation(m);
+                }
+            }
+            if (rs4 != null) {
+                Collection<Mutation> m4 = EntityCentricIndex.createMutations(rs4);
+                for (Mutation m : m4) {
+                    bw.addMutation(m);
+                }
+            }
+
+
+
+
+
+        }
+
+        String q1 = "" //
+                + "SELECT ?X ?Y1 ?Y2 " //
+                + "{"//
+                +  "?X <uri:cf1> ?Y1 ."//
+                +  "?X <uri:cf2> ?Y2 ."//
+                +  "?X <uri:cf3> 5 ."//
+                +  "}";
+
+
+        String q2 = "" //
+                + "SELECT ?X ?Y1 ?Y2 " //
+                + "{"//
+                +  "?X <uri:cf1> ?Y1  ."//
+                +  "?X <uri:cf2> ?Y2 ."//
+                +  "?X <uri:cf3> \"15\" ."//
+                +  "}";
+
+
+
+        SPARQLParser parser = new SPARQLParser();
+
+        ParsedQuery pq1 = parser.parseQuery(q1, null);
+        ParsedQuery pq2 = parser.parseQuery(q2, null);
+
+        TupleExpr te1 = pq1.getTupleExpr();
+        TupleExpr te2 = pq2.getTupleExpr();
+
+        List<StatementPattern> spList1 = StatementPatternCollector.process(te1);
+        List<StatementPattern> spList2 = StatementPatternCollector.process(te2);
+
+        System.out.println(spList1);
+        System.out.println(spList2);
+
+        RyaType rt1 = RdfToRyaConversions.convertValue(spList1.get(2).getObjectVar().getValue());
+        RyaType rt2 = RdfToRyaConversions.convertValue(spList2.get(2).getObjectVar().getValue());
+
+        RyaURI predURI1 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(0).getPredicateVar().getValue());
+        RyaURI predURI2 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(1).getPredicateVar().getValue());
+        RyaURI predURI3 = (RyaURI) RdfToRyaConversions.convertValue(spList1.get(2).getPredicateVar().getValue());
+
+        //            System.out.println("to string" + spList1.get(2).getObjectVar().getValue().stringValue());
+        //            System.out.println("converted obj" + rt1.getData());
+        //            System.out.println("equal: " + rt1.getData().equals(spList1.get(2).getObjectVar().getValue().stringValue()));
+
+
+        System.out.println(rt1);
+        System.out.println(rt2);
+
+        RyaContext rc = RyaContext.getInstance();
+
+        byte[][] b1 = rc.serializeType(rt1);
+        byte[][] b2 = rc.serializeType(rt2);
+
+        byte[] b3 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), b1[0], b1[1]);
+        byte[] b4 = Bytes.concat("object".getBytes(), "\u0000".getBytes(), b2[0], b2[1]);
+
+        System.out.println(new String(b3));
+        System.out.println(new String(b4));
+
+        TextColumn tc1 = new TextColumn(new Text(predURI1.getData()), new Text("object"));
+        TextColumn tc2 = new TextColumn(new Text(predURI2.getData()), new Text("object"));
+        TextColumn tc3 = new TextColumn(new Text(predURI3.getData()), new Text(b3));
+
+        tc1.setIsPrefix(true);
+        tc2.setIsPrefix(true);
+
+        TextColumn[] tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        IteratorSetting is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        Scanner scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        int results = 0;
+        System.out.println("************************Test 21****************************");
+        Text t = null;
+        for (Map.Entry<Key, Value> e : scan) {
+            t = e.getKey().getColumnQualifier();
+            System.out.println(e);
+            results++;
+        }
+
+        Assert.assertEquals(1, results);
+        String [] s = t.toString().split("\u001D" + "\u001E");
+        String[] s1 = s[2].split("\u0000");
+        RyaType rt = rc.deserialize(s1[2].getBytes());
+        System.out.println("Rya type is " + rt);
+        org.eclipse.rdf4j.model.Value v = RyaToRdfConversions.convertValue(rt);
+        Assert.assertTrue(v.equals(spList1.get(2).getObjectVar().getValue()));
+
+        tc1 = new TextColumn(new Text(predURI1.getData()), new Text("object"));
+        tc2 = new TextColumn(new Text(predURI2.getData()), new Text("object"));
+        tc3 = new TextColumn(new Text(predURI3.getData()), new Text(b4));
+
+        tc1.setIsPrefix(true);
+        tc2.setIsPrefix(true);
+
+        tc = new TextColumn[3];
+        tc[0] = tc1;
+        tc[1] = tc2;
+        tc[2] = tc3;
+
+        is = new IteratorSetting(30, "fii", DocumentIndexIntersectingIterator.class);
+
+        DocumentIndexIntersectingIterator.setColumnFamilies(is, tc);
+
+        scan = accCon.createScanner(tablename, new Authorizations("auths"));
+
+        scan.addScanIterator(is);
+
+        results = 0;
+        System.out.println("************************Test 21****************************");
+
+        for (Map.Entry<Key, Value> e : scan) {
+            t = e.getKey().getColumnQualifier();
+            System.out.println(e);
+            results++;
+        }
+
+        Assert.assertEquals(1, results);
+        s = t.toString().split("\u001D" + "\u001E");
+        s1 = s[2].split("\u0000");
+        rt = rc.deserialize(s1[2].getBytes());
+        System.out.println("Rya type is " + rt);
+        v = RyaToRdfConversions.convertValue(rt);
+        Assert.assertTrue(v.equals(spList2.get(2).getObjectVar().getValue()));
+
+
+
+
+    }
+
+
+
+
+
+
+
+
+
+
+
 
 }
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
index 10d24d1..ed359f4 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloAddUserIT.java
@@ -32,12 +32,12 @@
 import org.apache.rya.api.instance.RyaDetails;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
 
 import com.google.common.collect.ImmutableList;
 
@@ -147,7 +147,7 @@
             sailConn = sail.getConnection();
 
             final ValueFactory vf = sail.getValueFactory();
-            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+            sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"));
 
         } catch(final RuntimeException e) {
             final Throwable cause = e.getCause();
@@ -198,7 +198,7 @@
 
             final ValueFactory vf = sail.getValueFactory();
             sailConn.begin();
-            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+            sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"));
             sailConn.close();
 
         } finally {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
index 78b4f52..2a6fbd5 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloBatchUpdatePCJIT.java
@@ -34,12 +34,12 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
 
 /**
  * Integration tests the methods of {@link AccumuloBatchUpdatePCJ}.
@@ -82,23 +82,23 @@
 
             final SailConnection sailConn = sail.getConnection();
             sailConn.begin();
-            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:Bob"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:David"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:Eve"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:Frank"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:George"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-            sailConn.addStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:David"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:George"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+            sailConn.addStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
 
-            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:David"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:Eve"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:Frank"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-            sailConn.addStatement(vf.createURI("urn:George"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:green"));
-            sailConn.addStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:brown"));
+            sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:David"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+            sailConn.addStatement(vf.createIRI("urn:George"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:green"));
+            sailConn.addStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:brown"));
             sailConn.commit();
             sailConn.close();
 
@@ -113,27 +113,27 @@
             final Set<BindingSet> expectedResults = new HashSet<>();
 
             MapBindingSet bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Alice"));
+            bs.addBinding("name", vf.createIRI("urn:Alice"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Bob"));
+            bs.addBinding("name", vf.createIRI("urn:Bob"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Charlie"));
+            bs.addBinding("name", vf.createIRI("urn:Charlie"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:David"));
+            bs.addBinding("name", vf.createIRI("urn:David"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Eve"));
+            bs.addBinding("name", vf.createIRI("urn:Eve"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Frank"));
+            bs.addBinding("name", vf.createIRI("urn:Frank"));
             expectedResults.add(bs);
 
             final Set<BindingSet> results = new HashSet<>();
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJIT.java
index 3463a02..3f5f5be 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloCreatePCJIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -34,14 +34,13 @@
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails.PCJUpdateStrategy;
 import org.apache.rya.indexing.pcj.fluo.api.ListQueryIds;
-import org.apache.rya.indexing.pcj.fluo.app.IncUpdateDAO;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -88,16 +87,16 @@
 
             // Insert some statements into Rya.
             final ValueFactory vf = ryaRepo.getValueFactory();
-            ryaConn.add(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-            ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-            ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+            ryaConn.add(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+            ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+            ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
 
-            ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin"));
+            ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin"));
 
-            ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-            ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-            ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-            ryaConn.add(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+            ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+            ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+            ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+            ryaConn.add(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
 
             // Verify the correct results were exported.
             fluo.waitForObservers();
@@ -105,12 +104,12 @@
             final Set<BindingSet> results = Sets.newHashSet( pcjStorage.listResults(pcjId) );
 
             final MapBindingSet bob = new MapBindingSet();
-            bob.addBinding("x", vf.createURI("http://Bob"));
+            bob.addBinding("x", vf.createIRI("http://Bob"));
 
             final MapBindingSet charlie = new MapBindingSet();
-            charlie.addBinding("x", vf.createURI("http://Charlie"));
+            charlie.addBinding("x", vf.createIRI("http://Charlie"));
 
-            final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(bob, charlie);
+            final Set<BindingSet> expected = Sets.newHashSet(bob, charlie);
 
             assertEquals(expected, results);
         }
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
index 59ee546..ae64abb 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloDeletePCJIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -37,11 +37,11 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryException;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryException;
 
 import com.google.common.collect.Sets;
 
@@ -70,16 +70,16 @@
 
         // Insert some statements into Rya.
         final ValueFactory vf = ryaRepo.getValueFactory();
-        ryaConn.add(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
 
-        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin"));
+        ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin"));
 
-        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
 
         // Verify the correct results were exported.
         fluo.waitForObservers();
@@ -89,12 +89,12 @@
             final Set<BindingSet> results = Sets.newHashSet( pcjStorage.listResults(pcjId) );
 
             final MapBindingSet bob = new MapBindingSet();
-            bob.addBinding("x", vf.createURI("http://Bob"));
+            bob.addBinding("x", vf.createIRI("http://Bob"));
 
             final MapBindingSet charlie = new MapBindingSet();
-            charlie.addBinding("x", vf.createURI("http://Charlie"));
+            charlie.addBinding("x", vf.createIRI("http://Charlie"));
 
-            final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(bob, charlie);
+            final Set<BindingSet> expected = Sets.newHashSet(bob, charlie);
             assertEquals(expected, results);
 
 
@@ -155,16 +155,16 @@
     
         // Insert some statements into Rya.
         final ValueFactory vf = ryaRepo.getValueFactory();
-        ryaConn.add(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
-        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
+        ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve"));
     
-        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin"));
+        ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin"));
     
-        ryaConn.add(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
-        ryaConn.add(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
+        ryaConn.add(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://TacoJoint"));
     
         // Verify the correct results were exported.
         fluo.waitForObservers();
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
index f5d1923..9b2926e 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloLoadStatementsFileIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -40,11 +40,11 @@
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.rio.RDFFormat;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.rio.RDFFormat;
 
 /**
  * Integration tests the methods of {@link AccumuloLoadStatementsFile}.
@@ -90,12 +90,12 @@
         ryaClient.getLoadStatementsFile().loadStatements(getRyaInstanceName(), Paths.get("src/test/resources/example.ttl"), RDFFormat.TURTLE);
 
         // Verify that the statements were loaded.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final List<Statement> expected = new ArrayList<>();
-        expected.add( vf.createStatement(vf.createURI("http://example#alice"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#bob")) );
-        expected.add( vf.createStatement(vf.createURI("http://example#bob"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#charlie")) );
-        expected.add( vf.createStatement(vf.createURI("http://example#charlie"), vf.createURI("http://example#likes"), vf.createURI("http://example#icecream")) );
+        expected.add( vf.createStatement(vf.createIRI("http://example#alice"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#bob")) );
+        expected.add( vf.createStatement(vf.createIRI("http://example#bob"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#charlie")) );
+        expected.add( vf.createStatement(vf.createIRI("http://example#charlie"), vf.createIRI("http://example#likes"), vf.createIRI("http://example#icecream")) );
 
         final List<Statement> statements = new ArrayList<>();
 
@@ -124,7 +124,7 @@
     }
 
     private boolean isRyaMetadataStatement(final ValueFactory vf, final Statement statement) {
-        return statement.getPredicate().equals( vf.createURI("urn:org.apache.rya/2012/05#version") ) ||
-                statement.getPredicate().equals( vf.createURI("urn:org.apache.rya/2012/05#rts") );
+        return statement.getPredicate().equals( vf.createIRI("urn:org.apache.rya/2012/05#version") ) ||
+                statement.getPredicate().equals( vf.createIRI("urn:org.apache.rya/2012/05#rts") );
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
index 224f70d..35e1210 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/AccumuloRemoveUserIT.java
@@ -32,10 +32,10 @@
 import org.apache.rya.api.instance.RyaDetails;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
 
 import com.google.common.collect.ImmutableList;
 
@@ -131,7 +131,7 @@
             sailConn = sail.getConnection();
 
             final ValueFactory vf = sail.getValueFactory();
-            sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob"));
+            sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob"));
 
         } catch(final RuntimeException e) {
             final Throwable cause = e.getCause();
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/FluoITBase.java b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/FluoITBase.java
index 7277fe0..1ef38aa 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/FluoITBase.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/accumulo/FluoITBase.java
@@ -67,14 +67,14 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.apache.zookeeper.ClientCnxn;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
 
 /**
  * Integration tests that ensure the Fluo application processes PCJs results
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJIT.java
index 7933374..1d796fe 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoBatchUpdatePCJIT.java
@@ -36,12 +36,12 @@
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjStorage;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the methods of {@link AccumuloBatchUpdatePCJ}.
@@ -68,25 +68,25 @@
                 .build());
 
         // Load some statements into the Rya instance.
-        final ValueFactory vf = ValueFactoryImpl.getInstance();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = new ArrayList<>();
-        statements.add(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:Frank"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:George"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
-        statements.add(vf.createStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:likes"), vf.createURI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:George"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream")));
 
-        statements.add(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:Frank"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue")));
-        statements.add(vf.createStatement(vf.createURI("urn:George"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:green")));
-        statements.add(vf.createStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:brown")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue")));
+        statements.add(vf.createStatement(vf.createIRI("urn:George"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:green")));
+        statements.add(vf.createStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:brown")));
         ryaClient.getLoadStatements().loadStatements(conf.getRyaInstanceName(), statements);
 
         try(final PrecomputedJoinStorage pcjStorage = new MongoPcjStorage(getMongoClient(), conf.getRyaInstanceName())) {
@@ -101,27 +101,27 @@
             final Set<BindingSet> expectedResults = new HashSet<>();
 
             MapBindingSet bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Alice"));
+            bs.addBinding("name", vf.createIRI("urn:Alice"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Bob"));
+            bs.addBinding("name", vf.createIRI("urn:Bob"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Charlie"));
+            bs.addBinding("name", vf.createIRI("urn:Charlie"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:David"));
+            bs.addBinding("name", vf.createIRI("urn:David"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Eve"));
+            bs.addBinding("name", vf.createIRI("urn:Eve"));
             expectedResults.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("name", vf.createURI("urn:Frank"));
+            bs.addBinding("name", vf.createIRI("urn:Frank"));
             expectedResults.add(bs);
 
             final Set<BindingSet> results = new HashSet<>();
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQueryIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQueryIT.java
index a1fee6f..a009b2a 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQueryIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoExecuteSparqlQueryIT.java
@@ -27,13 +27,13 @@
 import org.apache.rya.api.client.Install.InstallConfiguration;
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the methods of {@link }.
@@ -82,36 +82,36 @@
      */
     private List<Statement> makeTestStatements() {
         final List<Statement> loadMe = new ArrayList<>();
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
-        loadMe.add(vf.createStatement(vf.createURI("http://example#alice"), vf.createURI("http://example#talksTo"), vf
-                .createURI("http://example#bob")));
-        loadMe.add(vf.createStatement(vf.createURI("http://example#bob"), vf.createURI("http://example#talksTo"), vf
-                .createURI("http://example#charlie")));
-        loadMe.add(vf.createStatement(vf.createURI("http://example#charlie"), vf.createURI("http://example#likes"), vf
-                .createURI("http://example#icecream")));
+        loadMe.add(vf.createStatement(vf.createIRI("http://example#alice"), vf.createIRI("http://example#talksTo"), vf
+                .createIRI("http://example#bob")));
+        loadMe.add(vf.createStatement(vf.createIRI("http://example#bob"), vf.createIRI("http://example#talksTo"), vf
+                .createIRI("http://example#charlie")));
+        loadMe.add(vf.createStatement(vf.createIRI("http://example#charlie"), vf.createIRI("http://example#likes"), vf
+                .createIRI("http://example#icecream")));
         return loadMe;
     }
 
     private List<BindingSet> makeExpectedResults() {
         final List<BindingSet> expected = new ArrayList<>();
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("a", vf.createURI("http://example#alice"));
-        bs.addBinding("b", vf.createURI("http://example#talksTo"));
-        bs.addBinding("c", vf.createURI("http://example#bob"));
+        bs.addBinding("a", vf.createIRI("http://example#alice"));
+        bs.addBinding("b", vf.createIRI("http://example#talksTo"));
+        bs.addBinding("c", vf.createIRI("http://example#bob"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("a", vf.createURI("http://example#bob"));
-        bs.addBinding("b", vf.createURI("http://example#talksTo"));
-        bs.addBinding("c", vf.createURI("http://example#charlie"));
+        bs.addBinding("a", vf.createIRI("http://example#bob"));
+        bs.addBinding("b", vf.createIRI("http://example#talksTo"));
+        bs.addBinding("c", vf.createIRI("http://example#charlie"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("a", vf.createURI("http://example#charlie"));
-        bs.addBinding("b", vf.createURI("http://example#likes"));
-        bs.addBinding("c", vf.createURI("http://example#icecream"));
+        bs.addBinding("a", vf.createIRI("http://example#charlie"));
+        bs.addBinding("b", vf.createIRI("http://example#likes"));
+        bs.addBinding("c", vf.createIRI("http://example#icecream"));
         expected.add(bs);
 
         return expected;
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
index 2ecaec0..1eedc68 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsFileIT.java
@@ -30,11 +30,11 @@
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.mongodb.MongoITBase;
 import org.bson.Document;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.rio.RDFFormat;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.rio.RDFFormat;
 
 import com.mongodb.client.MongoCursor;
 /**
@@ -72,12 +72,12 @@
                 RDFFormat.TURTLE);
 
         // Verify that the statements were loaded.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final Set<Statement> expected = new HashSet<>();
-        expected.add(vf.createStatement(vf.createURI("http://example#alice"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#bob")));
-        expected.add(vf.createStatement(vf.createURI("http://example#bob"), vf.createURI("http://example#talksTo"), vf.createURI("http://example#charlie")));
-        expected.add(vf.createStatement(vf.createURI("http://example#charlie"), vf.createURI("http://example#likes"), vf.createURI("http://example#icecream")));
+        expected.add(vf.createStatement(vf.createIRI("http://example#alice"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#bob")));
+        expected.add(vf.createStatement(vf.createIRI("http://example#bob"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#charlie")));
+        expected.add(vf.createStatement(vf.createIRI("http://example#charlie"), vf.createIRI("http://example#likes"), vf.createIRI("http://example#icecream")));
 
         final Set<Statement> statements = new HashSet<>();
         final MongoCursor<Document> triplesIterator = getMongoClient()
@@ -87,9 +87,9 @@
         while (triplesIterator.hasNext()) {
             final Document triple = triplesIterator.next();
             statements.add(vf.createStatement(
-                    vf.createURI(triple.getString("subject")),
-                    vf.createURI(triple.getString("predicate")),
-                    vf.createURI(triple.getString("object"))));
+                    vf.createIRI(triple.getString("subject")),
+                    vf.createIRI(triple.getString("predicate")),
+                    vf.createIRI(triple.getString("object"))));
         }
 
         assertEquals(expected, statements);
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsIT.java
index 57e4b76..a491feb 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoLoadStatementsIT.java
@@ -28,10 +28,10 @@
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.mongodb.MongoITBase;
 import org.bson.Document;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.mongodb.client.MongoCursor;
 
@@ -40,7 +40,7 @@
  */
 public class MongoLoadStatementsIT extends MongoITBase {
 
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test(expected = InstanceDoesNotExistException.class)
     public void instanceDoesNotExist() throws Exception {
@@ -84,9 +84,9 @@
         while (triplesIterator.hasNext()) {
             final Document triple = triplesIterator.next();
             stmtResults.add(VF.createStatement(
-                    VF.createURI(triple.getString("subject")),
-                    VF.createURI(triple.getString("predicate")),
-                    VF.createURI(triple.getString("object"))));
+                    VF.createIRI(triple.getString("subject")),
+                    VF.createIRI(triple.getString("predicate")),
+                    VF.createIRI(triple.getString("object"))));
         }
 
         // Show the discovered statements match the original statements.
@@ -96,19 +96,19 @@
     public Set<Statement> makeTestStatements() {
         final Set<Statement> statements = new HashSet<>();
         statements.add(VF.createStatement(
-                    VF.createURI("http://example#alice"),
-                    VF.createURI("http://example#talksTo"),
-                    VF.createURI("http://example#bob")));
+                    VF.createIRI("http://example#alice"),
+                    VF.createIRI("http://example#talksTo"),
+                    VF.createIRI("http://example#bob")));
         statements.add(
                 VF.createStatement(
-                    VF.createURI("http://example#bob"),
-                    VF.createURI("http://example#talksTo"),
-                    VF.createURI("http://example#charlie")));
+                    VF.createIRI("http://example#bob"),
+                    VF.createIRI("http://example#talksTo"),
+                    VF.createIRI("http://example#charlie")));
         statements.add(
                 VF.createStatement(
-                    VF.createURI("http://example#charlie"),
-                    VF.createURI("http://example#likes"),
-                    VF.createURI("http://example#icecream")));
+                    VF.createIRI("http://example#charlie"),
+                    VF.createIRI("http://example#likes"),
+                    VF.createIRI("http://example#icecream")));
         return statements;
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
index 659e9a8..82e32e6 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/GeneralizedExternalProcessorTest.java
@@ -25,13 +25,12 @@
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
-
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidatorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidatorTest.java
index d54523c..92edfef 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidatorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexPlanValidatorTest.java
@@ -32,14 +32,14 @@
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGeneratorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGeneratorTest.java
index 793e6ab..71e9962 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGeneratorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/IndexedExecutionPlanGeneratorTest.java
@@ -26,13 +26,12 @@
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
-
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class IndexedExecutionPlanGeneratorTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelectorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelectorTest.java
index 106288e..485fea5 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelectorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ThreshholdPlanSelectorTest.java
@@ -28,16 +28,16 @@
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
@@ -691,7 +691,7 @@
 	}
 
 	public static class NodeCollector extends
-			QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
 		List<QueryModelNode> qNodes = Lists.newArrayList();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGeneratorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGeneratorTest.java
index 3c11531..11cbea7 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGeneratorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleExecutionPlanGeneratorTest.java
@@ -19,18 +19,16 @@
  * under the License.
  */
 
-
-
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -228,8 +226,8 @@
 
         Assert.assertEquals(2, size);
 
-        Assert.assertTrue(processedTupList.get(0).equals(pq2.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(1).equals(pq1.getTupleExpr()));
+        Assert.assertEquals(pq1.getTupleExpr(), processedTupList.get(0));
+        Assert.assertEquals(pq2.getTupleExpr(), processedTupList.get(1));
 
     }
 
@@ -280,12 +278,12 @@
         Assert.assertTrue(!processedTups.hasNext());
         Assert.assertEquals(6, size);
 
-        Assert.assertTrue(processedTupList.get(5).equals(pq1.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(0).equals(pq2.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(2).equals(pq3.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(4).equals(pq4.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(1).equals(pq5.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(3).equals(pq6.getTupleExpr()));
+        Assert.assertEquals(pq1.getTupleExpr(), processedTupList.get(1));
+        Assert.assertEquals(pq2.getTupleExpr(), processedTupList.get(2));
+        Assert.assertEquals(pq3.getTupleExpr(), processedTupList.get(4));
+        Assert.assertEquals(pq4.getTupleExpr(), processedTupList.get(0));
+        Assert.assertEquals(pq5.getTupleExpr(), processedTupList.get(3));
+        Assert.assertEquals(pq6.getTupleExpr(), processedTupList.get(5));
 
     }
 
@@ -341,12 +339,12 @@
         Assert.assertTrue(!processedTups.hasNext());
         Assert.assertEquals(6, size);
 
-        Assert.assertTrue(processedTupList.get(5).equals(pq1.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(0).equals(pq2.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(2).equals(pq3.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(4).equals(pq4.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(1).equals(pq5.getTupleExpr()));
-        Assert.assertTrue(processedTupList.get(3).equals(pq6.getTupleExpr()));
+        Assert.assertEquals(pq1.getTupleExpr(), processedTupList.get(1));
+        Assert.assertEquals(pq2.getTupleExpr(), processedTupList.get(2));
+        Assert.assertEquals(pq3.getTupleExpr(), processedTupList.get(4));
+        Assert.assertEquals(pq4.getTupleExpr(), processedTupList.get(0));
+        Assert.assertEquals(pq5.getTupleExpr(), processedTupList.get(3));
+        Assert.assertEquals(pq6.getTupleExpr(), processedTupList.get(5));
 
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArrangerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArrangerTest.java
index 2d07246..fde4b61 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArrangerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/TupleReArrangerTest.java
@@ -19,16 +19,15 @@
  * under the License.
  */
 
-
 import java.util.List;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.impl.FilterOptimizer;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class TupleReArrangerTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGeneratorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGeneratorTest.java
index 2bb2147..64f5e52 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGeneratorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/ValidIndexCombinationGeneratorTest.java
@@ -25,13 +25,12 @@
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
-
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPrunerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPrunerTest.java
index 7b173da..3452d0f 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPrunerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/IndexPlanValidator/VarConstantIndexListPrunerTest.java
@@ -25,12 +25,11 @@
 
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
-
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 
@@ -207,8 +206,8 @@
 		indexSet.add(extTup2);
 		indexSet.add(extTup4);
 
-		Assert.assertTrue(Sets.intersection(indexSet, Sets.<ExternalTupleSet> newHashSet(processedIndexSet))
-				.equals(Sets.<ExternalTupleSet> newHashSet(processedIndexSet)));
+		Assert.assertTrue(Sets.intersection(indexSet, Sets.newHashSet(processedIndexSet))
+				.equals(Sets.newHashSet(processedIndexSet)));
 
 	}
 
@@ -245,8 +244,8 @@
 		indexSet.add(extTup2);
 
 		Assert.assertTrue(Sets.intersection(indexSet,
-				Sets.<ExternalTupleSet> newHashSet(processedIndexSet)).equals(
-						Sets.<ExternalTupleSet> newHashSet(processedIndexSet)));
+				Sets.newHashSet(processedIndexSet)).equals(
+						Sets.newHashSet(processedIndexSet)));
 
 	}
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/StatementSerializerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/StatementSerializerTest.java
index b622d40..8689253 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/StatementSerializerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/StatementSerializerTest.java
@@ -19,68 +19,63 @@
  * under the License.
  */
 
-
-
-import junit.framework.Assert;
 import org.apache.rya.indexing.StatementSerializer;
-
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 public class StatementSerializerTest {
 
     @Test
     public void testSimpleStatementObjectUri() throws Exception {
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
         Statement s;
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createURI("foo:object"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createIRI("foo:object"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new ContextStatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createURI("foo:object"),
-                vf.createURI("foo:context"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createIRI("foo:object"),
+                vf.createIRI("foo:context"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
     }
 
     @Test
     public void testSimpleObjectLiteral() throws Exception {
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
         Statement s;
         String str;
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createURI("foo:object"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createIRI("foo:object"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
         str = "Alice Palace";
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, "en"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, "en"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, vf.createURI("xsd:string")));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, vf.createIRI("xsd:string")));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
     }
 
     @Test
     public void testObjectLiteralWithDataTypeGarbage() throws Exception {
         // test with some garbage in the literal that may throw off the parser
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
         Statement s;
         String str;
 
         str = "Alice ^^<Palace>\"";
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, "en"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, "en"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, vf.createURI("xsd:string")));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, vf.createIRI("xsd:string")));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
     }
@@ -88,18 +83,18 @@
     @Test
     public void testObjectLiteralWithAtSignGarbage() throws Exception {
         // test with some garbage in the literal that may throw off the parser
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
         Statement s;
         String str;
 
         str = "Alice @en";
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, "en"));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, "en"));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
 
-        s = new StatementImpl(vf.createURI("foo:subject"), vf.createURI("foo:predicate"), vf.createLiteral(str, vf.createURI("xsd:string")));
+        s = vf.createStatement(vf.createIRI("foo:subject"), vf.createIRI("foo:predicate"), vf.createLiteral(str, vf.createIRI("xsd:string")));
         Assert.assertEquals(s, StatementSerializer.readStatement(StatementSerializer.writeStatement(s)));
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIndexerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIndexerTest.java
index 6a3a18a..a6487df 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIndexerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/AccumuloDocIndexerTest.java
@@ -19,13 +19,16 @@
  * under the License.
  */
 
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.accumulo.core.client.BatchWriter;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.accumulo.core.data.Mutation;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.RyaTableMutationsFactory;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
@@ -35,31 +38,23 @@
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-
-import org.apache.accumulo.core.client.BatchWriter;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.admin.TableOperations;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.client.security.tokens.AuthenticationToken;
-import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.apache.accumulo.core.data.Mutation;
-import org.apache.hadoop.conf.Configuration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
@@ -68,7 +63,7 @@
     private MockInstance mockInstance;
     private Connector accCon;
     AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    ValueFactory vf = new ValueFactoryImpl();
+    ValueFactory vf = SimpleValueFactory.getInstance();
     
     private String tableName;
     
@@ -321,11 +316,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
 //                QueryBindingSet b1 = (new QueryBindingSet());
-//                b1.addBinding("X", vf.createURI("uri:5"));
+//                b1.addBinding("X", vf.createIRI("uri:5"));
 //                QueryBindingSet b2 = (new QueryBindingSet());
-//                b2.addBinding("X", vf.createURI("uri:15"));
+//                b2.addBinding("X", vf.createIRI("uri:15"));
 //                QueryBindingSet b3 = (new QueryBindingSet());
-//                b3.addBinding("X", vf.createURI("uri:25"));
+//                b3.addBinding("X", vf.createIRI("uri:25"));
 //                bsList.add(b1);
 //                bsList.add(b2);
 //                bsList.add(b3);
@@ -445,11 +440,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = (new QueryBindingSet());
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 QueryBindingSet b2 = (new QueryBindingSet());
-                b2.addBinding("X", vf.createURI("uri:15"));
+                b2.addBinding("X", vf.createIRI("uri:15"));
                 QueryBindingSet b3 = (new QueryBindingSet());
-                b3.addBinding("X", vf.createURI("uri:25"));
+                b3.addBinding("X", vf.createIRI("uri:25"));
                 bsList.add(b1);
                 bsList.add(b2);
                 bsList.add(b3);
@@ -671,11 +666,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = (new QueryBindingSet());
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 QueryBindingSet b2 = (new QueryBindingSet());
-                b2.addBinding("X", vf.createURI("uri:15"));
+                b2.addBinding("X", vf.createIRI("uri:15"));
                 QueryBindingSet b3 = (new QueryBindingSet());
-                b3.addBinding("X", vf.createURI("uri:25"));
+                b3.addBinding("X", vf.createIRI("uri:25"));
                 bsList.add(b1);
                 bsList.add(b2);
                 bsList.add(b3);
@@ -784,11 +779,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = (new QueryBindingSet());
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 QueryBindingSet b2 = (new QueryBindingSet());
-                b2.addBinding("X", vf.createURI("uri:15"));
+                b2.addBinding("X", vf.createIRI("uri:15"));
                 QueryBindingSet b3 = (new QueryBindingSet());
-                b3.addBinding("X", vf.createURI("uri:25"));
+                b3.addBinding("X", vf.createIRI("uri:25"));
                 bsList.add(b1);
                 bsList.add(b2);
                 bsList.add(b3);
@@ -939,11 +934,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
 //                QueryBindingSet b1 = (new QueryBindingSet());
-//                b1.addBinding("X", vf.createURI("uri:5"));
+//                b1.addBinding("X", vf.createIRI("uri:5"));
 //                QueryBindingSet b2 = (new QueryBindingSet());
-//                b2.addBinding("X", vf.createURI("uri:15"));
+//                b2.addBinding("X", vf.createIRI("uri:15"));
 //                QueryBindingSet b3 = (new QueryBindingSet());
-//                b3.addBinding("X", vf.createURI("uri:25"));
+//                b3.addBinding("X", vf.createIRI("uri:25"));
 //                bsList.add(b1);
 //                bsList.add(b2);
 //                bsList.add(b3);
@@ -1116,11 +1111,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = (new QueryBindingSet());
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 QueryBindingSet b2 = (new QueryBindingSet());
-                b2.addBinding("X", vf.createURI("uri:15"));
+                b2.addBinding("X", vf.createIRI("uri:15"));
                 QueryBindingSet b3 = (new QueryBindingSet());
-                b3.addBinding("X", vf.createURI("uri:25"));
+                b3.addBinding("X", vf.createIRI("uri:25"));
                 bsList.add(b1);
                 bsList.add(b2);
                 bsList.add(b3);
@@ -1653,11 +1648,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = (new QueryBindingSet());
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 QueryBindingSet b2 = (new QueryBindingSet());
-                b2.addBinding("X", vf.createURI("uri:15"));
+                b2.addBinding("X", vf.createIRI("uri:15"));
                 QueryBindingSet b3 = (new QueryBindingSet());
-                b3.addBinding("X", vf.createURI("uri:25"));
+                b3.addBinding("X", vf.createIRI("uri:25"));
                 bsList.add(b1);
                 bsList.add(b2);
                 bsList.add(b3);
@@ -1855,10 +1850,10 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
                 QueryBindingSet b1 = new QueryBindingSet();
-                b1.addBinding("X", vf.createURI("uri:5"));
+                b1.addBinding("X", vf.createIRI("uri:5"));
                 b1.addBinding("Y3", v1);
                 QueryBindingSet b2 = new QueryBindingSet();
-                b2.addBinding("X", vf.createURI("uri:25"));
+                b2.addBinding("X", vf.createIRI("uri:25"));
                 b2.addBinding("Y3", v2);
                 bsList.add(b1);
                 bsList.add(b2);
@@ -2040,11 +2035,11 @@
                 
                 List<BindingSet> bsList = Lists.newArrayList();
 //                QueryBindingSet b1 = (new QueryBindingSet());
-//                b1.addBinding("X", vf.createURI("uri:5"));
+//                b1.addBinding("X", vf.createIRI("uri:5"));
 //                QueryBindingSet b2 = (new QueryBindingSet());
-//                b2.addBinding("X", vf.createURI("uri:15"));
+//                b2.addBinding("X", vf.createIRI("uri:15"));
 //                QueryBindingSet b3 = (new QueryBindingSet());
-//                b3.addBinding("X", vf.createURI("uri:25"));
+//                b3.addBinding("X", vf.createIRI("uri:25"));
 //                bsList.add(b1);
 //                bsList.add(b2);
 //                bsList.add(b3);
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndexTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndexTest.java
index f738ad1..79fd2c2 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndexTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityCentricIndexTest.java
@@ -21,25 +21,24 @@
 
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.DELIM_BYTES;
 
+import java.io.IOException;
+import java.util.Collection;
+
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Mutation;
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.ColumnVisibility;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-
-import java.io.IOException;
-import java.util.Collection;
-import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import com.google.common.primitives.Bytes;
-
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.google.common.primitives.Bytes;
 
 public class EntityCentricIndexTest {
     private static RyaStatement ryaStatement;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizerTest.java
index 211e822..70394b6 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/EntityOptimizerTest.java
@@ -19,23 +19,12 @@
  * under the License.
  */
 
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
-import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.apache.rya.indexing.accumulo.entity.EntityOptimizer;
-import org.apache.rya.indexing.accumulo.entity.EntityTupleSet;
-import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
-import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchWriter;
@@ -48,19 +37,26 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.api.persist.RdfEvalStatsDAO;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
+import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.impl.FilterOptimizer;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -1017,11 +1013,11 @@
         Assert.assertEquals(2, nodes.size());
 
         for (QueryModelNode q : nodes) {
-
-            if (((EntityTupleSet) q).getStarQuery().getNodes().size() == 2) {
-                Assert.assertEquals("m", ((EntityTupleSet) q).getStarQuery().getCommonVarName());
-            } else if (((EntityTupleSet) q).getStarQuery().getNodes().size() == 3) {
-                Assert.assertEquals("uri:chickens", ((EntityTupleSet) q).getStarQuery().getCommonVarName());
+            final StarQuery starQuery = ((EntityTupleSet) q).getStarQuery();
+            if (starQuery.getNodes().size() == 2) {
+                Assert.assertEquals("m", starQuery.getCommonVarName());
+            } else if (starQuery.getNodes().size() == 3) {
+                Assert.assertEquals("uri:chickens", starQuery.getCommonVarValue());
             } else {
                 Assert.assertTrue(false);
             }
@@ -1121,11 +1117,11 @@
         Assert.assertEquals(2, nodes.size());
 
         for (QueryModelNode q : nodes) {
-
-            if (((EntityTupleSet) q).getStarQuery().getNodes().size() == 2) {
-                Assert.assertEquals("m", ((EntityTupleSet) q).getStarQuery().getCommonVarName());
-            } else if (((EntityTupleSet) q).getStarQuery().getNodes().size() == 3) {
-                Assert.assertEquals("uri:chickens", ((EntityTupleSet) q).getStarQuery().getCommonVarName());
+            final StarQuery starQuery = ((EntityTupleSet) q).getStarQuery();
+            if (starQuery.getNodes().size() == 2) {
+                Assert.assertEquals("m", starQuery.getCommonVarName());
+            } else if (starQuery.getNodes().size() == 3) {
+                Assert.assertEquals("uri:chickens", starQuery.getCommonVarValue());
             } else {
                 Assert.assertTrue(false);
             }
@@ -1323,7 +1319,7 @@
     
     
     
-    private class EntityCentricVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private class EntityCentricVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         
         private Set<QueryModelNode> ccNodes = Sets.newHashSet();
         
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/StarQueryTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/StarQueryTest.java
index 993c758..54b5dcd 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/StarQueryTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/entity/StarQueryTest.java
@@ -28,26 +28,26 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Bytes;
 
 public class StarQueryTest {
 
-    ValueFactory vf = new ValueFactoryImpl();
+    ValueFactory vf = SimpleValueFactory.getInstance();
     
     
     @Test
@@ -115,8 +115,8 @@
         QueryBindingSet bs1 = new QueryBindingSet();
         QueryBindingSet bs2 = new QueryBindingSet();
         
-        Value v1 = vf.createURI("uri:hank");
-        Value v2 = vf.createURI("uri:bob");
+        Value v1 = vf.createIRI("uri:hank");
+        Value v2 = vf.createIRI("uri:bob");
         
         bs1.addBinding("X",v1);
         bs2.addBinding("X", v1);
@@ -176,8 +176,8 @@
         QueryBindingSet bs1 = new QueryBindingSet();
         QueryBindingSet bs2 = new QueryBindingSet();
         
-        Value v1 = vf.createURI("uri:hank");
-        Value v2 = vf.createURI("uri:bob");
+        Value v1 = vf.createIRI("uri:hank");
+        Value v2 = vf.createIRI("uri:bob");
         
         bs1.addBinding("X",v1);
         bs2.addBinding("X", v1);
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexerTest.java
index 531085d..62396e4 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/freetext/AccumuloFreeTextIndexerTest.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
 package org.apache.rya.indexing.accumulo.freetext;
 
 import java.util.HashSet;
@@ -14,41 +32,6 @@
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.conf.Configuration;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDFS;
-
-import com.google.common.collect.Sets;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
@@ -57,6 +40,19 @@
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.collect.Sets;
+
 
 public class AccumuloFreeTextIndexerTest {
     private static final StatementConstraints EMPTY_CONSTRAINTS = new StatementConstraints();
@@ -96,13 +92,13 @@
             f.setMultiTableBatchWriter(ConfigUtils.createMultitableBatchWriter(conf));
             f.init();
 
-            ValueFactory vf = new ValueFactoryImpl();
+            ValueFactory vf = SimpleValueFactory.getInstance();
 
-            URI subject = new URIImpl("foo:subj");
-            URI predicate = RDFS.LABEL;
+            IRI subject = vf.createIRI("foo:subj");
+            IRI predicate = RDFS.LABEL;
             Value object = vf.createLiteral("this is a new hat");
 
-            URI context = new URIImpl("foo:context");
+            IRI context = vf.createIRI("foo:context");
 
             Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement));
@@ -139,22 +135,22 @@
             f.setMultiTableBatchWriter(ConfigUtils.createMultitableBatchWriter(conf));
             f.init();
 
-            ValueFactory vf = new ValueFactoryImpl();
+            ValueFactory vf = SimpleValueFactory.getInstance();
 
-            URI subject1 = new URIImpl("foo:subj");
-            URI predicate1 = RDFS.LABEL;
+            IRI subject1 = vf.createIRI("foo:subj");
+            IRI predicate1 = RDFS.LABEL;
             Value object1 = vf.createLiteral("this is a new hat");
 
-            URI context1 = new URIImpl("foo:context");
+            IRI context1 = vf.createIRI("foo:context");
 
             Statement statement1 = vf.createStatement(subject1, predicate1, object1, context1);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement1));
 
-            URI subject2 = new URIImpl("foo:subject");
-            URI predicate2 = RDFS.LABEL;
+            IRI subject2 = vf.createIRI("foo:subject");
+            IRI predicate2 = RDFS.LABEL;
             Value object2 = vf.createLiteral("Do you like my new hat?");
 
-            URI context2 = new URIImpl("foo:context");
+            IRI context2 = vf.createIRI("foo:context");
 
             Statement statement2 = vf.createStatement(subject2, predicate2, object2, context2);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement2));
@@ -231,11 +227,11 @@
             f.setMultiTableBatchWriter(ConfigUtils.createMultitableBatchWriter(conf));
             f.init();
 
-            ValueFactory vf = new ValueFactoryImpl();
-            URI subject = new URIImpl("foo:subj");
-            URI predicate = new URIImpl(RDFS.COMMENT.toString());
+            ValueFactory vf = SimpleValueFactory.getInstance();
+            IRI subject = vf.createIRI("foo:subj");
+            IRI predicate = vf.createIRI(RDFS.COMMENT.toString());
             Value object = vf.createLiteral("this is a new hat");
-            URI context = new URIImpl("foo:context");
+            IRI context = vf.createIRI("foo:context");
 
             Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement));
@@ -244,7 +240,7 @@
             Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryText("hat", EMPTY_CONSTRAINTS)));
             Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryText("hat", new StatementConstraints().setContext(context))));
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryText("hat", new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryText("hat", new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
         }
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java
index bba1b0d..c8f482d 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/accumulo/temporal/AccumuloTemporalIndexerTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya.indexing.accumulo.temporal;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
+package org.apache.rya.indexing.accumulo.temporal;
 
 import static org.apache.rya.api.resolver.RdfToRyaConversions.convertStatement;
 import static org.junit.Assert.assertEquals;
@@ -62,24 +60,22 @@
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.TemporalInterval;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.QueryEvaluationException;
 
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * JUnit tests for TemporalIndexer and it's implementation AccumuloTemporalIndexer
  *
@@ -174,7 +170,7 @@
         seriesTs = new TemporalInstant[SERIES_OF_SECONDS];
         for (int i = 0; i <= 40; i++)
             seriesTs[i] = makeInstant(i);
-    };
+    }
 
     /**
      * Make an uniform instant with given seconds.
@@ -185,23 +181,23 @@
 
     static {
         // Setup the statements only once. Each test will store some of these in there own index table.
-        ValueFactory vf = new ValueFactoryImpl();
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+        ValueFactory vf = SimpleValueFactory.getInstance();
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
         // tiB03_E20 read as: time interval that Begins 3 seconds, ends at 20 seconds,
         // Each time element the same, except seconds. year, month, .... minute are the same for each statement below.
-        spo_B00_E01 = new StatementImpl(vf.createURI("foo:event0"), pred1_atTime, vf.createLiteral(tvB00_E01.toString()));
-        spo_B02_E29 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E29.toString()));
-        spo_B02_E30 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E30.toString()));
-        spo_B02_E31 = new StatementImpl(vf.createURI("foo:event3"), pred1_atTime, vf.createLiteral(tvB02_E31.toString()));
-        spo_B02_E40 = new StatementImpl(vf.createURI("foo:event4"), pred1_atTime, vf.createLiteral(tvB02_E40.toString()));
-        spo_B03_E20 = new StatementImpl(vf.createURI("foo:event5"), pred1_atTime, vf.createLiteral(tvB03_E20.toString()));
-        spo_B29_E30 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB29_E30.toString()));
-        spo_B30_E32 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB30_E32.toString()));
-        spo_B02 = new StatementImpl(vf.createURI("foo:event6"), pred1_atTime, vf.createLiteral(tsB02.getAsReadable()));
+        spo_B00_E01 = vf.createStatement(vf.createIRI("foo:event0"), pred1_atTime, vf.createLiteral(tvB00_E01.toString()));
+        spo_B02_E29 = vf.createStatement(vf.createIRI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E29.toString()));
+        spo_B02_E30 = vf.createStatement(vf.createIRI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E30.toString()));
+        spo_B02_E31 = vf.createStatement(vf.createIRI("foo:event3"), pred1_atTime, vf.createLiteral(tvB02_E31.toString()));
+        spo_B02_E40 = vf.createStatement(vf.createIRI("foo:event4"), pred1_atTime, vf.createLiteral(tvB02_E40.toString()));
+        spo_B03_E20 = vf.createStatement(vf.createIRI("foo:event5"), pred1_atTime, vf.createLiteral(tvB03_E20.toString()));
+        spo_B29_E30 = vf.createStatement(vf.createIRI("foo:event1"), pred1_atTime, vf.createLiteral(tvB29_E30.toString()));
+        spo_B30_E32 = vf.createStatement(vf.createIRI("foo:event1"), pred1_atTime, vf.createLiteral(tvB30_E32.toString()));
+        spo_B02 = vf.createStatement(vf.createIRI("foo:event6"), pred1_atTime, vf.createLiteral(tsB02.getAsReadable()));
 
         // Create statements about time instants 0 - 40 seconds
         for (int i = 0; i < seriesTs.length; i++) {
-            seriesSpo[i] = new StatementImpl(vf.createURI("foo:event0" + i), pred1_atTime, vf.createLiteral(seriesTs[i].getAsReadable()));
+            seriesSpo[i] = vf.createStatement(vf.createIRI("foo:event0" + i), pred1_atTime, vf.createLiteral(seriesTs[i].getAsReadable()));
         }
 
     }
@@ -273,7 +269,7 @@
     }
 
     /**
-     * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)}
+     * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.eclipse.rdf4j.model.Statement)}
      *
      * @throws NoSuchAlgorithmException
      */
@@ -282,21 +278,21 @@
         // count rows expected to store:
         int rowsStoredExpected = 0;
 
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
 
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-        URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
+        IRI pred2_circa = vf.createIRI(URI_PROPERTY_CIRCA);
 
         // Should not be stored because they are not in the predicate list
         String validDateStringWithThirteens = "1313-12-13T13:13:13Z";
-        tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens))));
+        tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens))));
 
         // Test: Should not store an improper date, and log a warning (log warning not tested).
         final String invalidDateString = "ThisIsAnInvalidDate";
 //        // Silently logs a warning for bad dates.  Old: Set true when we catch the error:
 //        boolean catchErrorThrownCorrectly = false;
 //        try {
-            tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString))));
+            tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString))));
 //        } catch (IllegalArgumentException e) {
 //            catchErrorThrownCorrectly = true;
 //            Assert.assertTrue(
@@ -314,15 +310,15 @@
 
         // These should be stored because they are in the predicate list.
         // BUT they will get converted to the same exact datetime in UTC.
-        Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
-        Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
+        Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
+        Statement s4 = vf.createStatement(vf.createIRI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
         tIndexer.storeStatement(convertStatement(s3));
         rowsStoredExpected++;
         tIndexer.storeStatement(convertStatement(s4));
         rowsStoredExpected++;
 
         // This should not be stored because the object is not a literal
-        tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1_atTime, vf.createURI("in:valid"))));
+        tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj5"), pred1_atTime, vf.createIRI("in:valid"))));
 
         tIndexer.flush();
 
@@ -336,18 +332,18 @@
         // count rows expected to store:
         int rowsStoredExpected = 0;
 
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
 
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-        URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
+        IRI pred2_circa = vf.createIRI(URI_PROPERTY_CIRCA);
 
         final String testDate2014InBRST = "2014-12-31T23:59:59-02:00";
         final String testDate2016InET = "2016-12-31T20:59:59-05:00";
 
         // These should be stored because they are in the predicate list.
         // BUT they will get converted to the same exact datetime in UTC.
-        Statement s1 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
-        Statement s2 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
+        Statement s1 = vf.createStatement(vf.createIRI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
+        Statement s2 = vf.createStatement(vf.createIRI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
         tIndexer.storeStatement(convertStatement(s1));
         rowsStoredExpected++;
         tIndexer.storeStatement(convertStatement(s2));
@@ -367,12 +363,12 @@
 
     @Test
     public void testStoreStatementWithInterestingLiterals() throws Exception {
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
 
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
 
-        tIndexer.storeStatement(convertStatement(new StatementImpl(
-                vf.createURI("foo:subj2"),
+        tIndexer.storeStatement(convertStatement(vf.createStatement(
+                vf.createIRI("foo:subj2"),
                 pred1_atTime,
                 vf.createLiteral("A number of organizations located, gathered, or classed together. [Derived from Concise Oxford English Dictionary, 11th Edition, 2008]"))));
 
@@ -381,7 +377,7 @@
     }
 
     /**
-     * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)}
+     * Test method for {@link AccumuloTemporalIndexer#storeStatement(convertStatement(org.eclipse.rdf4j.model.Statement)}
      *
      * @throws NoSuchAlgorithmException
      */
@@ -390,16 +386,16 @@
         // count rows expected to store:
         int rowsStoredExpected = 0;
 
-        ValueFactory vf = new ValueFactoryImpl();
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+        ValueFactory vf = SimpleValueFactory.getInstance();
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
 
         // Test: Should not store an improper date interval, and log a warning (log warning not tested).
         final String invalidDateIntervalString="[bad,interval]";
         // Silently logs a warning for bad dates.
-        tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), pred1_atTime, vf.createLiteral(invalidDateIntervalString))));
+        tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), pred1_atTime, vf.createLiteral(invalidDateIntervalString))));
 
         final String validDateIntervalString="[2016-12-31T20:59:59-05:00,2016-12-31T21:00:00-05:00]";
-        tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(validDateIntervalString))));
+        tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), pred1_atTime, vf.createLiteral(validDateIntervalString))));
         rowsStoredExpected++;
 
         tIndexer.flush();
@@ -410,9 +406,9 @@
 
     @Test
     public void testStoreStatementsSameTime() throws IOException, NoSuchAlgorithmException, AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException {
-        ValueFactory vf = new ValueFactoryImpl();
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-        URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
+        ValueFactory vf = SimpleValueFactory.getInstance();
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
+        IRI pred2_circa = vf.createIRI(URI_PROPERTY_CIRCA);
 
         // These are the same datetime instant but from different time
         // zones.
@@ -424,9 +420,9 @@
         // These all should be stored because they are in the predicate list.
         // BUT they will get converted to the same exact datetime in UTC.
         // So we have to make the key distinct! Good luck indexer!
-        Statement s1 = new StatementImpl(vf.createURI("foo:subj1"), pred2_circa, vf.createLiteral(ZONETestDateInET));
-        Statement s2 = new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(ZONETestDateInZulu));
-        Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(ZONETestDateInBRST));
+        Statement s1 = vf.createStatement(vf.createIRI("foo:subj1"), pred2_circa, vf.createLiteral(ZONETestDateInET));
+        Statement s2 = vf.createStatement(vf.createIRI("foo:subj2"), pred1_atTime, vf.createLiteral(ZONETestDateInZulu));
+        Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1_atTime, vf.createLiteral(ZONETestDateInBRST));
         int rowsStoredExpected = 0;
         tIndexer.storeStatement(convertStatement(s1));
         rowsStoredExpected++;
@@ -894,28 +890,28 @@
         for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
             tIndexer.storeStatement(convertStatement(seriesSpo[s]));
         }
-        ValueFactory vf = new ValueFactoryImpl();
-        URI pred3_CIRCA_ = vf.createURI(URI_PROPERTY_CIRCA);  // this one to ignore.
-        URI pred2_eventTime = vf.createURI(URI_PROPERTY_EVENT_TIME);
-        URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+        ValueFactory vf = SimpleValueFactory.getInstance();
+        IRI pred3_CIRCA_ = vf.createIRI(URI_PROPERTY_CIRCA);  // this one to ignore.
+        IRI pred2_eventTime = vf.createIRI(URI_PROPERTY_EVENT_TIME);
+        IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
 
         // add the predicate = EventTime ; Store in an array for verification.
         Statement[] SeriesTs_EventTime = new Statement[expectedResultCount+1];
         for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
-            Statement statement = new StatementImpl(vf.createURI("foo:EventTimeSubj0" + s), pred2_eventTime, vf.createLiteral(seriesTs[s].getAsReadable()));
+            Statement statement = vf.createStatement(vf.createIRI("foo:EventTimeSubj0" + s), pred2_eventTime, vf.createLiteral(seriesTs[s].getAsReadable()));
             tIndexer.storeStatement(convertStatement(statement));
             if (s>searchForSeconds)
                 SeriesTs_EventTime[s - searchForSeconds -1 ] = statement;
         }
         // add the predicate = CIRCA ; to be ignored because it is not in the constraints.
         for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
-            Statement statement = new StatementImpl(vf.createURI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable()));
+            Statement statement = vf.createStatement(vf.createIRI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable()));
             tIndexer.storeStatement(convertStatement(statement));
         }
         tIndexer.flush();
         CloseableIteration<Statement, QueryEvaluationException> iter;
         StatementConstraints constraints = new StatementConstraints();
-        constraints.setPredicates(new HashSet<URI>(Arrays.asList( pred2_eventTime,  pred1_atTime )));
+        constraints.setPredicates(new HashSet<IRI>(Arrays.asList( pred2_eventTime,  pred1_atTime )));
 
         iter = tIndexer.queryInstantAfterInstant(seriesTs[searchForSeconds], constraints); // EMPTY_CONSTRAINTS);//
         int count_AtTime = 0;
@@ -953,7 +949,7 @@
      */
     @Test
     public void testGetIndexablePredicates() throws AccumuloException, AccumuloSecurityException, TableNotFoundException, TableExistsException, IOException {
-        Set<URI> p = tIndexer.getIndexablePredicates();
+        Set<IRI> p = tIndexer.getIndexablePredicates();
         Assert.assertEquals("number of predicates returned:", 3, p.size());
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/query/EntityQueryNodeIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/query/EntityQueryNodeIT.java
index 66b79ef..c5b7fa1 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/query/EntityQueryNodeIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/query/EntityQueryNodeIT.java
@@ -22,10 +22,12 @@
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.indexing.entity.model.Entity;
 import org.apache.rya.indexing.entity.model.Property;
@@ -33,22 +35,21 @@
 import org.apache.rya.indexing.entity.storage.EntityStorage;
 import org.apache.rya.indexing.entity.storage.mongo.MongoEntityStorage;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.ImmutableSet;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Integration tests the methods of {@link EntityQueryNode}.
  */
@@ -152,12 +153,12 @@
     @Test
     public void evaluate_constantSubject() throws Exception {
         final EntityStorage storage = new MongoEntityStorage(super.getMongoClient(), "testDB");
-        final ValueFactory vf = ValueFactoryImpl.getInstance();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final RyaURI subject = new RyaURI("urn:SSN:111-11-1111");
         final Entity entity = Entity.builder()
             .setSubject(subject)
             .setExplicitType(PERSON_TYPE.getId())
-            .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(20))))
+            .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(BigInteger.valueOf(20)))))
             .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:eye"), RdfToRyaConversions.convertLiteral(vf.createLiteral("blue"))))
             .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:name"), RdfToRyaConversions.convertLiteral(vf.createLiteral("Bob"))))
             .build();
@@ -187,12 +188,12 @@
     @Test
     public void evaluate_variableSubject() throws Exception {
         final EntityStorage storage = new MongoEntityStorage(super.getMongoClient(), "testDB");
-        final ValueFactory vf = ValueFactoryImpl.getInstance();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         RyaURI subject = new RyaURI("urn:SSN:111-11-1111");
         final Entity bob = Entity.builder()
                 .setSubject(subject)
                 .setExplicitType(PERSON_TYPE.getId())
-                .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(20))))
+                .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(BigInteger.valueOf(20)))))
                 .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:eye"), RdfToRyaConversions.convertLiteral(vf.createLiteral("blue"))))
                 .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:name"), RdfToRyaConversions.convertLiteral(vf.createLiteral("Bob"))))
                 .build();
@@ -201,7 +202,7 @@
         final Entity fred = Entity.builder()
                 .setSubject(subject)
                 .setExplicitType(PERSON_TYPE.getId())
-                .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(25))))
+                .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(BigInteger.valueOf(25)))))
                 .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:eye"), RdfToRyaConversions.convertLiteral(vf.createLiteral("brown"))))
                 .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:name"), RdfToRyaConversions.convertLiteral(vf.createLiteral("Fred"))))
                 .build();
@@ -240,18 +241,18 @@
     @Test
     public void evaluate_constantObject() throws Exception {
         final EntityStorage storage = new MongoEntityStorage(super.getMongoClient(), "testDB");
-        final ValueFactory vf = ValueFactoryImpl.getInstance();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final RyaURI subject = new RyaURI("urn:SSN:111-11-1111");
         final Entity entity = Entity.builder()
             .setSubject(subject)
             .setExplicitType(PERSON_TYPE.getId())
-            .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(20))))
+            .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:age"), RdfToRyaConversions.convertLiteral(vf.createLiteral(BigInteger.valueOf(20)))))
             .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:eye"), RdfToRyaConversions.convertLiteral(vf.createLiteral("blue"))))
             .setProperty(PERSON_TYPE.getId(), new Property(new RyaURI("urn:name"), RdfToRyaConversions.convertLiteral(vf.createLiteral("Bob"))))
             .build();
 
         storage.create(entity);
-        // A set of patterns that match a sepecific Entity subject.
+        // A set of patterns that match a specific Entity subject.
         final List<StatementPattern> patterns = getSPs(
                 "SELECT * WHERE { " +
                     "<urn:SSN:111-11-1111> <" + RDF.TYPE + "> <urn:person> ."+
@@ -264,7 +265,7 @@
         final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(new MapBindingSet());
         final MapBindingSet expected = new MapBindingSet();
         expected.addBinding("age", vf.createLiteral("20"));
-        expected.addBinding("-const-blue", vf.createLiteral("blue"));
+        expected.addBinding(VarNameUtils.createUniqueConstVarNameLiteral("blue"), vf.createLiteral("blue"));
         expected.addBinding("name", vf.createLiteral("Bob"));
         while(rez.hasNext()) {
             assertEquals(expected, rez.next());
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverterTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverterTest.java
index 79ea998..b124470 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverterTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/EntityDocumentConverterTest.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -26,8 +26,8 @@
 import org.apache.rya.indexing.entity.model.Property;
 import org.apache.rya.indexing.entity.storage.mongo.DocumentConverter.DocumentConverterException;
 import org.bson.Document;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 /**
  * Tests the methods of {@link EntityDocumentConverter}.
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoEntityStorageIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoEntityStorageIT.java
index 8e33d37..cec989e 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoEntityStorageIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoEntityStorageIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -37,8 +37,8 @@
 import org.apache.rya.indexing.entity.storage.EntityStorage.EntityStorageException;
 import org.apache.rya.indexing.entity.storage.EntityStorage.StaleUpdateException;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverterTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverterTest.java
index 3196793..5ffde39 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverterTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/RyaTypeDocumentConverterTest.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -24,9 +24,9 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.indexing.entity.storage.mongo.DocumentConverter.DocumentConverterException;
 import org.bson.Document;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 /**
  * Tests the methods of {@link RyaTypeDocumentConverter}.
@@ -36,7 +36,7 @@
     @Test
     public void toDocument() {
         // Convert the RyaType into a Document.
-        final RyaType ryaType = RdfToRyaConversions.convertLiteral( new ValueFactoryImpl().createLiteral( 4.5 ) );
+        final RyaType ryaType = RdfToRyaConversions.convertLiteral( SimpleValueFactory.getInstance().createLiteral( 4.5 ) );
         final Document document = new RyaTypeDocumentConverter().toDocument( ryaType );
 
         // Show the document has the correct structure.
@@ -55,7 +55,7 @@
         final RyaType ryaType = new RyaTypeDocumentConverter().fromDocument( document );
 
         // Show the converted value has the expected structure.
-        final RyaType expected = RdfToRyaConversions.convertLiteral( new ValueFactoryImpl().createLiteral( 4.5 ) );
+        final RyaType expected = RdfToRyaConversions.convertLiteral( SimpleValueFactory.getInstance().createLiteral( 4.5 ) );
         assertEquals(expected, ryaType);
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/update/mongo/MongoEntityIndexerIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/update/mongo/MongoEntityIndexerIT.java
index 28fd330..dd1644b 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/update/mongo/MongoEntityIndexerIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/update/mongo/MongoEntityIndexerIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -33,9 +33,9 @@
 import org.apache.rya.indexing.entity.storage.mongo.MongoEntityStorage;
 import org.apache.rya.indexing.entity.storage.mongo.MongoTypeStorage;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloConstantPcjIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloConstantPcjIT.java
index 5d53737..1644ed1 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloConstantPcjIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloConstantPcjIT.java
@@ -1,7 +1,3 @@
-package org.apache.rya.indexing.external;
-
-import java.net.UnknownHostException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.external;
 
+import java.net.UnknownHostException;
 import java.util.List;
 
 import org.apache.accumulo.core.client.AccumuloException;
@@ -30,42 +28,41 @@
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.pcj.storage.PcjException;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
+import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.SailException;
 
 import com.google.common.base.Optional;
 
-import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
-
 public class AccumuloConstantPcjIT {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	private SailRepositoryConnection conn, pcjConn;
 	private SailRepository repo, pcjRepo;
 	private Connector accCon;
 	String prefix = "table_";
 	String tablename = "table_INDEX_";
-	URI obj, obj2, subclass, subclass2, talksTo;
+	IRI obj, obj2, subclass, subclass2, talksTo;
 
 	@Before
 	public void init() throws RepositoryException,
@@ -81,21 +78,21 @@
 		pcjRepo = PcjIntegrationTestingUtil.getAccumuloPcjRepo(prefix, "instance");
 		pcjConn = pcjRepo.getConnection();
 
-		final URI sub = new URIImpl("uri:entity");
-		subclass = new URIImpl("uri:class");
-		obj = new URIImpl("uri:obj");
-		talksTo = new URIImpl("uri:talksTo");
+		final IRI sub = VF.createIRI("uri:entity");
+		subclass = VF.createIRI("uri:class");
+		obj = VF.createIRI("uri:obj");
+		talksTo = VF.createIRI("uri:talksTo");
 
 		conn.add(sub, RDF.TYPE, subclass);
-		conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+		conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
 		conn.add(sub, talksTo, obj);
 
-		final URI sub2 = new URIImpl("uri:entity2");
-		subclass2 = new URIImpl("uri:class2");
-		obj2 = new URIImpl("uri:obj2");
+		final IRI sub2 = VF.createIRI("uri:entity2");
+		subclass2 = VF.createIRI("uri:class2");
+		obj2 = VF.createIRI("uri:obj2");
 
 		conn.add(sub2, RDF.TYPE, subclass2);
-		conn.add(sub2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(sub2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub2, talksTo, obj2);
 
 		accCon = new MockInstance("instance").getConnector("root",new PasswordToken(""));
@@ -120,16 +117,16 @@
 			MalformedQueryException, SailException, QueryEvaluationException,
 			TupleQueryResultHandlerException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -158,10 +155,10 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final CountingResultHandler crh1 = new CountingResultHandler();
 		final CountingResultHandler crh2 = new CountingResultHandler();
@@ -182,26 +179,26 @@
 			MalformedQueryException, SailException, QueryEvaluationException,
 			TupleQueryResultHandlerException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
-		final URI sub = new URIImpl("uri:entity");
-		subclass = new URIImpl("uri:class");
-		obj = new URIImpl("uri:obj");
-		talksTo = new URIImpl("uri:talksTo");
+		final IRI sub = VF.createIRI("uri:entity");
+		subclass = VF.createIRI("uri:class");
+		obj = VF.createIRI("uri:obj");
+		talksTo = VF.createIRI("uri:talksTo");
 
-		final URI howlsAt = new URIImpl("uri:howlsAt");
-		final URI subType = new URIImpl("uri:subType");
+		final IRI howlsAt = VF.createIRI("uri:howlsAt");
+		final IRI subType = VF.createIRI("uri:subType");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub, howlsAt, superclass);
 		conn.add(superclass, subType, obj);
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -239,14 +236,14 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 3,
 				indexSparqlString3,
 				new String[] { "wolf", "sheep", "chicken" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final CountingResultHandler crh1 = new CountingResultHandler();
 		final CountingResultHandler crh2 = new CountingResultHandler();
@@ -269,15 +266,15 @@
 			TupleQueryResultHandlerException, AccumuloException,
 			AccumuloSecurityException {
 
-		final URI e1 = new URIImpl("uri:e1");
-		final URI e2 = new URIImpl("uri:e2");
-		final URI e3 = new URIImpl("uri:e3");
-		final URI f1 = new URIImpl("uri:f1");
-		final URI f2 = new URIImpl("uri:f2");
-		final URI f3 = new URIImpl("uri:f3");
-		final URI g1 = new URIImpl("uri:g1");
-		final URI g2 = new URIImpl("uri:g2");
-		final URI g3 = new URIImpl("uri:g3");
+		final IRI e1 = VF.createIRI("uri:e1");
+		final IRI e2 = VF.createIRI("uri:e2");
+		final IRI e3 = VF.createIRI("uri:e3");
+		final IRI f1 = VF.createIRI("uri:f1");
+		final IRI f2 = VF.createIRI("uri:f2");
+		final IRI f3 = VF.createIRI("uri:f3");
+		final IRI g1 = VF.createIRI("uri:g1");
+		final IRI g2 = VF.createIRI("uri:g2");
+		final IRI g3 = VF.createIRI("uri:g3");
 
 		conn.add(e1, talksTo, f1);
 		conn.add(f1, talksTo, g1);
@@ -309,7 +306,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "a", "b", "c", "d" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final CountingResultHandler crh1 = new CountingResultHandler();
 		final CountingResultHandler crh2 = new CountingResultHandler();
@@ -330,8 +327,8 @@
 			TableNotFoundException,
 			TupleQueryResultHandlerException, AccumuloException, AccumuloSecurityException {
 
-		final URI e1 = new URIImpl("uri:e1");
-		final URI f1 = new URIImpl("uri:f1");
+		final IRI e1 = VF.createIRI("uri:e1");
+		final IRI f1 = VF.createIRI("uri:f1");
 
 		conn.add(e1, talksTo, e1);
 		conn.add(e1, talksTo, f1);
@@ -357,7 +354,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "a", "b", "c", "d" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final CountingResultHandler crh1 = new CountingResultHandler();
 		final CountingResultHandler crh2 = new CountingResultHandler();
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloPcjIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloPcjIT.java
index d8a70aa..3a29ac3 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloPcjIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/AccumuloPcjIT.java
@@ -1,7 +1,3 @@
-package org.apache.rya.indexing.external;
-
-import java.net.UnknownHostException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.external;
 
+import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -45,37 +43,37 @@
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.indexing.pcj.storage.PcjException;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.SailException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 public class AccumuloPcjIT {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	private SailRepositoryConnection conn, pcjConn;
 	private SailRepository repo, pcjRepo;
@@ -83,7 +81,7 @@
 	private final Configuration conf = getConf();
 	private final String prefix = "table_";
 	private final String tablename = "table_INDEX_";
-	private URI obj, obj2, subclass, subclass2, talksTo;
+	private IRI obj, obj2, subclass, subclass2, talksTo;
 
 	@Before
 	public void init() throws RepositoryException,
@@ -99,21 +97,21 @@
 		pcjRepo = PcjIntegrationTestingUtil.getAccumuloPcjRepo(prefix, "instance");
 		pcjConn = pcjRepo.getConnection();
 
-		final URI sub = new URIImpl("uri:entity");
-		subclass = new URIImpl("uri:class");
-		obj = new URIImpl("uri:obj");
-		talksTo = new URIImpl("uri:talksTo");
+		final IRI sub = VF.createIRI("uri:entity");
+		subclass = VF.createIRI("uri:class");
+		obj = VF.createIRI("uri:obj");
+		talksTo = VF.createIRI("uri:talksTo");
 
 		conn.add(sub, RDF.TYPE, subclass);
-		conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+		conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
 		conn.add(sub, talksTo, obj);
 
-		final URI sub2 = new URIImpl("uri:entity2");
-		subclass2 = new URIImpl("uri:class2");
-		obj2 = new URIImpl("uri:obj2");
+		final IRI sub2 = VF.createIRI("uri:entity2");
+		subclass2 = VF.createIRI("uri:class2");
+		obj2 = VF.createIRI("uri:obj2");
 
 		conn.add(sub2, RDF.TYPE, subclass2);
-		conn.add(sub2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(sub2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub2, talksTo, obj2);
 
 		accCon = ConfigUtils.getConnector(conf);
@@ -147,7 +145,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final String queryString = ""//
 				+ "SELECT ?e ?c ?l ?o " //
@@ -177,8 +175,8 @@
 			AccumuloSecurityException, TableExistsException, PcjException,
 			SailException, TableNotFoundException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?e ?l ?c " //
@@ -208,11 +206,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "o", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -232,8 +230,8 @@
 			AccumuloException, AccumuloSecurityException, TableExistsException,
 			SailException, TableNotFoundException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
@@ -263,11 +261,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "o", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -287,8 +285,8 @@
 			QueryEvaluationException, MalformedQueryException, SailException,
 			TableNotFoundException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?e ?c ?l  " //
@@ -318,11 +316,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "o", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -346,15 +344,15 @@
 		final Collection<String> vals = ops.tableIdMap().values();
 		System.out.println("Tables: " + tables + "and values " + vals);
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
@@ -386,11 +384,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "c", "l", "f", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -409,15 +407,15 @@
 			MalformedQueryException, SailException, QueryEvaluationException,
 			TupleQueryResultHandlerException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?owl  " //
@@ -448,11 +446,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "owl" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "c", "l", "f", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.deleteCoreRyaTables(accCon, prefix);
 		pcjConn.prepareTupleQuery(QueryLanguage.SPARQL, queryString).evaluate(
 				crh2);
@@ -468,16 +466,16 @@
 			TupleQueryResultHandlerException, QueryEvaluationException,
 			MalformedQueryException, SailException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		accCon.tableOperations().create("table2");
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
@@ -508,11 +506,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.deleteCoreRyaTables(accCon, prefix);
 		pcjConn.prepareTupleQuery(QueryLanguage.SPARQL, queryString).evaluate(
 				crh2);
@@ -528,24 +526,24 @@
 			AccumuloSecurityException, TableNotFoundException,
 			TableExistsException, PcjException, SailException {
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
-		final URI obj3 = new URIImpl("uri:obj3");
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
-		final URI superclass3 = new URIImpl("uri:superclass3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
+		final IRI obj3 = VF.createIRI("uri:obj3");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
+		final IRI superclass3 = VF.createIRI("uri:superclass3");
 
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 		conn.add(sub3, talksTo, obj3);
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
 		conn.add(subclass3, RDF.TYPE, superclass3);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj3, RDFS.LABEL, new LiteralImpl("label3"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj3, RDFS.LABEL, VF.createLiteral("label3"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
 				+ "{" //
@@ -575,11 +573,11 @@
 		final CountingResultHandler crh2 = new CountingResultHandler();
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "l", "e", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -598,25 +596,25 @@
 			AccumuloSecurityException, TableNotFoundException,
 			TableExistsException, PcjException, SailException {
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
-		final URI obj3 = new URIImpl("uri:obj3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
+		final IRI obj3 = VF.createIRI("uri:obj3");
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
-		final URI superclass3 = new URIImpl("uri:superclass3");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
+		final IRI superclass3 = VF.createIRI("uri:superclass3");
 
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 		conn.add(sub3, talksTo, obj3);
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
 		conn.add(subclass3, RDF.TYPE, superclass3);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj3, RDFS.LABEL, new LiteralImpl("label3"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj3, RDFS.LABEL, VF.createLiteral("label3"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
 				+ "{" //
@@ -647,11 +645,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -671,25 +669,25 @@
 			TableNotFoundException, TupleQueryResultHandlerException,
 			QueryEvaluationException, MalformedQueryException, SailException {
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
-		final URI obj3 = new URIImpl("uri:obj3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
+		final IRI obj3 = VF.createIRI("uri:obj3");
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
-		final URI superclass3 = new URIImpl("uri:superclass3");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
+		final IRI superclass3 = VF.createIRI("uri:superclass3");
 
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 		conn.add(sub3, talksTo, obj3);
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
 		conn.add(subclass3, RDF.TYPE, superclass3);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj3, RDFS.LABEL, new LiteralImpl("label3"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj3, RDFS.LABEL, VF.createLiteral("label3"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
@@ -721,11 +719,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -746,25 +744,25 @@
 			TupleQueryResultHandlerException, QueryEvaluationException,
 			SailException {
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
-		final URI obj3 = new URIImpl("uri:obj3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
+		final IRI obj3 = VF.createIRI("uri:obj3");
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
-		final URI superclass3 = new URIImpl("uri:superclass3");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
+		final IRI superclass3 = VF.createIRI("uri:superclass3");
 
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 		conn.add(sub3, talksTo, obj3);
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
 		conn.add(subclass3, RDF.TYPE, superclass3);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj3, RDFS.LABEL, new LiteralImpl("label3"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj3, RDFS.LABEL, VF.createLiteral("label3"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
 				+ "{" //
@@ -795,11 +793,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "c", "l", "e", "o", "f" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -819,25 +817,25 @@
 			TableNotFoundException, TupleQueryResultHandlerException,
 			QueryEvaluationException, MalformedQueryException, SailException {
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
-		final URI obj3 = new URIImpl("uri:obj3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
+		final IRI obj3 = VF.createIRI("uri:obj3");
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
-		final URI superclass3 = new URIImpl("uri:superclass3");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
+		final IRI superclass3 = VF.createIRI("uri:superclass3");
 
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 		conn.add(sub3, talksTo, obj3);
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
 		conn.add(subclass3, RDF.TYPE, superclass3);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj3, RDFS.LABEL, new LiteralImpl("label3"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj3, RDFS.LABEL, VF.createLiteral("label3"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
 				+ "{" //
@@ -868,11 +866,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "l", "c", "e", "f" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -891,15 +889,15 @@
 			AccumuloSecurityException, TableExistsException,
 			TableNotFoundException, PcjException, SailException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?c ?e ?l  " //
@@ -931,11 +929,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "c", "e", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "e", "o", "f", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -954,15 +952,15 @@
 			MalformedQueryException, SailException, QueryEvaluationException,
 			TupleQueryResultHandlerException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -976,7 +974,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, indexSparqlString)
 				.evaluate(crh1);
@@ -995,15 +993,15 @@
 			TupleQueryResultHandlerException, QueryEvaluationException,
 			MalformedQueryException, SailException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -1035,11 +1033,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -1056,15 +1054,15 @@
 			TableNotFoundException, TableExistsException,
 			MalformedQueryException, SailException, QueryEvaluationException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -1084,14 +1082,14 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais1 = new AccumuloIndexSet(conf,
 				tablename + 1);
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename + 2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais2 = new AccumuloIndexSet(conf,
 				tablename + 2);
@@ -1159,15 +1157,15 @@
 			TupleQueryResultHandlerException, QueryEvaluationException,
 			MalformedQueryException, SailException {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -1199,11 +1197,11 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString)
 				.evaluate(crh1);
@@ -1217,15 +1215,15 @@
 	@Test
 	public void testEvaluateTwoIndexValidate() throws Exception {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -1254,13 +1252,13 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais1 = new AccumuloIndexSet(conf, tablename+1);
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais2 = new AccumuloIndexSet(conf, tablename+2);
 
@@ -1287,26 +1285,26 @@
 	@Test
 	public void testEvaluateThreeIndexValidate() throws Exception {
 
-		final URI superclass = new URIImpl("uri:superclass");
-		final URI superclass2 = new URIImpl("uri:superclass2");
+		final IRI superclass = VF.createIRI("uri:superclass");
+		final IRI superclass2 = VF.createIRI("uri:superclass2");
 
-		final URI sub = new URIImpl("uri:entity");
-		subclass = new URIImpl("uri:class");
-		obj = new URIImpl("uri:obj");
-		talksTo = new URIImpl("uri:talksTo");
+		final IRI sub = VF.createIRI("uri:entity");
+		subclass = VF.createIRI("uri:class");
+		obj = VF.createIRI("uri:obj");
+		talksTo = VF.createIRI("uri:talksTo");
 
-		final URI howlsAt = new URIImpl("uri:howlsAt");
-		final URI subType = new URIImpl("uri:subType");
-		final URI superSuperclass = new URIImpl("uri:super_superclass");
+		final IRI howlsAt = VF.createIRI("uri:howlsAt");
+		final IRI subType = VF.createIRI("uri:subType");
+		final IRI superSuperclass = VF.createIRI("uri:super_superclass");
 
 		conn.add(subclass, RDF.TYPE, superclass);
 		conn.add(subclass2, RDF.TYPE, superclass2);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub, howlsAt, superclass);
 		conn.add(superclass, subType, superSuperclass);
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?dog ?pig ?duck  " //
@@ -1344,20 +1342,20 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+1,
 				indexSparqlString, new String[] { "dog", "pig", "duck" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais1 = new AccumuloIndexSet(conf, tablename+1);
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+2,
 				indexSparqlString2, new String[] { "o", "f", "e", "c", "l" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais2 = new AccumuloIndexSet(conf, tablename+2);
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablename+3,
 				indexSparqlString3,
 				new String[] { "wolf", "sheep", "chicken" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final AccumuloIndexSet ais3 = new AccumuloIndexSet(conf, tablename+3);
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PCJOptionalTestIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PCJOptionalTestIT.java
index 026fa34..5527afe 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PCJOptionalTestIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PCJOptionalTestIT.java
@@ -38,43 +38,42 @@
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.indexing.pcj.storage.PcjException;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.SailException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 
 public class PCJOptionalTestIT {
-
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private SailRepositoryConnection conn, pcjConn;
     private SailRepository repo, pcjRepo;
     private Connector accCon;
     String tablePrefix = "table_";
-    URI sub, sub2, obj, obj2, subclass, subclass2, talksTo, sub3, subclass3;
+    IRI sub, sub2, obj, obj2, subclass, subclass2, talksTo, sub3, subclass3;
 
     @Before
     public void init() throws RepositoryException,
@@ -90,27 +89,27 @@
         pcjRepo = PcjIntegrationTestingUtil.getAccumuloPcjRepo(tablePrefix, "instance");
         pcjConn = pcjRepo.getConnection();
 
-        sub = new URIImpl("uri:entity");
-        subclass = new URIImpl("uri:class");
-        obj = new URIImpl("uri:obj");
-        talksTo = new URIImpl("uri:talksTo");
+        sub = VF.createIRI("uri:entity");
+        subclass = VF.createIRI("uri:class");
+        obj = VF.createIRI("uri:obj");
+        talksTo = VF.createIRI("uri:talksTo");
 
         conn.add(sub, RDF.TYPE, subclass);
-        conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+        conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
         conn.add(sub, talksTo, obj);
 
-        sub2 = new URIImpl("uri:entity2");
-        subclass2 = new URIImpl("uri:class2");
-        obj2 = new URIImpl("uri:obj2");
-        sub3 = new URIImpl("uri:entity3");
-        subclass3 = new URIImpl("uri:class3");
+        sub2 = VF.createIRI("uri:entity2");
+        subclass2 = VF.createIRI("uri:class2");
+        obj2 = VF.createIRI("uri:obj2");
+        sub3 = VF.createIRI("uri:entity3");
+        subclass3 = VF.createIRI("uri:class3");
 
 
         conn.add(sub2, RDF.TYPE, subclass2);
-        conn.add(sub2, RDFS.LABEL, new LiteralImpl("label2"));
+        conn.add(sub2, RDFS.LABEL, VF.createLiteral("label2"));
         conn.add(sub2, talksTo, obj2);
         conn.add(sub3, RDF.TYPE, subclass3);
-        conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+        conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 
 
         accCon = new MockInstance("instance").getConnector("root",
@@ -147,7 +146,7 @@
 
         PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
                 + "INDEX_1", indexSparqlString, new String[] { "e", "c", "l", "o" },
-                Optional.<PcjVarOrderFactory> absent());
+                Optional.absent());
         final String queryString = ""//
                 + "SELECT ?e ?c ?l ?o " //
                 + "{" //
@@ -184,7 +183,7 @@
 
         PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
                 + "INDEX_1", indexSparqlString, new String[] { "e", "l", "o" },
-                Optional.<PcjVarOrderFactory> absent());
+                Optional.absent());
         final String queryString = ""//
                 + "SELECT ?e ?c ?l ?o " //
                 + "{" //
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PcjIntegrationTestingUtil.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PcjIntegrationTestingUtil.java
index 8b3b8f5..56eac96 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PcjIntegrationTestingUtil.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PcjIntegrationTestingUtil.java
@@ -52,22 +52,22 @@
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjDocuments;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -157,7 +157,7 @@
     }
 
     public static class BindingSetAssignmentCollector extends
-    QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
         private final Set<QueryModelNode> bindingSetList = Sets.newHashSet();
 
@@ -178,7 +178,7 @@
     }
 
     public static class ExternalTupleVisitor extends
-    QueryModelVisitorBase<RuntimeException> {
+            AbstractQueryModelVisitor<RuntimeException> {
 
         private final Set<QueryModelNode> eSet = new HashSet<>();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerIT.java
index 86e5a8e..28a2d24 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerIT.java
@@ -1,7 +1,3 @@
-package org.apache.rya.indexing.external;
-
-import java.net.UnknownHostException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.external;
 
+import java.net.UnknownHostException;
 import java.util.List;
 
 import org.apache.accumulo.core.client.AccumuloException;
@@ -30,41 +28,40 @@
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.pcj.storage.PcjException;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
+import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.SailException;
 
 import com.google.common.base.Optional;
 
-import org.apache.rya.api.persist.RyaDAOException;
-import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
-
 public class PrecompJoinOptimizerIT {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	private SailRepositoryConnection conn, pcjConn;
 	private SailRepository repo, pcjRepo;
 	private Connector accCon;
 	String tablePrefix = "table_";
-	URI sub, sub2, obj, obj2, subclass, subclass2, talksTo;
+	IRI sub, sub2, obj, obj2, subclass, subclass2, talksTo;
 
 	@Before
 	public void init() throws RepositoryException,
@@ -80,21 +77,21 @@
 		pcjRepo = PcjIntegrationTestingUtil.getAccumuloPcjRepo(tablePrefix, "instance");
 		pcjConn = pcjRepo.getConnection();
 
-		sub = new URIImpl("uri:entity");
-		subclass = new URIImpl("uri:class");
-		obj = new URIImpl("uri:obj");
-		talksTo = new URIImpl("uri:talksTo");
+		sub = VF.createIRI("uri:entity");
+		subclass = VF.createIRI("uri:class");
+		obj = VF.createIRI("uri:obj");
+		talksTo = VF.createIRI("uri:talksTo");
 
 		conn.add(sub, RDF.TYPE, subclass);
-		conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+		conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
 		conn.add(sub, talksTo, obj);
 
-		sub2 = new URIImpl("uri:entity2");
-		subclass2 = new URIImpl("uri:class2");
-		obj2 = new URIImpl("uri:obj2");
+		sub2 = VF.createIRI("uri:entity2");
+		subclass2 = VF.createIRI("uri:class2");
+		obj2 = VF.createIRI("uri:obj2");
 
 		conn.add(sub2, RDF.TYPE, subclass2);
-		conn.add(sub2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(sub2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub2, talksTo, obj2);
 
 		accCon = new MockInstance("instance").getConnector("root",
@@ -130,7 +127,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		final String queryString = ""//
 				+ "SELECT ?e ?c ?l ?o " //
 				+ "{" //
@@ -159,8 +156,8 @@
 			QueryEvaluationException, TableNotFoundException,
 			TupleQueryResultHandlerException, RyaDAOException, PcjException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
 		final String indexSparqlString = ""//
 				+ "SELECT ?e ?l ?c " //
@@ -187,10 +184,10 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_2", indexSparqlString2, new String[] { "e", "l", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		final CountingResultHandler crh = new CountingResultHandler();
 		PcjIntegrationTestingUtil.deleteCoreRyaTables(accCon, tablePrefix);
 		pcjConn.prepareTupleQuery(QueryLanguage.SPARQL, queryString).evaluate(
@@ -218,7 +215,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		final String queryString = ""//
 				+ "SELECT ?e ?c ?l ?o " //
 				+ "{" //
@@ -260,7 +257,7 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_2", indexSparqlString2, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		final String queryString = ""//
 				+ "SELECT ?e ?c ?o ?m ?l" //
@@ -301,14 +298,14 @@
 				+ "  ?e <http://www.w3.org/2000/01/rdf-schema#label> ?l "//
 				+ "}";//
 
-		final URI sub3 = new URIImpl("uri:entity3");
-		final URI subclass3 = new URIImpl("uri:class3");
+		final IRI sub3 = VF.createIRI("uri:entity3");
+		final IRI subclass3 = VF.createIRI("uri:class3");
 		conn.add(sub3, RDF.TYPE, subclass3);
-		conn.add(sub3, RDFS.LABEL, new LiteralImpl("label3"));
+		conn.add(sub3, RDFS.LABEL, VF.createLiteral("label3"));
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString1, new String[] { "e", "l", "c" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		final String queryString = ""//
 				+ "SELECT ?e ?c ?o ?m ?l" //
 				+ "{" //
@@ -324,7 +321,7 @@
 		repo = PcjIntegrationTestingUtil.getAccumuloPcjRepo(tablePrefix, "instance");
 		conn = repo.getConnection();
 		conn.add(sub, talksTo, obj);
-		conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+		conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
 		pcjConn.prepareTupleQuery(QueryLanguage.SPARQL, queryString).evaluate(
 				crh);
 
@@ -340,8 +337,8 @@
 			TupleQueryResultHandlerException, RyaDAOException, PcjException, InferenceEngineException,
 			NumberFormatException, UnknownHostException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub, RDF.TYPE, obj);
 		conn.add(sub2, RDF.TYPE, obj2);
 
@@ -372,10 +369,10 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString, new String[] { "e", "l", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_2", indexSparqlString2, new String[] { "e", "l", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.deleteCoreRyaTables(accCon, tablePrefix);
 		PcjIntegrationTestingUtil.closeAndShutdown(conn, repo);
@@ -399,15 +396,15 @@
 			TupleQueryResultHandlerException, RyaDAOException, PcjException, InferenceEngineException,
 			NumberFormatException, UnknownHostException {
 
-		conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-		conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+		conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+		conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 		conn.add(sub, RDF.TYPE, obj);
 		conn.add(sub2, RDF.TYPE, obj2);
 
-		final URI livesIn = new URIImpl("uri:livesIn");
-		final URI city = new URIImpl("uri:city");
-		final URI city2 = new URIImpl("uri:city2");
-		final URI city3 = new URIImpl("uri:city3");
+		final IRI livesIn = VF.createIRI("uri:livesIn");
+		final IRI city = VF.createIRI("uri:city");
+		final IRI city2 = VF.createIRI("uri:city2");
+		final IRI city3 = VF.createIRI("uri:city3");
 		conn.add(sub, livesIn, city);
 		conn.add(sub2, livesIn, city2);
 		conn.add(sub2, livesIn, city3);
@@ -438,10 +435,10 @@
 
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_1", indexSparqlString, new String[] { "e", "l", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 		PcjIntegrationTestingUtil.createAndPopulatePcj(conn, accCon, tablePrefix
 				+ "INDEX_2", indexSparqlString2, new String[] { "e", "l", "o" },
-				Optional.<PcjVarOrderFactory> absent());
+				Optional.absent());
 
 		PcjIntegrationTestingUtil.deleteCoreRyaTables(accCon, tablePrefix);
 		PcjIntegrationTestingUtil.closeAndShutdown(conn, repo);
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest.java
index 0035898..79c5014 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.rya.indexing.external;
 
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -34,18 +33,18 @@
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -432,7 +431,7 @@
     }
 
     public static class NodeCollector extends
-    QueryModelVisitorBase<RuntimeException> {
+    AbstractQueryModelVisitor<RuntimeException> {
 
         Set<QueryModelNode> qNodes = new HashSet<>();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java
index 2988ff3..54960c4 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerTest2.java
@@ -33,17 +33,17 @@
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
index b3823de..0628afe 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/PrecompJoinOptimizerVarToConstTest.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -29,15 +28,15 @@
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
index fa8aac6..77c5f08 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetColumnVisibilityTest.java
@@ -16,14 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
 package org.apache.rya.indexing.external.tupleSet;
 
 import static org.junit.Assert.assertEquals;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Date;
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -56,23 +55,21 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryException;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.repository.RepositoryException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Tests the evaluation of {@link AccumuloIndexSet}.
  */
@@ -94,6 +91,7 @@
     private static String pcjId;
     private static QueryBindingSet pcjBs1;
     private static QueryBindingSet pcjBs2;
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @BeforeClass
     public static void init() throws AccumuloException, AccumuloSecurityException, PCJStorageException, IOException, InterruptedException, TableNotFoundException, AlreadyInitializedException, RyaDetailsRepositoryException {
@@ -119,12 +117,12 @@
 
         // Store the PCJ's results.
         pcjBs1 = new QueryBindingSet();
-        pcjBs1.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
-        pcjBs1.addBinding("name", new URIImpl("http://Alice"));
+        pcjBs1.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
+        pcjBs1.addBinding("name", VF.createIRI("http://Alice"));
 
         pcjBs2 = new QueryBindingSet();
-        pcjBs2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
-        pcjBs2.addBinding("name", new URIImpl("http://Bob"));
+        pcjBs2.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
+        pcjBs2.addBinding("name", VF.createIRI("http://Bob"));
 
         final Set<VisibilityBindingSet> visBs = new HashSet<>();
         for (final BindingSet bs : Sets.<BindingSet>newHashSet(pcjBs1, pcjBs2)) {
@@ -179,8 +177,8 @@
                 .setPCJIndexDetails(
                         PCJIndexDetails.builder()
                             .setEnabled(true) )
-                .setJoinSelectivityDetails( new JoinSelectivityDetails( Optional.<Date>absent() ) )
-                .setProspectorDetails( new ProspectorDetails( Optional.<Date>absent() ))
+                .setJoinSelectivityDetails( new JoinSelectivityDetails( Optional.absent() ) )
+                .setProspectorDetails( new ProspectorDetails( Optional.absent() ))
                 .build();
 
         detailsRepo.initialize(details);
@@ -205,11 +203,11 @@
 
         // Setup the binding sets that will be evaluated.
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("name", new URIImpl("http://Alice"));
+        bs.addBinding("name", VF.createIRI("http://Alice"));
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("name", new URIImpl("http://Bob"));
+        bs2.addBinding("name", VF.createIRI("http://Bob"));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs, bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs, bs2);
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
@@ -218,7 +216,7 @@
             fetchedResults.add(next);
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(pcjBs1, pcjBs2);
+        final Set<BindingSet> expected = Sets.newHashSet(pcjBs1, pcjBs2);
         assertEquals(expected, fetchedResults);
     }
 
@@ -230,11 +228,11 @@
 
         // Setup the binding sets that will be evaluated.
         final QueryBindingSet bs1 = new QueryBindingSet();
-        bs1.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bs1.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        bs2.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet> newHashSet(bs1, bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs1, bs2);
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
@@ -243,7 +241,7 @@
             fetchedResults.add(next);
         }
 
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(pcjBs1, pcjBs2);
+        final Set<BindingSet> expected = Sets.newHashSet(pcjBs1, pcjBs2);
         assertEquals(expected, fetchedResults);
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java
index 2b14f6e..6bddd85 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/AccumuloIndexSetTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.rya.indexing.external.tupleSet;
 
+import java.math.BigInteger;
 import java.net.UnknownHostException;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -30,35 +31,6 @@
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.client.admin.TableOperations;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.rya.indexing.pcj.storage.PcjException;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.SailException;
-
-import com.google.common.base.Optional;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.persist.RyaDAOException;
@@ -66,9 +38,33 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.external.PcjIntegrationTestingUtil;
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer;
+import org.apache.rya.indexing.pcj.storage.PcjException;
+import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.SailException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.common.base.Optional;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
 public class AccumuloIndexSetTest {
 
@@ -77,6 +73,7 @@
      protected RepositoryConnection ryaConn = null;
      protected Configuration conf = getConf();
      protected String prefix = "rya_";
+     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Before
     public void init() throws AccumuloException, AccumuloSecurityException,
@@ -104,14 +101,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -128,7 +125,7 @@
 
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
@@ -139,18 +136,18 @@
         }
         // Ensure the expected results match those that were stored.
         final QueryBindingSet alice = new QueryBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final QueryBindingSet bob = new QueryBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final QueryBindingSet charlie = new QueryBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        final Set<BindingSet> expectedResults = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+        final Set<BindingSet> expectedResults = Sets.newHashSet(alice, bob, charlie);
         Assert.assertEquals(expectedResults, fetchedResults);
     }
 
@@ -167,14 +164,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -192,17 +189,17 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("name",new URIImpl("http://Alice"));
-        bs.addBinding("location",new URIImpl("http://Virginia"));
+        bs.addBinding("name",VF.createIRI("http://Alice"));
+        bs.addBinding("location",VF.createIRI("http://Virginia"));
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bs);
 
-        bs.addBinding("age",new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        bs.addBinding("age",VF.createLiteral(BigInteger.valueOf(14)));
         Assert.assertEquals(bs, results.next());
     }
 
@@ -211,14 +208,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -236,31 +233,31 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs.addBinding("name",new URIImpl("http://Alice"));
+        bs.addBinding("birthDate",VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs.addBinding("name",VF.createIRI("http://Alice"));
 
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs2.addBinding("name",new URIImpl("http://Bob"));
+        bs2.addBinding("birthDate",VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs2.addBinding("name",VF.createIRI("http://Bob"));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs,bs2);
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
         final QueryBindingSet alice = new QueryBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
-        alice.addBinding("birthDate", new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
+        alice.addBinding("birthDate", VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
 
         final QueryBindingSet bob = new QueryBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
-        bob.addBinding("birthDate", new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
+        bob.addBinding("birthDate", VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
         while(results.hasNext()) {
@@ -277,14 +274,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -302,7 +299,7 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
@@ -317,14 +314,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -342,29 +339,29 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs.addBinding("location",new URIImpl("http://Virginia"));
+        bs.addBinding("birthDate",VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs.addBinding("location",VF.createIRI("http://Virginia"));
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bs);
 
         final QueryBindingSet alice = new QueryBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
         alice.addAll(bs);
 
         final QueryBindingSet bob = new QueryBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
         bob.addAll(bs);
 
         final QueryBindingSet charlie = new QueryBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
         charlie.addAll(bs);
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
@@ -380,14 +377,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -405,50 +402,50 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs.addBinding("location",new URIImpl("http://Virginia"));
+        bs.addBinding("birthDate",VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs.addBinding("location",VF.createIRI("http://Virginia"));
 
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs2.addBinding("location",new URIImpl("http://Georgia"));
+        bs2.addBinding("birthDate",VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs2.addBinding("location",VF.createIRI("http://Georgia"));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs,bs2);
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
         final QueryBindingSet alice1 = new QueryBindingSet();
-        alice1.addBinding("name", new URIImpl("http://Alice"));
-        alice1.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice1.addBinding("name", VF.createIRI("http://Alice"));
+        alice1.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
         alice1.addAll(bs);
 
         final QueryBindingSet bob1 = new QueryBindingSet();
-        bob1.addBinding("name", new URIImpl("http://Bob"));
-        bob1.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob1.addBinding("name", VF.createIRI("http://Bob"));
+        bob1.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
         bob1.addAll(bs);
 
         final QueryBindingSet charlie1 = new QueryBindingSet();
-        charlie1.addBinding("name", new URIImpl("http://Charlie"));
-        charlie1.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie1.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie1.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
         charlie1.addAll(bs);
 
         final QueryBindingSet alice2 = new QueryBindingSet();
-        alice2.addBinding("name", new URIImpl("http://Alice"));
-        alice2.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice2.addBinding("name", VF.createIRI("http://Alice"));
+        alice2.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
         alice2.addAll(bs2);
 
         final QueryBindingSet bob2 = new QueryBindingSet();
-        bob2.addBinding("name", new URIImpl("http://Bob"));
-        bob2.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob2.addBinding("name", VF.createIRI("http://Bob"));
+        bob2.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
         bob2.addAll(bs2);
 
         final QueryBindingSet charlie2 = new QueryBindingSet();
-        charlie2.addBinding("name", new URIImpl("http://Charlie"));
-        charlie2.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie2.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie2.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
         charlie2.addAll(bs2);
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
@@ -466,14 +463,14 @@
     RyaTypeResolverException, MalformedQueryException, SailException, QueryEvaluationException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -491,7 +488,7 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final String sparql2 =
                 "SELECT ?x ?y " +
@@ -510,29 +507,29 @@
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf, pcjTableName);
         ais.setProjectionExpr((Projection) pq.getTupleExpr());
         ais.setTableVarMap(map);
-        ais.setSupportedVariableOrderMap(Lists.<String>newArrayList("x;y","y;x"));
+        ais.setSupportedVariableOrderMap(Lists.newArrayList("x;y","y;x"));
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs.addBinding("x",new URIImpl("http://Alice"));
+        bs.addBinding("birthDate",VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs.addBinding("x",VF.createIRI("http://Alice"));
 
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs2.addBinding("x",new URIImpl("http://Bob"));
+        bs2.addBinding("birthDate",VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs2.addBinding("x",VF.createIRI("http://Bob"));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs,bs2);
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
         final QueryBindingSet alice = new QueryBindingSet();
-        alice.addBinding("x", new URIImpl("http://Alice"));
-        alice.addBinding("y", new NumericLiteralImpl(14, XMLSchema.INTEGER));
-        alice.addBinding("birthDate", new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
+        alice.addBinding("x", VF.createIRI("http://Alice"));
+        alice.addBinding("y", VF.createLiteral(BigInteger.valueOf(14)));
+        alice.addBinding("birthDate", VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
 
         final QueryBindingSet bob = new QueryBindingSet();
-        bob.addBinding("x", new URIImpl("http://Bob"));
-        bob.addBinding("y", new NumericLiteralImpl(16, XMLSchema.INTEGER));
-        bob.addBinding("birthDate", new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
+        bob.addBinding("x", VF.createIRI("http://Bob"));
+        bob.addBinding("y", VF.createLiteral(BigInteger.valueOf(16)));
+        bob.addBinding("birthDate", VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
 
 
         final Set<BindingSet> fetchedResults = new HashSet<>();
@@ -549,14 +546,14 @@
     public void accumuloIndexSetTestWithTwoDirectProductBindingSetsWithConstantMapping() throws Exception {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -573,7 +570,7 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         final String sparql2 =
                 "SELECT ?x " +
@@ -590,14 +587,14 @@
         ais.setProjectionExpr((Projection) QueryVariableNormalizer.getNormalizedIndex(pq2.getTupleExpr(), pq1.getTupleExpr()).get(0));
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("birthDate",new LiteralImpl("1983-03-17",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs.addBinding("x",new URIImpl("http://Alice"));
+        bs.addBinding("birthDate",VF.createLiteral("1983-03-17",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs.addBinding("x",VF.createIRI("http://Alice"));
 
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("birthDate",new LiteralImpl("1983-04-18",new URIImpl("http://www.w3.org/2001/XMLSchema#date")));
-        bs2.addBinding("x",new URIImpl("http://Bob"));
+        bs2.addBinding("birthDate",VF.createLiteral("1983-04-18",VF.createIRI("http://www.w3.org/2001/XMLSchema#date")));
+        bs2.addBinding("x",VF.createIRI("http://Bob"));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs,bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs,bs2);
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
@@ -611,13 +608,13 @@
     }
 
     @Test
-    public void accumuloIndexSetTestAttemptJoinAccrossTypes() throws Exception {
+    public void accumuloIndexSetTestAttemptJoinAcrossTypes() throws Exception {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -634,15 +631,15 @@
         final String pcjTableName = new PcjTableNameFactory().makeTableName(prefix, "testPcj");
 
         // Create and populate the PCJ table.
-        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        PcjIntegrationTestingUtil.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
         final AccumuloIndexSet ais = new AccumuloIndexSet(conf,pcjTableName);
 
         final QueryBindingSet bs1 = new QueryBindingSet();
-        bs1.addBinding("age",new LiteralImpl("16"));
+        bs1.addBinding("age", VF.createLiteral("16"));
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("age",new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        bs2.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
-        final Set<BindingSet> bSets = Sets.<BindingSet>newHashSet(bs1,bs2);
+        final Set<BindingSet> bSets = Sets.newHashSet(bs1,bs2);
 
         final CloseableIteration<BindingSet, QueryEvaluationException> results = ais.evaluate(bSets);
 
@@ -652,7 +649,7 @@
             fetchedResults.add(next);
         }
 
-        bs2.addBinding("name", new URIImpl("http://Alice"));
+        bs2.addBinding("name", VF.createIRI("http://Alice"));
         Assert.assertEquals(Sets.<BindingSet>newHashSet(bs2), fetchedResults);
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
index cc260af..607c1ef 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/ParsedQueryUtilTest.java
@@ -20,11 +20,11 @@
 
 import static org.junit.Assert.assertTrue;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Optional;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/QueryVariableNormalizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/QueryVariableNormalizerTest.java
index c191003..9c76f4d 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/QueryVariableNormalizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/QueryVariableNormalizerTest.java
@@ -19,25 +19,20 @@
  * under the License.
  */
 
-
-
 import java.util.List;
 import java.util.Set;
 
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer;
-
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 
-
-
 public class QueryVariableNormalizerTest {
 
 	private String q1 = ""//
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSetTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSetTest.java
index 15dfff4..f9ec5c7 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSetTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/SimpleExternalTupleSetTest.java
@@ -26,11 +26,11 @@
 import java.util.Map;
 import java.util.Set;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 /**
  * Tests {@link SimpleExternalTupleSet}.
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/VarConstQueryVariableNormalizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/VarConstQueryVariableNormalizerTest.java
index ebd1294..2a0afe0 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/VarConstQueryVariableNormalizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/external/tupleSet/VarConstQueryVariableNormalizerTest.java
@@ -19,22 +19,20 @@
  * under the License.
  */
 
-
 import java.util.List;
 import java.util.Set;
 
 import org.apache.rya.indexing.pcj.matching.QueryVariableNormalizer;
-
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -723,7 +721,7 @@
     
     
     
-    private static class FilterCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class FilterCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private List<QueryModelNode> filterList = Lists.newArrayList();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoDbSmartUriIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoDbSmartUriIT.java
index 6b73691..8d86a6d 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoDbSmartUriIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoDbSmartUriIT.java
@@ -52,34 +52,31 @@
 import org.apache.rya.indexing.smarturi.SmartUriAdapter;
 import org.apache.rya.indexing.smarturi.SmartUriException;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.joda.time.DateTime;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Tests for MongoDB based Smart URI.
  */
 public class MongoDbSmartUriIT extends MongoITBase {
     private static final String NAMESPACE = RyaSchema.NAMESPACE;
-    private static final ValueFactory VALUE_FACTORY = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     // People
     private static final RyaURI BOB = createRyaUri("Bob");
@@ -142,7 +139,7 @@
      * @return the {@link RyraURI}.
      */
     private static RyaURI createRyaUri(final String namespace, final String localName) {
-        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createURI(namespace, localName));
+        return RdfToRyaConversions.convertURI(VF.createIRI(namespace, localName));
     }
 
     private static Entity createBobEntity() {
@@ -162,7 +159,7 @@
             .setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime().minusYears(40))))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(new Date())))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(true)))
-            .setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bob.smitch00@gmail.com"))))
+            .setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bob.smitch00@gmail.com"))))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_ATTRIBUTE_SPACE, stringRyaType("attribute space")))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_MOTTO, stringRyaType("!@#*\\&%20^ smörgåsbord")))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_BLOOD_TYPE, stringRyaType("A+ blood type")))
@@ -214,18 +211,18 @@
     }
 
     private static String getRyaUriLocalName(final RyaURI ryaUri) {
-        return new URIImpl(ryaUri.getData()).getLocalName();
+        return VF.createIRI(ryaUri.getData()).getLocalName();
     }
 
     @Test
     public void testSerializeDeserialize() throws SmartUriException, URISyntaxException {
-        final URI smartUri = SmartUriAdapter.serializeUriEntity(BOB_ENTITY);
+        final IRI smartUri = SmartUriAdapter.serializeUriEntity(BOB_ENTITY);
         final Entity resultEntity = SmartUriAdapter.deserializeUriEntity(smartUri);
         assertEquals(BOB_ENTITY.getSubject(), resultEntity.getSubject());
     }
 
     @Test
-    public void testStorage() throws SmartUriException, MalformedQueryException, RuntimeException, QueryEvaluationException {
+    public void testStorage() throws SmartUriException, RuntimeException {
         smartUriConverter.storeEntity(BOB_ENTITY);
 
         final String sparql = "SELECT * WHERE { " +
@@ -295,7 +292,7 @@
         // Look up Person Type Entities that match Bob's SSN property
         final Set<Property> properties = new LinkedHashSet<>();
         properties.add(BOB_ENTITY.lookupTypeProperty(PERSON_TYPE, HAS_SSN).get());
-        final Map<URI, Value> map = SmartUriAdapter.propertiesToMap(properties);
+        final Map<IRI, Value> map = SmartUriAdapter.propertiesToMap(properties);
 
         final ConvertingCursor<TypedEntity> cursor = smartUriConverter.queryEntity(PERSON_TYPE, map);
         int count = 0;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndex2IT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndex2IT.java
index ee3869f..3a38923 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndex2IT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndex2IT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -30,18 +30,17 @@
 import org.apache.rya.indexing.entity.storage.EntityStorage;
 import org.apache.rya.indexing.entity.storage.TypeStorage;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -230,7 +229,7 @@
         expr.visit(new EntityFetchingAsserterVisitor(expected));
     }
 
-    private class EntityFetchingAsserterVisitor extends QueryModelVisitorBase<Exception> {
+    private class EntityFetchingAsserterVisitor extends AbstractQueryModelVisitor<Exception> {
         private final EntityQueryNode expected;
         public EntityFetchingAsserterVisitor(final EntityQueryNode expected) {
             this.expected = expected;
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndexIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndexIT.java
index 463cabc..f49f274 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndexIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoEntityIndexIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -21,6 +21,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Optional;
 import java.util.Set;
@@ -35,24 +36,24 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.google.common.collect.ImmutableSet;
 
 public class MongoEntityIndexIT extends MongoITBase {
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
@@ -108,8 +109,8 @@
                 results.add(bs);
             }
             final MapBindingSet expected = new MapBindingSet();
-            expected.addBinding("flavor", ValueFactoryImpl.getInstance().createLiteral("Strawberry"));
-            expected.addBinding("brand", ValueFactoryImpl.getInstance().createLiteral("Awesome Icecream"));
+            expected.addBinding("flavor", VF.createLiteral("Strawberry"));
+            expected.addBinding("brand", VF.createLiteral("Awesome Icecream"));
 
             assertEquals(1, results.size());
             assertEquals(expected, results.iterator().next());
@@ -145,11 +146,10 @@
                 System.out.println(bs);
                 results.add(bs);
             }
-            final ValueFactory vf = ValueFactoryImpl.getInstance();
             final MapBindingSet expected = new MapBindingSet();
-            //expected.addBinding("name", vf.createURI("http://www.w3.org/2001/SMLSchema#string", "George"));
-            expected.addBinding("name", vf.createLiteral("George"));
-            expected.addBinding("eye", vf.createLiteral("blue"));
+            //expected.addBinding("name", VF.createIRI("http://www.w3.org/2001/SMLSchema#string", "George"));
+            expected.addBinding("name", VF.createLiteral("George"));
+            expected.addBinding("eye", VF.createLiteral("blue"));
 
             assertEquals(1, results.size());
             assertEquals(expected, results.iterator().next());
@@ -197,122 +197,124 @@
 
     private void addStatements(SailRepositoryConnection conn) throws Exception {
         //alice
-        URI subject = VF.createURI("urn:alice");
-        URI predicate = VF.createURI("urn:name");
+        IRI subject = VF.createIRI("urn:alice");
+        IRI predicate = VF.createIRI("urn:name");
         Value object = VF.createLiteral("Alice");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("blue");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(30);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(30));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //bob
-        subject = VF.createURI("urn:bob");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:bob");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("Bob");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("brown");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(57);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(57));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //charlie
-        subject = VF.createURI("urn:charlie");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:charlie");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("Charlie");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("hazel");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(25);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(25));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //david
-        subject = VF.createURI("urn:david");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:david");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("David");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("brown");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(30);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(30));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //eve
-        subject = VF.createURI("urn:eve");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:eve");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("Bob");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(25);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(25));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //frank
-        subject = VF.createURI("urn:frank");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:frank");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("Frank");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("Hazel");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(57);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(57));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         //george
-        subject = VF.createURI("urn:george");
-        predicate = VF.createURI("urn:name");
+        subject = VF.createIRI("urn:george");
+        predicate = VF.createIRI("urn:name");
         object = VF.createLiteral("George");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:eye");
+        predicate = VF.createIRI("urn:eye");
         object = VF.createLiteral("blue");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:age");
-        object = VF.createLiteral(30);
+        predicate = VF.createIRI("urn:age");
+        object = VF.createLiteral(BigInteger.valueOf(30));
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:person")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:person")));
 
         // Some Icecream typed objects.
         //chocolate
-        subject = VF.createURI("urn:chocolate");
-        predicate = VF.createURI("urn:brand");
+        subject = VF.createIRI("urn:chocolate");
+        predicate = VF.createIRI("urn:brand");
         object = VF.createLiteral("Awesome Icecream");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:flavor");
+        predicate = VF.createIRI("urn:flavor");
         object = VF.createLiteral("Chocolate");
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:icecream")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream")));
 
         //vanilla
-        subject = VF.createURI("urn:vanilla");
-        predicate = VF.createURI("urn:brand");
+        subject = VF.createIRI("urn:vanilla");
+        predicate = VF.createIRI("urn:brand");
         object = VF.createLiteral("Awesome Icecream");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:flavor");
+        predicate = VF.createIRI("urn:flavor");
         object = VF.createLiteral("Vanilla");
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:icecream")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream")));
 
         //strawberry
-        subject = VF.createURI("urn:strawberry");
-        predicate = VF.createURI("urn:brand");
+        subject = VF.createIRI("urn:strawberry");
+        predicate = VF.createIRI("urn:brand");
         object = VF.createLiteral("Awesome Icecream");
         conn.add(VF.createStatement(subject, predicate, object));
-        predicate = VF.createURI("urn:flavor");
+        predicate = VF.createIRI("urn:flavor");
         object = VF.createLiteral("Strawberry");
         conn.add(VF.createStatement(subject, predicate, object));
-        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createURI("urn:icecream")));
+        conn.add(VF.createStatement(subject, RDF.TYPE, VF.createIRI("urn:icecream")));
+
+        conn.commit();
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoFreeTextIndexerIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoFreeTextIndexerIT.java
index a8d496e..d827f78 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoFreeTextIndexerIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoFreeTextIndexerIT.java
@@ -33,19 +33,17 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.freetext.MongoFreeTextIndexer;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDFS;
 
 import com.google.common.collect.Sets;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Integration tests the methods of {@link MongoFreeTextIndexer}.
  */
@@ -58,13 +56,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
-            final URI subject = new URIImpl("foo:subj");
-            final URI predicate = RDFS.LABEL;
+            final IRI subject = vf.createIRI("foo:subj");
+            final IRI predicate = RDFS.LABEL;
             final Value object = vf.createLiteral("this is a new hat");
 
-            final URI context = new URIImpl("foo:context");
+            final IRI context = vf.createIRI("foo:context");
 
             final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement));
@@ -83,22 +81,22 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
-            final URI subject1 = new URIImpl("foo:subj");
-            final URI predicate1 = RDFS.LABEL;
+            final IRI subject1 = vf.createIRI("foo:subj");
+            final IRI predicate1 = RDFS.LABEL;
             final Value object1 = vf.createLiteral("this is a new hat");
 
-            final URI context1 = new URIImpl("foo:context");
+            final IRI context1 = vf.createIRI("foo:context");
 
             final Statement statement1 = vf.createStatement(subject1, predicate1, object1, context1);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement1));
 
-            final URI subject2 = new URIImpl("foo:subject");
-            final URI predicate2 = RDFS.LABEL;
+            final IRI subject2 = vf.createIRI("foo:subject");
+            final IRI predicate2 = RDFS.LABEL;
             final Value object2 = vf.createLiteral("Do you like my new hat?");
 
-            final URI context2 = new URIImpl("foo:context");
+            final IRI context2 = vf.createIRI("foo:context");
 
             final Statement statement2 = vf.createStatement(subject2, predicate2, object2, context2);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement2));
@@ -161,11 +159,11 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final URI subject = new URIImpl("foo:subj");
-            final URI predicate = new URIImpl(RDFS.COMMENT.toString());
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final IRI subject = vf.createIRI("foo:subj");
+            final IRI predicate = vf.createIRI(RDFS.COMMENT.toString());
             final Value object = vf.createLiteral("this is a new hat");
-            final URI context = new URIImpl("foo:context");
+            final IRI context = vf.createIRI("foo:context");
 
             final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(RdfToRyaConversions.convertStatement(statement));
@@ -174,7 +172,7 @@
             assertEquals(Sets.newHashSet(statement), getSet(f.queryText("hat", EMPTY_CONSTRAINTS)));
             assertEquals(Sets.newHashSet(statement), getSet(f.queryText("hat", new StatementConstraints().setContext(context))));
             assertEquals(Sets.newHashSet(),
-                    getSet(f.queryText("hat", new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryText("hat", new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
         }
     }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPCJIndexIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPCJIndexIT.java
index 1503b53..c169dac 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPCJIndexIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPCJIndexIT.java
@@ -33,21 +33,21 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 public class MongoPCJIndexIT extends MongoITBase {
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
@@ -96,27 +96,27 @@
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Alice"));
+        bs.addBinding("name", VF.createIRI("urn:Alice"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Bob"));
+        bs.addBinding("name", VF.createIRI("urn:Bob"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Charlie"));
+        bs.addBinding("name", VF.createIRI("urn:Charlie"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:David"));
+        bs.addBinding("name", VF.createIRI("urn:David"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Eve"));
+        bs.addBinding("name", VF.createIRI("urn:Eve"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Frank"));
+        bs.addBinding("name", VF.createIRI("urn:Frank"));
         expectedResults.add(bs);
 
         assertEquals(6, results.size());
@@ -173,15 +173,15 @@
 
         MapBindingSet bs = new MapBindingSet();
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:David"));
+        bs.addBinding("name", VF.createIRI("urn:David"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Eve"));
+        bs.addBinding("name", VF.createIRI("urn:Eve"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", VF.createURI("urn:Frank"));
+        bs.addBinding("name", VF.createIRI("urn:Frank"));
         expectedResults.add(bs);
 
         assertEquals(3, results.size());
@@ -202,32 +202,32 @@
 
     private Set<Statement> getStatements() throws Exception {
     	final Set<Statement> statements = new HashSet<>();
-    	statements.add(VF.createStatement(VF.createURI("urn:Alice"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:Bob"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:Charlie"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:David"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:Eve"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:Frank"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:George"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
-        statements.add(VF.createStatement(VF.createURI("urn:Hillary"), VF.createURI("urn:likes"), VF.createURI("urn:icecream")));
+    	statements.add(VF.createStatement(VF.createIRI("urn:Alice"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Bob"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Charlie"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:David"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Eve"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Frank"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:George"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Hillary"), VF.createIRI("urn:likes"), VF.createIRI("urn:icecream")));
         
-        statements.add(VF.createStatement(VF.createURI("urn:Alice"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Bob"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Charlie"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:David"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Eve"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Frank"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:George"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:green")));
-        statements.add(VF.createStatement(VF.createURI("urn:Hillary"), VF.createURI("urn:hasEyeColor"), VF.createURI("urn:brown")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Alice"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Bob"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Charlie"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:David"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Eve"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Frank"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:George"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:green")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Hillary"), VF.createIRI("urn:hasEyeColor"), VF.createIRI("urn:brown")));
         
-        statements.add(VF.createStatement(VF.createURI("urn:Alice"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Bob"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:Charlie"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:blue")));
-        statements.add(VF.createStatement(VF.createURI("urn:David"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:brown")));
-        statements.add(VF.createStatement(VF.createURI("urn:Eve"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:brown")));
-        statements.add(VF.createStatement(VF.createURI("urn:Frank"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:brown")));
-        statements.add(VF.createStatement(VF.createURI("urn:George"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:blonde")));
-        statements.add(VF.createStatement(VF.createURI("urn:Hillary"), VF.createURI("urn:hasHairColor"), VF.createURI("urn:blonde")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Alice"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Bob"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Charlie"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:blue")));
+        statements.add(VF.createStatement(VF.createIRI("urn:David"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:brown")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Eve"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:brown")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Frank"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:brown")));
+        statements.add(VF.createStatement(VF.createIRI("urn:George"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:blonde")));
+        statements.add(VF.createStatement(VF.createIRI("urn:Hillary"), VF.createIRI("urn:hasHairColor"), VF.createIRI("urn:blonde")));
         return statements;
     }
 }
\ No newline at end of file
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPcjIntegrationTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPcjIntegrationTest.java
index af81cf6..ea58d11 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPcjIntegrationTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoPcjIntegrationTest.java
@@ -38,42 +38,44 @@
 import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.google.common.collect.Lists;
 
 public class MongoPcjIntegrationTest extends MongoITBase {
-    private static final URI talksTo = new URIImpl("uri:talksTo");
-    private static final URI sub = new URIImpl("uri:entity");
-    private static final URI sub2 = new URIImpl("uri:entity2");
-    private static final URI subclass = new URIImpl("uri:class");
-    private static final URI subclass2 = new URIImpl("uri:class2");
-    private static final URI obj = new URIImpl("uri:obj");
-    private static final URI obj2 = new URIImpl("uri:obj2");
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
+    private static final IRI talksTo = VF.createIRI("uri:talksTo");
+    private static final IRI sub = VF.createIRI("uri:entity");
+    private static final IRI sub2 = VF.createIRI("uri:entity2");
+    private static final IRI subclass = VF.createIRI("uri:class");
+    private static final IRI subclass2 = VF.createIRI("uri:class2");
+    private static final IRI obj = VF.createIRI("uri:obj");
+    private static final IRI obj2 = VF.createIRI("uri:obj2");
 
     private void addPCJS(final SailRepositoryConnection conn) throws Exception {
         conn.add(sub, RDF.TYPE, subclass);
-        conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+        conn.add(sub, RDFS.LABEL, VF.createLiteral("label"));
         conn.add(sub, talksTo, obj);
 
         conn.add(sub2, RDF.TYPE, subclass2);
-        conn.add(sub2, RDFS.LABEL, new LiteralImpl("label2"));
+        conn.add(sub2, RDFS.LABEL, VF.createLiteral("label2"));
         conn.add(sub2, talksTo, obj2);
     }
 
@@ -135,13 +137,13 @@
         final SailRepositoryConnection pcjConn = new SailRepository(pcjSail).getConnection();
         addPCJS(pcjConn);
         try {
-            final URI superclass = new URIImpl("uri:superclass");
-            final URI superclass2 = new URIImpl("uri:superclass2");
+            final IRI superclass = VF.createIRI("uri:superclass");
+            final IRI superclass2 = VF.createIRI("uri:superclass2");
 
             conn.add(subclass, RDF.TYPE, superclass);
             conn.add(subclass2, RDF.TYPE, superclass2);
-            conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-            conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+            conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+            conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
             final String indexSparqlString = ""//
                     + "SELECT ?dog ?pig ?duck  " //
@@ -178,13 +180,13 @@
         final SailRepositoryConnection pcjConn = new SailRepository(pcjSail).getConnection();
         addPCJS(pcjConn);
         try {
-            final URI superclass = new URIImpl("uri:superclass");
-            final URI superclass2 = new URIImpl("uri:superclass2");
+            final IRI superclass = VF.createIRI("uri:superclass");
+            final IRI superclass2 = VF.createIRI("uri:superclass2");
 
             conn.add(subclass, RDF.TYPE, superclass);
             conn.add(subclass2, RDF.TYPE, superclass2);
-            conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-            conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+            conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+            conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
 
             final String indexSparqlString = ""//
                     + "SELECT ?dog ?pig ?duck  " //
@@ -252,17 +254,17 @@
         final SailRepositoryConnection pcjConn = new SailRepository(pcjSail).getConnection();
         addPCJS(pcjConn);
         try {
-            final URI superclass = new URIImpl("uri:superclass");
-            final URI superclass2 = new URIImpl("uri:superclass2");
+            final IRI superclass = VF.createIRI("uri:superclass");
+            final IRI superclass2 = VF.createIRI("uri:superclass2");
 
-            final URI howlsAt = new URIImpl("uri:howlsAt");
-            final URI subType = new URIImpl("uri:subType");
-            final URI superSuperclass = new URIImpl("uri:super_superclass");
+            final IRI howlsAt = VF.createIRI("uri:howlsAt");
+            final IRI subType = VF.createIRI("uri:subType");
+            final IRI superSuperclass = VF.createIRI("uri:super_superclass");
 
             conn.add(subclass, RDF.TYPE, superclass);
             conn.add(subclass2, RDF.TYPE, superclass2);
-            conn.add(obj, RDFS.LABEL, new LiteralImpl("label"));
-            conn.add(obj2, RDFS.LABEL, new LiteralImpl("label2"));
+            conn.add(obj, RDFS.LABEL, VF.createLiteral("label"));
+            conn.add(obj2, RDFS.LABEL, VF.createLiteral("label2"));
             conn.add(sub, howlsAt, superclass);
             conn.add(superclass, subType, superSuperclass);
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerIT.java
index e92bcbb..5a7598e 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/mongo/MongoTemporalIndexerIT.java
@@ -40,14 +40,14 @@
 import org.apache.rya.indexing.mongodb.temporal.MongoTemporalIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.QueryEvaluationException;
 
 import com.mongodb.DB;
 import com.mongodb.DBCollection;
@@ -56,8 +56,6 @@
 import com.mongodb.MongoException;
 import com.mongodb.MongoSecurityException;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * JUnit tests for TemporalIndexer and it's implementation MongoTemporalIndexer
  *
@@ -138,23 +136,23 @@
 
     static {
         // Setup the statements only once. Each test will store some of these in there own index table.
-        final ValueFactory vf = new ValueFactoryImpl();
-        final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
         // tiB03_E20 read as: time interval that Begins 3 seconds, ends at 20 seconds,
         // Each time element the same, except seconds. year, month, .... minute are the same for each statement below.
-        spo_B00_E01 = new StatementImpl(vf.createURI("foo:event0"), pred1_atTime, vf.createLiteral(tvB00_E01.toString()));
-        spo_B02_E29 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E29.toString()));
-        spo_B02_E30 = new StatementImpl(vf.createURI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E30.toString()));
-        spo_B02_E31 = new StatementImpl(vf.createURI("foo:event3"), pred1_atTime, vf.createLiteral(tvB02_E31.toString()));
-        spo_B02_E40 = new StatementImpl(vf.createURI("foo:event4"), pred1_atTime, vf.createLiteral(tvB02_E40.toString()));
-        spo_B03_E20 = new StatementImpl(vf.createURI("foo:event5"), pred1_atTime, vf.createLiteral(tvB03_E20.toString()));
-        spo_B29_E30 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB29_E30.toString()));
-        spo_B30_E32 = new StatementImpl(vf.createURI("foo:event1"), pred1_atTime, vf.createLiteral(tvB30_E32.toString()));
-        spo_B02 = new StatementImpl(vf.createURI("foo:event6"), pred1_atTime, vf.createLiteral(tsB02.getAsReadable()));
+        spo_B00_E01 = vf.createStatement(vf.createIRI("foo:event0"), pred1_atTime, vf.createLiteral(tvB00_E01.toString()));
+        spo_B02_E29 = vf.createStatement(vf.createIRI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E29.toString()));
+        spo_B02_E30 = vf.createStatement(vf.createIRI("foo:event2"), pred1_atTime, vf.createLiteral(tvB02_E30.toString()));
+        spo_B02_E31 = vf.createStatement(vf.createIRI("foo:event3"), pred1_atTime, vf.createLiteral(tvB02_E31.toString()));
+        spo_B02_E40 = vf.createStatement(vf.createIRI("foo:event4"), pred1_atTime, vf.createLiteral(tvB02_E40.toString()));
+        spo_B03_E20 = vf.createStatement(vf.createIRI("foo:event5"), pred1_atTime, vf.createLiteral(tvB03_E20.toString()));
+        spo_B29_E30 = vf.createStatement(vf.createIRI("foo:event1"), pred1_atTime, vf.createLiteral(tvB29_E30.toString()));
+        spo_B30_E32 = vf.createStatement(vf.createIRI("foo:event1"), pred1_atTime, vf.createLiteral(tvB30_E32.toString()));
+        spo_B02 = vf.createStatement(vf.createIRI("foo:event6"), pred1_atTime, vf.createLiteral(tsB02.getAsReadable()));
 
         // Create statements about time instants 0 - 40 seconds
         for (int i = 0; i < seriesTs.length; i++) {
-            seriesSpo[i] = new StatementImpl(vf.createURI("foo:event0" + i), pred1_atTime, vf.createLiteral(seriesTs[i].getAsReadable()));
+            seriesSpo[i] = vf.createStatement(vf.createIRI("foo:event0" + i), pred1_atTime, vf.createLiteral(seriesTs[i].getAsReadable()));
         }
     }
 
@@ -169,7 +167,7 @@
     }
 
     /**
-     * Test method for {@link MongoTemporalIndexer#storeStatement(convertStatement(org.openrdf.model.Statement)}
+     * Test method for {@link MongoTemporalIndexer#storeStatement(convertStatement(org.eclipse.rdf4j.model.Statement)}
      */
     @Test
     public void testStoreStatement() throws IOException {
@@ -177,17 +175,17 @@
             tIndexer.setConf(conf);
             tIndexer.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
-            final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-            final URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
+            final IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
+            final IRI pred2_circa = vf.createIRI(URI_PROPERTY_CIRCA);
 
             // Should not be stored because they are not in the predicate list
             final String validDateStringWithThirteens = "1313-12-13T13:13:13Z";
-            tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens))));
+            tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), RDFS.LABEL, vf.createLiteral(validDateStringWithThirteens))));
 
             final String invalidDateString = "ThisIsAnInvalidDate";
-            tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString))));
+            tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), pred1_atTime, vf.createLiteral(invalidDateString))));
 
             // These are different datetimes instant but from different time zones.
             // This is an arbitrary zone, BRST=Brazil, better if not local.
@@ -198,13 +196,13 @@
 
             // These should be stored because they are in the predicate list.
             // BUT they will get converted to the same exact datetime in UTC.
-            final Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
-            final Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
+            final Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
+            final Statement s4 = vf.createStatement(vf.createIRI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
             tIndexer.storeStatement(convertStatement(s3));
             tIndexer.storeStatement(convertStatement(s4));
 
             // This should not be stored because the object is not a literal
-            tIndexer.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1_atTime, vf.createURI("in:valid"))));
+            tIndexer.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj5"), pred1_atTime, vf.createIRI("in:valid"))));
 
             printTables(tIndexer, "junit testing: Temporal entities stored in testStoreStatement");
             assertEquals(2, tIndexer.getCollection().find().count());
@@ -217,18 +215,18 @@
             tIndexer.setConf(conf);
             tIndexer.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
-            final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
-            final URI pred2_circa = vf.createURI(URI_PROPERTY_CIRCA);
+            final IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
+            final IRI pred2_circa = vf.createIRI(URI_PROPERTY_CIRCA);
 
             final String testDate2014InBRST = "2014-12-31T23:59:59-02:00";
             final String testDate2016InET = "2016-12-31T20:59:59-05:00";
 
             // These should be stored because they are in the predicate list.
             // BUT they will get converted to the same exact datetime in UTC.
-            final Statement s1 = new StatementImpl(vf.createURI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
-            final Statement s2 = new StatementImpl(vf.createURI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
+            final Statement s1 = vf.createStatement(vf.createIRI("foo:subj3"), pred1_atTime, vf.createLiteral(testDate2014InBRST));
+            final Statement s2 = vf.createStatement(vf.createIRI("foo:subj4"), pred2_circa, vf.createLiteral(testDate2016InET));
             tIndexer.storeStatement(convertStatement(s1));
             tIndexer.storeStatement(convertStatement(s2));
 
@@ -649,15 +647,15 @@
             for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
                 tIndexer.storeStatement(convertStatement(seriesSpo[s]));
             }
-            final ValueFactory vf = new ValueFactoryImpl();
-            final URI pred3_CIRCA_ = vf.createURI(URI_PROPERTY_CIRCA);  // this one to ignore.
-            final URI pred2_eventTime = vf.createURI(URI_PROPERTY_EVENT_TIME);
-            final URI pred1_atTime = vf.createURI(URI_PROPERTY_AT_TIME);
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final IRI pred3_CIRCA_ = vf.createIRI(URI_PROPERTY_CIRCA);  // this one to ignore.
+            final IRI pred2_eventTime = vf.createIRI(URI_PROPERTY_EVENT_TIME);
+            final IRI pred1_atTime = vf.createIRI(URI_PROPERTY_AT_TIME);
 
             // add the predicate = EventTime ; Store in an array for verification.
             final Statement[] SeriesTs_EventTime = new Statement[expectedResultCount+1];
             for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
-                final Statement statement = new StatementImpl(vf.createURI("foo:EventTimeSubj0" + s), pred2_eventTime, vf.createLiteral(seriesTs[s].getAsReadable()));
+                final Statement statement = vf.createStatement(vf.createIRI("foo:EventTimeSubj0" + s), pred2_eventTime, vf.createLiteral(seriesTs[s].getAsReadable()));
                 tIndexer.storeStatement(convertStatement(statement));
                 if (s>searchForSeconds) {
                     SeriesTs_EventTime[s - searchForSeconds -1 ] = statement;
@@ -665,7 +663,7 @@
             }
             // add the predicate = CIRCA ; to be ignored because it is not in the constraints.
             for (int s = 0; s <= searchForSeconds + expectedResultCount; s++) { // <== logic here
-                final Statement statement = new StatementImpl(vf.createURI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable()));
+                final Statement statement = vf.createStatement(vf.createIRI("foo:CircaEventSubj0" + s), pred3_CIRCA_, vf.createLiteral(seriesTs[s].getAsReadable()));
                 tIndexer.storeStatement(convertStatement(statement));
             }
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/FlattenedOptionalTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/FlattenedOptionalTest.java
index 8f2cb8c..4136ab7 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/FlattenedOptionalTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/FlattenedOptionalTest.java
@@ -17,20 +17,21 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.rya.indexing.external.matching.FlattenedOptional;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class FlattenedOptionalTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentPCJMatcherTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentPCJMatcherTest.java
index 8e61840..3258c02 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentPCJMatcherTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentPCJMatcherTest.java
@@ -18,7 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -27,19 +27,19 @@
 import org.apache.rya.indexing.external.matching.QuerySegmentFactory;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class JoinSegmentPCJMatcherTest {
 
@@ -139,7 +139,7 @@
 
 
 
-	static class QueryNodeGatherer extends QueryModelVisitorBase<RuntimeException> {
+	static class QueryNodeGatherer extends AbstractQueryModelVisitor<RuntimeException> {
 
 		private static Set<QueryModelNode> nodes;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentTest.java
index 71b24fc..e38a157 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/JoinSegmentTest.java
@@ -18,7 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -28,16 +28,16 @@
 import org.apache.rya.indexing.external.matching.TopOfQueryFilterRelocator;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class JoinSegmentTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentPCJMatcherTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentPCJMatcherTest.java
index 5064572..577baed 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentPCJMatcherTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentPCJMatcherTest.java
@@ -18,7 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -28,20 +28,20 @@
 import org.apache.rya.indexing.external.matching.QuerySegmentFactory;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class OptionalJoinSegmentPCJMatcherTest {
 
@@ -251,7 +251,7 @@
 
 
 
-	static class LeftJoinQueryNodeGatherer extends QueryModelVisitorBase<RuntimeException> {
+	static class LeftJoinQueryNodeGatherer extends AbstractQueryModelVisitor<RuntimeException> {
 
 		private static Set<QueryModelNode> nodes;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentTest.java
index 2a9d12a..dc3a8ef 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/OptionalJoinSegmentTest.java
@@ -18,7 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
- 
+
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -28,17 +28,17 @@
 import org.apache.rya.indexing.external.matching.TopOfQueryFilterRelocator;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class OptionalJoinSegmentTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJNodeConsolidatorTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJNodeConsolidatorTest.java
index 607e072..e91c7a2 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJNodeConsolidatorTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJNodeConsolidatorTest.java
@@ -17,25 +17,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.List;
 
-import org.apache.rya.indexing.external.matching.OptionalJoinSegment;
 import org.apache.rya.indexing.external.matching.QueryNodeConsolidator;
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.external.matching.QuerySegmentFactory;
 import org.apache.rya.indexing.external.matching.TopOfQueryFilterRelocator;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class PCJNodeConsolidatorTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerTest.java
index d28d826..0d80797 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerTest.java
@@ -18,6 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -33,17 +34,17 @@
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
 import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -548,7 +549,7 @@
     }
 
 
-    public static class NodeCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class NodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         List<QueryModelNode> qNodes = new ArrayList<>();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilitesTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilitesTest.java
index f56500a..48ed202 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilitesTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/pcj/matching/PCJOptimizerUtilitesTest.java
@@ -17,15 +17,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
 
+import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class PCJOptimizerUtilitesTest {
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetectorIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetectorIT.java
index 85d27e3..fa55df4 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetectorIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/smarturi/duplication/DuplicateDataDetectorIT.java
@@ -63,11 +63,10 @@
 import org.apache.rya.indexing.smarturi.SmartUriException;
 import org.apache.rya.indexing.smarturi.duplication.conf.DuplicateDataConfig;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.joda.time.DateTime;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
@@ -80,7 +79,7 @@
     private static final String RYA_INSTANCE_NAME = "testInstance";
 
     private static final String NAMESPACE = RyaSchema.NAMESPACE;
-    private static final ValueFactory VALUE_FACTORY = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     // People
     private static final RyaURI BOB = createRyaUri("Bob");
@@ -131,7 +130,7 @@
      * @return the {@link RyraURI}.
      */
     private static RyaURI createRyaUri(final String namespace, final String localName) {
-        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createURI(namespace, localName));
+        return RdfToRyaConversions.convertURI(VF.createIRI(namespace, localName));
     }
 
     private static Entity createBobEntity() {
@@ -151,7 +150,7 @@
             .setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime(NOW.getTime()).minusYears(40))))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(NOW)))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(true)))
-            .setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bob.smitch00@gmail.com"))))
+            .setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bob.smitch00@gmail.com"))))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_ATTRIBUTE_SPACE, stringRyaType("attribute space")))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_MOTTO, stringRyaType("!@#*\\&%20^ smörgåsbord")))
             .setProperty(PERSON_TYPE_URI, new Property(HAS_BLOOD_TYPE, stringRyaType("A+ blood type")))
@@ -291,7 +290,7 @@
     @Test
     public void testBooleanProperty() throws SmartUriException {
         System.out.println("Boolean Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(false, tolerance, false));
@@ -326,7 +325,7 @@
     @Test
     public void testByteProperty() throws SmartUriException {
         System.out.println("Byte Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Byte.MIN_VALUE, tolerance, false));
@@ -410,7 +409,7 @@
     public void testDateProperty() throws SmartUriException {
         System.out.println("Date Property Test");
         final long ONE_YEAR_IN_MILLIS = 1000L * 60L * 60L * 24L * 365L;
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(new Date(0L), tolerance, false));
@@ -591,7 +590,7 @@
         System.out.println("DateTime Property Test");
         final DateTime dob = new DateTime(NOW).minusYears(40);
         final long ONE_YEAR_IN_MILLIS = 1000L * 60L * 60L * 24L * 365L;
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(new DateTime(0L), tolerance, false));
@@ -770,7 +769,7 @@
     @Test
     public void testDoubleProperty() throws SmartUriException {
         System.out.println("Double Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Double.MIN_VALUE, tolerance, false));
@@ -950,7 +949,7 @@
     @Test
     public void testFloatProperty() throws SmartUriException {
         System.out.println("Float Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Float.MIN_VALUE, tolerance, false));
@@ -1117,7 +1116,7 @@
     @Test
     public void testIntegerProperty() throws SmartUriException {
         System.out.println("Integer Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Integer.MIN_VALUE, tolerance, false));
@@ -1254,7 +1253,7 @@
     @Test
     public void testLongProperty() throws SmartUriException {
         System.out.println("Long Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Long.MIN_VALUE, tolerance, false));
@@ -1373,7 +1372,7 @@
     @Test
     public void testShortProperty() throws SmartUriException {
         System.out.println("Short Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput(Short.MIN_VALUE, tolerance, false));
@@ -1482,7 +1481,7 @@
     @Test
     public void testStringProperty() throws SmartUriException {
         System.out.println("String Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
         builder.add(new TestInput("123 Wrong St. Washington, DC 20024", tolerance, false));
@@ -1553,74 +1552,74 @@
     @Test
     public void testUriProperty() throws SmartUriException {
         System.out.println("URI Property Test");
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 0.0
         Tolerance tolerance = new Tolerance(0.0, ToleranceType.DIFFERENCE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
         // Tolerance 1.0
         tolerance = new Tolerance(1.0, ToleranceType.DIFFERENCE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
         // Tolerance 2.0
         tolerance = new Tolerance(2.0, ToleranceType.DIFFERENCE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
 
         // Tolerance 0.0%
         tolerance = new Tolerance(0.00, ToleranceType.PERCENTAGE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
         // Tolerance 5.0%
         tolerance = new Tolerance(0.05, ToleranceType.PERCENTAGE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, false));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, false));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
         // Tolerance 100.0%
         tolerance = new Tolerance(1.00, ToleranceType.PERCENTAGE);
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch01@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bobsmitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@yahoo.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@hotmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:susan.smitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:ron.smitch00@gmail.com"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.org"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:susan.dillon@yahoo.org"), tolerance, true));
-        builder.add(new TestInput(new URIImpl("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch01@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bobsmitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@yahoo.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@hotmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.smitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:ron.smitch00@gmail.com"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.org"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:susan.dillon@yahoo.org"), tolerance, true));
+        builder.add(new TestInput(VF.createIRI("mailto:bob.smitch00@gmail.com"), tolerance, true)); // Equals value
 
         final ImmutableList<TestInput> testInputs = builder.build();
 
@@ -1691,7 +1690,7 @@
                 "blue"
             )
         );
-        final ImmutableList.Builder<TestInput> builder = ImmutableList.<TestInput>builder();
+        final ImmutableList.Builder<TestInput> builder = ImmutableList.builder();
         // Tolerance 1.0 - tolerance doesn't apply to equivalents but is still needed for the test
         final Tolerance tolerance = new Tolerance(1.0, ToleranceType.DIFFERENCE);
         // Color equivalents
@@ -1813,7 +1812,7 @@
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime(NOW.getTime() - 1).minusYears(40))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(new Date(NOW.getTime() - 1))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(true)));
-        duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bob.smitch01@gmail.com"))));
+        duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bob.smitch01@gmail.com"))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_ADDRESS, stringRyaType("124 Fake St. Washington, DC 20024")));
         duplicateBobBuilder.setProperty(EMPLOYEE_TYPE_URI, new Property(HAS_EXTENSION, shortRyaType((short) 556)));
         final Entity duplicateBobEntity = duplicateBobBuilder.build();
@@ -1841,7 +1840,7 @@
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime(NOW.getTime() - 10000000L).minusYears(40))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(new Date(NOW.getTime() - 10000000L))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(false)));
-        notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bad.email.address@gmail.com"))));
+        notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bad.email.address@gmail.com"))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_ADDRESS, stringRyaType("123456789 Fake St. Washington, DC 20024")));
         notDuplicateBobBuilder.setProperty(EMPLOYEE_TYPE_URI, new Property(HAS_EXTENSION, shortRyaType((short) 1000)));
         final Entity notDuplicateBobEntity = notDuplicateBobBuilder.build();
@@ -1904,7 +1903,7 @@
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime(NOW.getTime() - 1).minusYears(40))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(new Date(NOW.getTime() - 1))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(true)));
-        duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bob.smitch01@gmail.com"))));
+        duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bob.smitch01@gmail.com"))));
         duplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_ADDRESS, stringRyaType("124 Fake St. Washington, DC 20024")));
         duplicateBobBuilder.setProperty(EMPLOYEE_TYPE_URI, new Property(HAS_EXTENSION, shortRyaType((short) 556)));
         final Entity duplicateBobEntity = duplicateBobBuilder.build();
@@ -1930,7 +1929,7 @@
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_DATE_OF_BIRTH, dateRyaType(new DateTime(NOW.getTime() - 10000000L).minusYears(40))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EXPIRATION_DATE, dateRyaType(new Date(NOW.getTime() - 10000000L))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_GLASSES, booleanRyaType(false)));
-        notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(new URIImpl("mailto:bad.email.address@gmail.com"))));
+        notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_EMAIL_ADDRESS, uriRyaType(VF.createIRI("mailto:bad.email.address@gmail.com"))));
         notDuplicateBobBuilder.setProperty(PERSON_TYPE_URI, new Property(HAS_ADDRESS, stringRyaType("123456789 Fake St. Washington, DC 20024")));
         notDuplicateBobBuilder.setProperty(EMPLOYEE_TYPE_URI, new Property(HAS_EXTENSION, shortRyaType((short) 1000)));
         final Entity notDuplicateBobEntity = notDuplicateBobBuilder.build();
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataNodeTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataNodeTest.java
index a2cc08d..a353de8 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataNodeTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataNodeTest.java
@@ -18,18 +18,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.accumulo.query.AccumuloRyaQueryEngine;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
@@ -37,25 +33,25 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-
-import info.aduna.iteration.CloseableIteration;
 
 public class AccumuloStatementMetadataNodeTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private AccumuloRyaDAO dao;
     private AccumuloRdfConfiguration conf;
@@ -99,8 +95,8 @@
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bs.addBinding("y", new LiteralImpl("Joe"));
+        bs.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bs.addBinding("y", VF.createLiteral("Joe"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -166,15 +162,15 @@
         StatementMetadataNode<AccumuloRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
         QueryBindingSet bsConstraint = new QueryBindingSet();
-        bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint.addBinding("z", new LiteralImpl("Virginia"));
+        bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint.addBinding("z", VF.createLiteral("Virginia"));
 
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
         QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected.addBinding("y", new LiteralImpl("Joe"));
-        expected.addBinding("z", new LiteralImpl("Virginia"));
+        expected.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected.addBinding("y", VF.createLiteral("Joe"));
+        expected.addBinding("z", VF.createLiteral("Virginia"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -223,21 +219,21 @@
 
         List<BindingSet> bsCollection = new ArrayList<>();
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop"));
-        bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+        bsConstraint1.addBinding("y", VF.createLiteral("CoffeeShop"));
+        bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore"));
-        bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+        bsConstraint2.addBinding("y", VF.createLiteral("HardwareStore"));
+        bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
         bsCollection.add(bsConstraint1);
         bsCollection.add(bsConstraint2);
 
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
         QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("y", new LiteralImpl("CoffeeShop"));
-        expected.addBinding("x", new URIImpl("http://Joe"));
-        expected.addBinding("z", new LiteralImpl("Virginia"));
+        expected.addBinding("y", VF.createLiteral("CoffeeShop"));
+        expected.addBinding("x", VF.createIRI("http://Joe"));
+        expected.addBinding("z", VF.createLiteral("Virginia"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -281,8 +277,8 @@
         StatementMetadataNode<AccumuloRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
         QueryBindingSet bsConstraint = new QueryBindingSet();
-        bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint.addBinding("y", new LiteralImpl("Doug"));
+        bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint.addBinding("y", VF.createLiteral("Doug"));
 
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
@@ -328,16 +324,16 @@
 
         List<BindingSet> bsCollection = new ArrayList<>();
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+        bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
-        bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+        bsConstraint2.addBinding("x", VF.createLiteral("HardwareStore"));
+        bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
 
         QueryBindingSet bsConstraint3 = new QueryBindingSet();
-        bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-        bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
+        bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
+        bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
         bsCollection.add(bsConstraint1);
         bsCollection.add(bsConstraint2);
         bsCollection.add(bsConstraint3);
@@ -345,14 +341,14 @@
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected1.addBinding("y", new LiteralImpl("Joe"));
-        expected1.addBinding("z", new LiteralImpl("Virginia"));
+        expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected1.addBinding("y", VF.createLiteral("Joe"));
+        expected1.addBinding("z", VF.createLiteral("Virginia"));
 
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-        expected2.addBinding("y", new LiteralImpl("Joe"));
-        expected2.addBinding("z", new LiteralImpl("Maryland"));
+        expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+        expected2.addBinding("y", VF.createLiteral("Joe"));
+        expected2.addBinding("z", VF.createLiteral("Maryland"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -406,16 +402,16 @@
 
         List<BindingSet> bsCollection = new ArrayList<>();
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+        bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
-        bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+        bsConstraint2.addBinding("x", VF.createLiteral("HardwareStore"));
+        bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
 
         QueryBindingSet bsConstraint3 = new QueryBindingSet();
-        bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-        bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
+        bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
+        bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
         bsCollection.add(bsConstraint1);
         bsCollection.add(bsConstraint2);
         bsCollection.add(bsConstraint3);
@@ -423,9 +419,9 @@
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected1.addBinding("y", new LiteralImpl("Joe"));
-        expected1.addBinding("z", new LiteralImpl("Virginia"));
+        expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected1.addBinding("y", VF.createLiteral("Joe"));
+        expected1.addBinding("z", VF.createLiteral("Virginia"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -478,16 +474,16 @@
 
         List<BindingSet> bsCollection = new ArrayList<>();
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+        bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
-        bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+        bsConstraint2.addBinding("x", VF.createLiteral("HardwareStore"));
+        bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
 
         QueryBindingSet bsConstraint3 = new QueryBindingSet();
-        bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-        bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
+        bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
+        bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
         bsCollection.add(bsConstraint1);
         bsCollection.add(bsConstraint2);
         bsCollection.add(bsConstraint3);
@@ -495,16 +491,16 @@
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected1.addBinding("y", new LiteralImpl("Joe"));
-        expected1.addBinding("z", new LiteralImpl("Virginia"));
-        expected1.addBinding("c", new URIImpl("http://context_1"));
+        expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected1.addBinding("y", VF.createLiteral("Joe"));
+        expected1.addBinding("z", VF.createLiteral("Virginia"));
+        expected1.addBinding("c", VF.createIRI("http://context_1"));
 
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-        expected2.addBinding("y", new LiteralImpl("Joe"));
-        expected2.addBinding("z", new LiteralImpl("Maryland"));
-        expected2.addBinding("c", new URIImpl("http://context_2"));
+        expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+        expected2.addBinding("y", VF.createLiteral("Joe"));
+        expected2.addBinding("z", VF.createLiteral("Maryland"));
+        expected2.addBinding("c", VF.createIRI("http://context_2"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
@@ -560,24 +556,24 @@
 
         List<BindingSet> bsCollection = new ArrayList<>();
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
-        bsConstraint1.addBinding("c", new URIImpl("http://context_1"));
+        bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
+        bsConstraint1.addBinding("c", VF.createIRI("http://context_1"));
 
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
-        bsConstraint2.addBinding("c", new URIImpl("http://context_2"));
+        bsConstraint2.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
+        bsConstraint2.addBinding("c", VF.createIRI("http://context_2"));
 
         QueryBindingSet bsConstraint4 = new QueryBindingSet();
-        bsConstraint4.addBinding("x", new LiteralImpl("HardwareStore"));
-        bsConstraint4.addBinding("z", new LiteralImpl("WestVirginia"));
-        bsConstraint4.addBinding("c", new URIImpl("http://context_2"));
+        bsConstraint4.addBinding("x", VF.createLiteral("HardwareStore"));
+        bsConstraint4.addBinding("z", VF.createLiteral("WestVirginia"));
+        bsConstraint4.addBinding("c", VF.createIRI("http://context_2"));
 
         QueryBindingSet bsConstraint3 = new QueryBindingSet();
-        bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-        bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
-        bsConstraint3.addBinding("c", new URIImpl("http://context_1"));
+        bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
+        bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
+        bsConstraint3.addBinding("c", VF.createIRI("http://context_1"));
         bsCollection.add(bsConstraint1);
         bsCollection.add(bsConstraint2);
         bsCollection.add(bsConstraint3);
@@ -596,16 +592,16 @@
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected1.addBinding("y", new LiteralImpl("Joe"));
-        expected1.addBinding("z", new LiteralImpl("Virginia"));
-        expected1.addBinding("c", new URIImpl("http://context_1"));
+        expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected1.addBinding("y", VF.createLiteral("Joe"));
+        expected1.addBinding("z", VF.createLiteral("Virginia"));
+        expected1.addBinding("c", VF.createIRI("http://context_1"));
 
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-        expected2.addBinding("y", new LiteralImpl("Joe"));
-        expected2.addBinding("z", new LiteralImpl("WestVirginia"));
-        expected2.addBinding("c", new URIImpl("http://context_2"));
+        expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+        expected2.addBinding("y", VF.createLiteral("Joe"));
+        expected2.addBinding("z", VF.createLiteral("WestVirginia"));
+        expected2.addBinding("c", VF.createIRI("http://context_2"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (iteration.hasNext()) {
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataOptimizerIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataOptimizerIT.java
index 48a0f28..d887bc6 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataOptimizerIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/AccumuloStatementMetadataOptimizerIT.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -34,24 +35,25 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 public class AccumuloStatementMetadataOptimizerIT {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private RdfCloudTripleStoreConfiguration conf;
     private Sail sail;
@@ -100,8 +102,8 @@
         TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query1).evaluate();
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("x", new LiteralImpl("CoffeeShop"));
-        bs.addBinding("y", new LiteralImpl("Joe"));
+        bs.addBinding("x", VF.createLiteral("CoffeeShop"));
+        bs.addBinding("y", VF.createLiteral("Joe"));
 
         List<BindingSet> bsList = new ArrayList<>();
         while (result.hasNext()) {
@@ -162,11 +164,11 @@
 
         Set<BindingSet> expected = new HashSet<>();
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-        expected1.addBinding("y", new LiteralImpl("Joe"));
+        expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+        expected1.addBinding("y", VF.createLiteral("Joe"));
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-        expected2.addBinding("y", new LiteralImpl("Joe"));
+        expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+        expected2.addBinding("y", VF.createLiteral("Joe"));
         expected.add(expected1);
         expected.add(expected2);
 
@@ -221,9 +223,9 @@
 
         Set<BindingSet> expected = new HashSet<>();
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("b", new URIImpl("http://Betty"));
-        expected1.addBinding("a", new URIImpl("http://Joe"));
-        expected1.addBinding("c", new URIImpl("http://Doug"));
+        expected1.addBinding("b", VF.createIRI("http://Betty"));
+        expected1.addBinding("a", VF.createIRI("http://Joe"));
+        expected1.addBinding("c", VF.createIRI("http://Doug"));
         expected.add(expected1);
 
         Set<BindingSet> bsSet = new HashSet<>();
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
index 647e3cc..0797033 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataIT.java
@@ -35,21 +35,22 @@
 import org.apache.rya.mongodb.MongoDBRyaDAO;
 import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 public class MongoStatementMetadataIT extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private final String query1 = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source <http://Joe>; "
             + "ano:Property <http://worksAt>; ano:Target ?x; <http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";
@@ -86,8 +87,8 @@
             final TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query1).evaluate();
 
             final QueryBindingSet bs = new QueryBindingSet();
-            bs.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bs.addBinding("y", new LiteralImpl("Joe"));
+            bs.addBinding("x", VF.createLiteral("CoffeeShop"));
+            bs.addBinding("y", VF.createLiteral("Joe"));
 
             final List<BindingSet> bsList = new ArrayList<>();
             while (result.hasNext()) {
@@ -165,11 +166,11 @@
 
             final Set<BindingSet> expected = new HashSet<>();
             final QueryBindingSet expected1 = new QueryBindingSet();
-            expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-            expected1.addBinding("y", new LiteralImpl("Joe"));
+            expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+            expected1.addBinding("y", VF.createLiteral("Joe"));
             final QueryBindingSet expected2 = new QueryBindingSet();
-            expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-            expected2.addBinding("y", new LiteralImpl("Joe"));
+            expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+            expected2.addBinding("y", VF.createLiteral("Joe"));
             expected.add(expected1);
             expected.add(expected2);
 
@@ -233,9 +234,9 @@
 
             final Set<BindingSet> expected = new HashSet<>();
             final QueryBindingSet expected1 = new QueryBindingSet();
-            expected1.addBinding("b", new URIImpl("http://Betty"));
-            expected1.addBinding("a", new URIImpl("http://Joe"));
-            expected1.addBinding("c", new URIImpl("http://Doug"));
+            expected1.addBinding("b", VF.createIRI("http://Betty"));
+            expected1.addBinding("a", VF.createIRI("http://Joe"));
+            expected1.addBinding("c", VF.createIRI("http://Doug"));
             expected.add(expected1);
 
             final Set<BindingSet> bsSet = new HashSet<>();
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
index cab6c35..20fa32d 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/MongoStatementMetadataNodeIT.java
@@ -31,23 +31,24 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-
-import info.aduna.iteration.CloseableIteration;
 
 public class MongoStatementMetadataNodeIT extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private final String query = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source <http://Joe>; "
             + "ano:Property <http://worksAt>; ano:Target ?x; <http://createdBy> ?y; <http://createdOn> \'2017-01-04\'^^xsd:date }";
     private final String query2 = "prefix owl: <http://www.w3.org/2002/07/owl#> prefix ano: <http://www.w3.org/2002/07/owl#annotated> prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> select ?x ?y where {_:blankNode rdf:type owl:Annotation; ano:Source ?x; "
@@ -82,8 +83,8 @@
             CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
 
             QueryBindingSet bs = new QueryBindingSet();
-            bs.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bs.addBinding("y", new LiteralImpl("Joe"));
+            bs.addBinding("x", VF.createLiteral("CoffeeShop"));
+            bs.addBinding("y", VF.createLiteral("Joe"));
 
             List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
@@ -158,15 +159,15 @@
             StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
             QueryBindingSet bsConstraint = new QueryBindingSet();
-            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint.addBinding("z", new LiteralImpl("Virginia"));
+            bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
+            bsConstraint.addBinding("z", VF.createLiteral("Virginia"));
 
             CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
             QueryBindingSet expected = new QueryBindingSet();
-            expected.addBinding("x", new LiteralImpl("CoffeeShop"));
-            expected.addBinding("y", new LiteralImpl("Joe"));
-            expected.addBinding("z", new LiteralImpl("Virginia"));
+            expected.addBinding("x", VF.createLiteral("CoffeeShop"));
+            expected.addBinding("y", VF.createLiteral("Joe"));
+            expected.addBinding("z", VF.createLiteral("Virginia"));
 
             List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
@@ -216,21 +217,21 @@
 
             List<BindingSet> bsCollection = new ArrayList<>();
             QueryBindingSet bsConstraint1 = new QueryBindingSet();
-            bsConstraint1.addBinding("y", new LiteralImpl("CoffeeShop"));
-            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+            bsConstraint1.addBinding("y", VF.createLiteral("CoffeeShop"));
+            bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
             QueryBindingSet bsConstraint2 = new QueryBindingSet();
-            bsConstraint2.addBinding("y", new LiteralImpl("HardwareStore"));
-            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+            bsConstraint2.addBinding("y", VF.createLiteral("HardwareStore"));
+            bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
             bsCollection.add(bsConstraint1);
             bsCollection.add(bsConstraint2);
 
             CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
             QueryBindingSet expected = new QueryBindingSet();
-            expected.addBinding("y", new LiteralImpl("CoffeeShop"));
-            expected.addBinding("x", new URIImpl("http://Joe"));
-            expected.addBinding("z", new LiteralImpl("Virginia"));
+            expected.addBinding("y", VF.createLiteral("CoffeeShop"));
+            expected.addBinding("x", VF.createIRI("http://Joe"));
+            expected.addBinding("z", VF.createLiteral("Virginia"));
 
             List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
@@ -275,8 +276,8 @@
             StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
             QueryBindingSet bsConstraint = new QueryBindingSet();
-            bsConstraint.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint.addBinding("y", new LiteralImpl("Doug"));
+            bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
+            bsConstraint.addBinding("y", VF.createLiteral("Doug"));
 
             CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
@@ -323,16 +324,16 @@
 
             List<BindingSet> bsCollection = new ArrayList<>();
             QueryBindingSet bsConstraint1 = new QueryBindingSet();
-            bsConstraint1.addBinding("x", new LiteralImpl("CoffeeShop"));
-            bsConstraint1.addBinding("z", new LiteralImpl("Virginia"));
+            bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
+            bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
             QueryBindingSet bsConstraint2 = new QueryBindingSet();
-            bsConstraint2.addBinding("x", new LiteralImpl("HardwareStore"));
-            bsConstraint2.addBinding("z", new LiteralImpl("Maryland"));
+            bsConstraint2.addBinding("x", VF.createLiteral("HardwareStore"));
+            bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
 
             QueryBindingSet bsConstraint3 = new QueryBindingSet();
-            bsConstraint3.addBinding("x", new LiteralImpl("BurgerShack"));
-            bsConstraint3.addBinding("z", new LiteralImpl("Delaware"));
+            bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
+            bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
             bsCollection.add(bsConstraint1);
             bsCollection.add(bsConstraint2);
             bsCollection.add(bsConstraint3);
@@ -341,14 +342,14 @@
 
             Set<BindingSet> expected = new HashSet<>();
             QueryBindingSet expected1 = new QueryBindingSet();
-            expected1.addBinding("x", new LiteralImpl("CoffeeShop"));
-            expected1.addBinding("y", new LiteralImpl("Joe"));
-            expected1.addBinding("z", new LiteralImpl("Virginia"));
+            expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
+            expected1.addBinding("y", VF.createLiteral("Joe"));
+            expected1.addBinding("z", VF.createLiteral("Virginia"));
 
             QueryBindingSet expected2 = new QueryBindingSet();
-            expected2.addBinding("x", new LiteralImpl("HardwareStore"));
-            expected2.addBinding("y", new LiteralImpl("Joe"));
-            expected2.addBinding("z", new LiteralImpl("Maryland"));
+            expected2.addBinding("x", VF.createLiteral("HardwareStore"));
+            expected2.addBinding("y", VF.createLiteral("Joe"));
+            expected2.addBinding("z", VF.createLiteral("Maryland"));
             expected.add(expected1);
             expected.add(expected2);
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataExternalSetProviderTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataExternalSetProviderTest.java
index f3d0c1e..c4318fb 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataExternalSetProviderTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataExternalSetProviderTest.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -28,21 +29,22 @@
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.external.matching.JoinSegment;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataExternalSetProvider;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class StatementMetadataExternalSetProviderTest {
 
@@ -129,7 +131,7 @@
         Set<StatementPattern> sp3 = StatementMetadataTestUtils.getMetadataStatementPatterns(pq3.getTupleExpr(), propertySet);
         //added extra blankNode into query3 to make blankNode names line up with query2.  Need to remove it now so that
         //StatementMetadataNode doesn't blow up because all subjects aren't the same.
-        removePatternWithGivenSubject("-anon-1", sp3);
+        removePatternWithGivenSubject(VarNameUtils.prependAnonymous("1"), sp3);
 
         patterns.addAll(StatementPatternCollector.process(pq2.getTupleExpr()));
         JoinSegment<StatementMetadataNode<?>> segment = new JoinSegment<>(
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataOptimizerTest.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataOptimizerTest.java
index 4a65d99..fba9652 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataOptimizerTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataOptimizerTest.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static org.junit.Assert.assertEquals;
 
 import java.util.ArrayList;
@@ -36,20 +37,20 @@
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataOptimizer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 @RunWith(value = Parameterized.class)
 public class StatementMetadataOptimizerTest {
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataTestUtils.java b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataTestUtils.java
index 35c5405..51ea682 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataTestUtils.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/statement/metadata/StatementMetadataTestUtils.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
@@ -24,15 +25,15 @@
 
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.indexing.statement.metadata.matching.OWLReify;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 public class StatementMetadataTestUtils {
 
@@ -46,7 +47,7 @@
         return collector.getNodes();
     }
 
-    public static class MetadataNodeCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class MetadataNodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         Set<QueryModelNode> qNodes = new HashSet<>();
 
@@ -70,7 +71,7 @@
 
     }
 
-    public static class MetadataStatementPatternCollector extends QueryModelVisitorBase<RuntimeException> {
+    public static class MetadataStatementPatternCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<StatementPattern> nodes;
         private Set<RyaURI> properties;
@@ -84,7 +85,7 @@
         public void meet(StatementPattern node) {
             Var predicate = node.getPredicateVar();
             Value val = predicate.getValue();
-            if (val != null && val instanceof URI) {
+            if (val != null && val instanceof IRI) {
                 RyaURI ryaVal = new RyaURI(val.stringValue());
                 if (uriList.contains(ryaVal) || properties.contains(ryaVal)) {
                     nodes.add(node);
diff --git a/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaAccumuloSailFactoryTest.java b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaAccumuloSailFactoryTest.java
index a22825b..050cfe0 100644
--- a/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaAccumuloSailFactoryTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaAccumuloSailFactoryTest.java
@@ -8,9 +8,9 @@
  * to you 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
@@ -24,40 +24,35 @@
 
 import java.io.InputStream;
 import java.io.StringReader;
-import java.util.HashMap;
 import java.util.Map;
 
-import org.apache.rya.sail.config.RyaAccumuloSailConfig;
-import org.apache.rya.sail.config.RyaAccumuloSailFactory;
-
 import org.apache.commons.io.IOUtils;
+import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.LinkedHashModel;
+import org.eclipse.rdf4j.model.util.Models;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.config.ConfigTemplate;
+import org.eclipse.rdf4j.repository.config.RepositoryConfig;
+import org.eclipse.rdf4j.repository.config.RepositoryConfigSchema;
+import org.eclipse.rdf4j.repository.config.RepositoryImplConfig;
+import org.eclipse.rdf4j.repository.config.RepositoryRegistry;
+import org.eclipse.rdf4j.repository.manager.LocalRepositoryManager;
+import org.eclipse.rdf4j.repository.sail.config.SailRepositoryConfig;
+import org.eclipse.rdf4j.repository.sail.config.SailRepositoryFactory;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.Rio;
+import org.eclipse.rdf4j.rio.helpers.StatementCollector;
+import org.eclipse.rdf4j.sail.config.SailFactory;
+import org.eclipse.rdf4j.sail.config.SailRegistry;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.openrdf.model.Graph;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.LinkedHashModel;
-import org.openrdf.model.util.GraphUtil;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.config.ConfigTemplate;
-import org.openrdf.repository.config.RepositoryConfig;
-import org.openrdf.repository.config.RepositoryConfigSchema;
-import org.openrdf.repository.config.RepositoryConfigUtil;
-import org.openrdf.repository.config.RepositoryImplConfig;
-import org.openrdf.repository.config.RepositoryRegistry;
-import org.openrdf.repository.manager.LocalRepositoryManager;
-import org.openrdf.repository.sail.config.SailRepositoryConfig;
-import org.openrdf.repository.sail.config.SailRepositoryFactory;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.Rio;
-import org.openrdf.rio.helpers.StatementCollector;
-import org.openrdf.sail.config.SailFactory;
-import org.openrdf.sail.config.SailRegistry;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Files;
@@ -92,7 +87,7 @@
         RepositoryConnection rc = r.getConnection();
 
         ValueFactory vf = rc.getValueFactory();
-        Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+        Statement s = vf.createStatement(vf.createIRI("u:a"), vf.createIRI("u:b"), vf.createIRI("u:c"));
 
         assertFalse(rc.hasStatement(s, false));
 
@@ -106,12 +101,10 @@
     public void testCreateFromTemplateName() throws Exception {
         LocalRepositoryManager repoman = new LocalRepositoryManager(Files.createTempDir());
         repoman.initialize();
-        
-        
-        
+
         try(InputStream templateStream = RepositoryConfig.class.getResourceAsStream("RyaAccumuloSail.ttl")) {
             String template = IOUtils.toString(templateStream);
-            
+
             final ConfigTemplate configTemplate = new ConfigTemplate(template);
             final Map<String, String> valueMap = ImmutableMap.<String, String> builder()
                     .put("Repository ID", "RyaAccumuloSail")
@@ -122,49 +115,46 @@
                     .put("Rya Accumulo zookeepers", "zoo1,zoo2,zoo3")
                     .put("Rya Accumulo is mock", "true")
                     .build();
-            
+
             final String configString = configTemplate.render(valueMap);
-            
+
 //            final Repository systemRepo = this.state.getManager().getSystemRepository();
-            final Graph graph = new LinkedHashModel();
+            final Model model = new LinkedHashModel();
             final RDFParser rdfParser = Rio.createParser(RDFFormat.TURTLE);
-            rdfParser.setRDFHandler(new StatementCollector(graph));
+            rdfParser.setRDFHandler(new StatementCollector(model));
             rdfParser.parse(new StringReader(configString), RepositoryConfigSchema.NAMESPACE);
-            final Resource repositoryNode = GraphUtil.getUniqueSubject(graph, RDF.TYPE,
-                    RepositoryConfigSchema.REPOSITORY);
-            final RepositoryConfig repConfig = RepositoryConfig.create(graph, repositoryNode);
+            final Resource repositoryNode = Models.subject(model.filter(null, RDF.TYPE, RepositoryConfigSchema.REPOSITORY)).get();
+            final RepositoryConfig repConfig = RepositoryConfig.create(model, repositoryNode);
             repConfig.validate();
 
-            
+
             repoman.addRepositoryConfig(repConfig);
-            
+
             Repository r = repoman.getRepository("RyaAccumuloSail");
             r.initialize();
-            
+
         }
 
     }
-    
+
     @Test
     public void testRyaAccumuloSailInManager() throws Exception {
 //        Class<SailFactory> clazz = SailFactory.class;
 //        ServiceLoader<SailFactory> loader = java.util.ServiceLoader.load(clazz, clazz.getClassLoader());
 //
 //        Iterator<SailFactory> services = loader.iterator();
-//        
+//
 //        while (services.hasNext())
 //        System.out.println(services.next());
 
-        
-        
         String ryaSailKey = RyaAccumuloSailFactory.SAIL_TYPE;
 
-        assertTrue("Connot find RyaAccumuloSailFactory in Registry", SailRegistry.getInstance().has(ryaSailKey));
+        assertTrue("Cannot find RyaAccumuloSailFactory in Registry", SailRegistry.getInstance().has(ryaSailKey));
 
-        SailFactory factory = SailRegistry.getInstance().get(ryaSailKey);
+        SailFactory factory = SailRegistry.getInstance().get(ryaSailKey).get();
         Assert.assertNotNull("Cannot create RyaAccumuloSailFactory", factory);
-        
-        
+
+
 //        for (String s : SailRegistry.getInstance().getKeys()) {
 //            System.out.println("SailRegistry :: " + s);
 //        }
@@ -186,10 +176,10 @@
 //        RepositoryConfigSchema
         // RepositoryProvider.getRepository("RyaAccumuloSail");
     }
-    
+
     @Test
     public void testParseTemplate() throws Exception{
-        String template = IOUtils.toString(ClassLoader.getSystemResourceAsStream("org/openrdf/repository/config/RyaAccumuloSail.ttl"));
+        String template = IOUtils.toString(ClassLoader.getSystemResourceAsStream("org/eclipse/rdf4j/repository/config/RyaAccumuloSail.ttl"));
         ConfigTemplate ct = new ConfigTemplate(template);
         System.out.println(ct.getVariableMap());
     }
diff --git a/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java
index 6cfd4ea..7e0ff34 100644
--- a/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java
+++ b/extras/indexing/src/test/java/org/apache/rya/sail/config/RyaMongoDbSailFactoryTest.java
@@ -21,13 +21,13 @@
 import static org.junit.Assert.assertFalse;
 
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 /**
  * Tests {@link RyaSailFactory} with a MongoDB backend.
@@ -66,7 +66,7 @@
             conn = repo.getConnection();
 
             final ValueFactory vf = conn.getValueFactory();
-            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+            final Statement s = vf.createStatement(vf.createIRI("u:a"), vf.createIRI("u:b"), vf.createIRI("u:c"));
 
             assertFalse(conn.hasStatement(s, false));
 
@@ -97,7 +97,7 @@
             conn = repo.getConnection();
 
             final ValueFactory vf = conn.getValueFactory();
-            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+            final Statement s = vf.createStatement(vf.createIRI("u:a"), vf.createIRI("u:b"), vf.createIRI("u:c"));
 
             assertFalse(conn.hasStatement(s, false));
 
@@ -127,7 +127,7 @@
             conn = repo.getConnection();
 
             final ValueFactory vf = conn.getValueFactory();
-            final Statement s = vf.createStatement(vf.createURI("u:a"), vf.createURI("u:b"), vf.createURI("u:c"));
+            final Statement s = vf.createStatement(vf.createIRI("u:a"), vf.createIRI("u:b"), vf.createIRI("u:c"));
 
             assertFalse(conn.hasStatement(s, false));
 
diff --git a/extras/indexing/src/test/resources/log4j.properties b/extras/indexing/src/test/resources/log4j.properties
new file mode 100644
index 0000000..8d3f81d
--- /dev/null
+++ b/extras/indexing/src/test/resources/log4j.properties
@@ -0,0 +1,25 @@
+ # Licensed to the Apache Software Foundation (ASF) under one
+ # or more contributor license agreements.  See the NOTICE file
+ # distributed with this work for additional information
+ # regarding copyright ownership.  The ASF licenses this file
+ # to you 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.
+
+# Root logger option
+log4j.rootLogger=INFO, stdout
+
+# Direct log messages to stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
\ No newline at end of file
diff --git a/extras/indexingExample/pom.xml b/extras/indexingExample/pom.xml
index c339152..5740f08 100644
--- a/extras/indexingExample/pom.xml
+++ b/extras/indexingExample/pom.xml
@@ -74,9 +74,9 @@
         </dependency>
         
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryrender</artifactId>
-            <version>${openrdf.sesame.version}</version>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryrender</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
         </dependency>
 
         <dependency>
diff --git a/extras/indexingExample/src/main/java/EntityDirectExample.java b/extras/indexingExample/src/main/java/EntityDirectExample.java
index 5599dcd..2dfae3f 100644
--- a/extras/indexingExample/src/main/java/EntityDirectExample.java
+++ b/extras/indexingExample/src/main/java/EntityDirectExample.java
@@ -17,8 +17,6 @@
  * under the License.
  */
 
-
-
 import java.util.List;
 
 import org.apache.accumulo.core.client.AccumuloException;
@@ -27,25 +25,23 @@
 import org.apache.commons.lang.Validate;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.log4j.Logger;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.indexing.accumulo.AccumuloIndexingConfiguration;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 
 public class EntityDirectExample {
     private static final Logger log = Logger.getLogger(EntityDirectExample.class);
@@ -165,6 +161,7 @@
 
         final String sparqlInsert = "PREFIX pref: <http://www.model/pref#> \n"
                 + "INSERT DATA {\n" //
+                + "GRAPH <http://updated/test> {\n"
                 + "<urn:Bob>       a       pref:Person ;\n" //
                 + "     pref:hasProperty1 'property1' ;\n" //  one second
                 + "     pref:hasProperty2 'property2' ;\n" //   2 seconds
@@ -172,7 +169,7 @@
                 + "<urn:Fred>      a       pref:Person ; \n" //
                 + "     pref:hasProperty4 'property4' ; \n" //
                 + "     pref:hasProperty5 'property5' ; \n" //
-                + "}";
+                + "}}";
 
         final Update update = conn.prepareUpdate(QueryLanguage.SPARQL, sparqlInsert);
         update.execute();
diff --git a/extras/indexingExample/src/main/java/InferenceExamples.java b/extras/indexingExample/src/main/java/InferenceExamples.java
index 83c3bc0..fa8fb21 100644
--- a/extras/indexingExample/src/main/java/InferenceExamples.java
+++ b/extras/indexingExample/src/main/java/InferenceExamples.java
@@ -35,22 +35,22 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.apache.zookeeper.ClientCnxn;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 
 import com.mongodb.MongoClient;
 import com.mongodb.ServerAddress;
diff --git a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
index 1744606..cb38494 100644
--- a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
@@ -39,33 +39,33 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.apache.zookeeper.ClientCnxn;
-import org.openrdf.model.Namespace;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.RepositoryResult;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.common.iteration.Iterations;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.RepositoryResult;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.sail.Sail;
 
 import de.flapdoodle.embed.mongo.config.IMongoConfig;
 import de.flapdoodle.embed.mongo.config.Net;
-import info.aduna.iteration.Iterations;
 
 
 public class MongoRyaDirectExample {
@@ -225,23 +225,24 @@
     private static void testAddAndFreeTextSearchWithPCJ(final SailRepositoryConnection conn) throws Exception {
         // add data to the repository using the SailRepository add methods
         final ValueFactory f = conn.getValueFactory();
-        final URI person = f.createURI("http://example.org/ontology/Person");
+        final IRI person = f.createIRI("http://example.org/ontology/Person");
 
         String uuid;
 
         uuid = "urn:people:alice";
-        conn.add(f.createURI(uuid), RDF.TYPE, person);
-        conn.add(f.createURI(uuid), RDFS.LABEL, f.createLiteral("Alice Palace Hose", f.createURI("xsd:string")));
+        conn.add(f.createIRI(uuid), RDF.TYPE, person);
+        conn.add(f.createIRI(uuid), RDFS.LABEL, f.createLiteral("Alice Palace Hose", f.createIRI("xsd:string")));
 
-        uuid = "urn:people:bobss";
-        conn.add(f.createURI(uuid), RDF.TYPE, person);
-        conn.add(f.createURI(uuid), RDFS.LABEL, f.createLiteral("Bob Snob Hose", "en"));
+        uuid = "urn:people:bob";
+        conn.add(f.createIRI(uuid), RDF.TYPE, person);
+        conn.add(f.createIRI(uuid), RDFS.LABEL, f.createLiteral("Bob Snob Hose", f.createIRI("xsd:string")));
 
         String queryString;
         TupleQuery tupleQuery;
         CountingResultHandler tupleHandler;
 
-        // ///////////// search for alice
+
+        // ///////////// search for Palace
         queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
                 + "SELECT ?person ?match ?e ?c ?l ?o " //
                 + "{" //
@@ -255,7 +256,35 @@
         Validate.isTrue(tupleHandler.getCount() == 1);
 
 
-        // ///////////// search for alice and bob
+        // ///////////// search for Snob
+        queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
+                + "SELECT ?person ?match ?e ?c ?l ?o " //
+                + "{" //
+                + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
+                + "  FILTER(fts:text(?match, \"Snob\")) " //
+                + "}";//
+        tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
+        tupleHandler = new CountingResultHandler();
+        tupleQuery.evaluate(tupleHandler);
+        log.info("Result count : " + tupleHandler.getCount());
+        Validate.isTrue(tupleHandler.getCount() == 1);
+
+
+        // ///////////// search for Hose
+        queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
+                + "SELECT ?person ?match ?e ?c ?l ?o " //
+                + "{" //
+                + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
+                + "  FILTER(fts:text(?match, \"Hose\")) " //
+                + "}";//
+        tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
+        tupleHandler = new CountingResultHandler();
+        tupleQuery.evaluate(tupleHandler);
+        log.info("Result count : " + tupleHandler.getCount());
+        Validate.isTrue(tupleHandler.getCount() == 2);
+
+
+        // ///////////// search for alice
         queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
                 + "SELECT ?person ?match " //
                 + "{" //
@@ -269,14 +298,15 @@
         log.info("Result count : " + tupleHandler.getCount());
         Validate.isTrue(tupleHandler.getCount() == 1);
 
-     // ///////////// search for alice and bob
+
+        // ///////////// search for alice and hose
         queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
                 + "SELECT ?person ?match " //
                 + "{" //
                 + "  ?person a <http://example.org/ontology/Person> . "//
                 + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
                 + "  FILTER(fts:text(?match, \"alice\")) " //
-                + "  FILTER(fts:text(?match, \"palace\")) " //
+                + "  FILTER(fts:text(?match, \"hose\")) " //
                 + "}";//
         tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
         tupleHandler = new CountingResultHandler();
@@ -285,13 +315,13 @@
         Validate.isTrue(tupleHandler.getCount() == 1);
 
 
-        // ///////////// search for bob
+        // ///////////// search for alice or hose
         queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
                 + "SELECT ?person ?match ?e ?c ?l ?o " //
                 + "{" //
                 + "  ?person a <http://example.org/ontology/Person> . "//
                 + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
-                // this is an or query in mongo, a and query in accumulo
+                // this is an or query in mongo, an and query in accumulo
                 + "  FILTER(fts:text(?match, \"alice hose\")) " //
                 + "}";//
 
@@ -300,6 +330,56 @@
         tupleQuery.evaluate(tupleHandler);
         log.info("Result count : " + tupleHandler.getCount());
         Validate.isTrue(tupleHandler.getCount() == 2);
+
+
+        // ///////////// search for alice or bob
+        queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
+                + "SELECT ?person ?match ?e ?c ?l ?o " //
+                + "{" //
+                + "  ?person a <http://example.org/ontology/Person> . "//
+                + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
+                // this is an or query in mongo, an and query in accumulo
+                + "  FILTER(fts:text(?match, \"alice bob\")) " //
+                + "}";//
+
+        tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
+        tupleHandler = new CountingResultHandler();
+        tupleQuery.evaluate(tupleHandler);
+        log.info("Result count : " + tupleHandler.getCount());
+        Validate.isTrue(tupleHandler.getCount() == 2);
+
+
+        // ///////////// search for alice and bob
+        queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
+                + "SELECT ?person ?match ?e ?c ?l ?o " //
+                + "{" //
+                + "  ?person a <http://example.org/ontology/Person> . "//
+                + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
+                + "  FILTER(fts:text(?match, \"alice\")) " //
+                + "  FILTER(fts:text(?match, \"bob\")) " //
+                + "}";//
+
+        tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
+        tupleHandler = new CountingResultHandler();
+        tupleQuery.evaluate(tupleHandler);
+        log.info("Result count : " + tupleHandler.getCount());
+        Validate.isTrue(tupleHandler.getCount() == 0);
+
+
+        // ///////////// search for bob
+        queryString = "PREFIX fts: <http://rdf.useekm.com/fts#>  "//
+                + "SELECT ?person ?match ?e ?c ?l ?o " //
+                + "{" //
+                + "  ?person a <http://example.org/ontology/Person> . "//
+                + "  ?person <http://www.w3.org/2000/01/rdf-schema#label> ?match . "//
+                + "  FILTER(fts:text(?match, \"bob\")) " //
+                + "}";//
+
+        tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, queryString);
+        tupleHandler = new CountingResultHandler();
+        tupleQuery.evaluate(tupleHandler);
+        log.info("Result count : " + tupleHandler.getCount());
+        Validate.isTrue(tupleHandler.getCount() == 1);
     }
 
     private static Configuration getConf() throws IOException {
diff --git a/extras/indexingExample/src/main/java/ProspectorExample.java b/extras/indexingExample/src/main/java/ProspectorExample.java
index 383d982..31b61b9 100644
--- a/extras/indexingExample/src/main/java/ProspectorExample.java
+++ b/extras/indexingExample/src/main/java/ProspectorExample.java
@@ -31,12 +31,12 @@
 import org.apache.rya.prospector.mr.Prospector;
 import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
 
 import com.google.common.collect.Lists;
 
@@ -47,18 +47,18 @@
 public class ProspectorExample {
     private static final Logger log = Logger.getLogger(RyaClientExample.class);
 
-    private static final ValueFactory VALUE_FACTORY = new ValueFactoryImpl();
+    private static final ValueFactory VALUE_FACTORY = SimpleValueFactory.getInstance();
 
-    private static final URI ALICE = VALUE_FACTORY.createURI("urn:alice");
-    private static final URI BOB = VALUE_FACTORY.createURI("urn:bob");
-    private static final URI CHARLIE = VALUE_FACTORY.createURI("urn:charlie");
+    private static final IRI ALICE = VALUE_FACTORY.createIRI("urn:alice");
+    private static final IRI BOB = VALUE_FACTORY.createIRI("urn:bob");
+    private static final IRI CHARLIE = VALUE_FACTORY.createIRI("urn:charlie");
 
-    private static final URI WORKS_AT = VALUE_FACTORY.createURI("urn:worksAt");
-    private static final URI ADMIRES = VALUE_FACTORY.createURI("urn:admires");
-    private static final URI LIVES_WITH = VALUE_FACTORY.createURI("urn:livesWith");
+    private static final IRI WORKS_AT = VALUE_FACTORY.createIRI("urn:worksAt");
+    private static final IRI ADMIRES = VALUE_FACTORY.createIRI("urn:admires");
+    private static final IRI LIVES_WITH = VALUE_FACTORY.createIRI("urn:livesWith");
 
-    private static final URI BURGER_JOINT = VALUE_FACTORY.createURI("urn:burgerJoint");
-    private static final URI DONUT_SHOP= VALUE_FACTORY.createURI("urn:donutShop");
+    private static final IRI BURGER_JOINT = VALUE_FACTORY.createIRI("urn:burgerJoint");
+    private static final IRI DONUT_SHOP= VALUE_FACTORY.createIRI("urn:donutShop");
 
     public static void main(final String[] args) throws Exception {
         setupLogging();
diff --git a/extras/indexingExample/src/main/java/RyaClientExample.java b/extras/indexingExample/src/main/java/RyaClientExample.java
index 6b39774..1da9628 100644
--- a/extras/indexingExample/src/main/java/RyaClientExample.java
+++ b/extras/indexingExample/src/main/java/RyaClientExample.java
@@ -53,21 +53,20 @@
 import org.apache.rya.indexing.pcj.fluo.app.observers.TripleObserver;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.apache.zookeeper.ClientCnxn;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
 
 import com.google.common.collect.Lists;
 import com.google.common.io.Files;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Demonstrates how a {@link RyaClient} may be used to interact with an instance
  * of Accumulo to install and manage a Rya instance.
@@ -145,14 +144,14 @@
 
             final ValueFactory vf = ryaSail.getValueFactory();
             final List<Statement> statements = Lists.newArrayList(
-                    vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://talksTo"), vf.createURI("http://Charlie")),
-                    vf.createStatement(vf.createURI("http://David"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                    vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://worksAt"), vf.createURI("http://CoffeeShop")),
-                    vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://CoffeeShop")),
-                    vf.createStatement(vf.createURI("http://George"), vf.createURI("http://talksTo"), vf.createURI("http://Frank")),
-                    vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://worksAt"), vf.createURI("http://CoffeeShop")),
-                    vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://talksTo"), vf.createURI("http://Bob")),
-                    vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://CoffeeShop")));
+                    vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://talksTo"), vf.createIRI("http://Charlie")),
+                    vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                    vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://worksAt"), vf.createIRI("http://CoffeeShop")),
+                    vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://CoffeeShop")),
+                    vf.createStatement(vf.createIRI("http://George"), vf.createIRI("http://talksTo"), vf.createIRI("http://Frank")),
+                    vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://worksAt"), vf.createIRI("http://CoffeeShop")),
+                    vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://talksTo"), vf.createIRI("http://Bob")),
+                    vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://CoffeeShop")));
 
             SailConnection ryaConn = ryaSail.getConnection();
             log.info("");
diff --git a/extras/indexingExample/src/main/java/RyaDirectExample.java b/extras/indexingExample/src/main/java/RyaDirectExample.java
index eed1a22..c05edd5 100644
--- a/extras/indexingExample/src/main/java/RyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/RyaDirectExample.java
@@ -39,30 +39,28 @@
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
 import org.apache.rya.indexing.pcj.storage.PcjException;
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTables;
-import org.apache.rya.indexing.pcj.storage.accumulo.PcjVarOrderFactory;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 
@@ -90,13 +88,14 @@
 		SailRepositoryConnection conn = null;
 
 		try {
+			log.info("Creating PCJ Tables");
+			createPCJ(conf);
+
 			log.info("Connecting to Indexing Sail Repository.");
 			final Sail extSail = RyaSailFactory.getInstance(conf);
 			repository = new SailRepository(extSail);
 			conn = repository.getConnection();
 
-			createPCJ(conf);
-
 			final long start = System.currentTimeMillis();
 			log.info("Running SPARQL Example: Add and Delete");
 			testAddAndDelete(conn);
@@ -335,19 +334,19 @@
 			final SailRepositoryConnection conn) throws Exception {
 		// add data to the repository using the SailRepository add methods
 		final ValueFactory f = conn.getValueFactory();
-		final URI person = f.createURI("http://example.org/ontology/Person");
+		final IRI person = f.createIRI("http://example.org/ontology/Person");
 
 		String uuid;
 
 		uuid = "urn:people:alice";
-		conn.add(f.createURI(uuid), RDF.TYPE, person);
-		conn.add(f.createURI(uuid), RDFS.LABEL,
-				f.createLiteral("Alice Palace Hose", f.createURI("xsd:string")));
+		conn.add(f.createIRI(uuid), RDF.TYPE, person);
+		conn.add(f.createIRI(uuid), RDFS.LABEL,
+				f.createLiteral("Alice Palace Hose", f.createIRI("xsd:string")));
 
-		uuid = "urn:people:bobss";
-		conn.add(f.createURI(uuid), RDF.TYPE, person);
-		conn.add(f.createURI(uuid), RDFS.LABEL,
-				f.createLiteral("Bob Snob Hose", "en"));
+		uuid = "urn:people:bob";
+		conn.add(f.createIRI(uuid), RDF.TYPE, person);
+		conn.add(f.createIRI(uuid), RDFS.LABEL,
+				f.createLiteral("Bob Snob Hose", f.createIRI("xsd:string")));
 
 		String queryString;
 		TupleQuery tupleQuery;
@@ -645,21 +644,21 @@
 		// Delete data from the repository using the SailRepository remove
 		// methods
 		final ValueFactory f = conn.getValueFactory();
-		final URI person = f.createURI("http://example.org/ontology/Person");
+		final IRI person = f.createIRI("http://example.org/ontology/Person");
 
 		String uuid;
 
 		uuid = "urn:people:alice";
-		conn.remove(f.createURI(uuid), RDF.TYPE, person);
-		conn.remove(f.createURI(uuid), RDFS.LABEL,
-				f.createLiteral("Alice Palace Hose", f.createURI("xsd:string")));
+		conn.remove(f.createIRI(uuid), RDF.TYPE, person);
+		conn.remove(f.createIRI(uuid), RDFS.LABEL,
+				f.createLiteral("Alice Palace Hose", f.createIRI("xsd:string")));
 
-		uuid = "urn:people:bobss";
-		conn.remove(f.createURI(uuid), RDF.TYPE, person);
-		conn.remove(f.createURI(uuid), RDFS.LABEL,
-				f.createLiteral("Bob Snob Hose", "en"));
+		uuid = "urn:people:bob";
+		conn.remove(f.createIRI(uuid), RDF.TYPE, person);
+		conn.remove(f.createIRI(uuid), RDFS.LABEL,
+				f.createLiteral("Bob Snob Hose", f.createIRI("xsd:string")));
 
-		conn.remove(person, RDFS.LABEL, f.createLiteral("label", "en"));
+		conn.remove(person, RDFS.LABEL, f.createLiteral("label", f.createIRI("xsd:string")));
 
 		String queryString;
 		TupleQuery tupleQuery;
@@ -753,18 +752,19 @@
 					+ "  ?e <uri:talksTo> ?o . "//
 					+ "}";//
 
-			URI obj, subclass, talksTo;
-			final URI person = new URIImpl("urn:people:alice");
-			final URI feature = new URIImpl("urn:feature");
-			final URI sub = new URIImpl("uri:entity");
-			subclass = new URIImpl("uri:class");
-			obj = new URIImpl("uri:obj");
-			talksTo = new URIImpl("uri:talksTo");
+			ValueFactory vf = SimpleValueFactory.getInstance();
+			IRI obj, subclass, talksTo;
+			final IRI person = vf.createIRI("urn:people:alice");
+			final IRI feature = vf.createIRI("urn:feature");
+			final IRI sub = vf.createIRI("uri:entity");
+			subclass = vf.createIRI("uri:class");
+			obj = vf.createIRI("uri:obj");
+			talksTo = vf.createIRI("uri:talksTo");
 
 			conn.add(person, RDF.TYPE, sub);
 			conn.add(feature, RDF.TYPE, sub);
 			conn.add(sub, RDF.TYPE, subclass);
-			conn.add(sub, RDFS.LABEL, new LiteralImpl("label"));
+			conn.add(sub, RDFS.LABEL, vf.createLiteral("label"));
 			conn.add(sub, talksTo, obj);
 
 			final String tablename1 = RYA_TABLE_PREFIX + "INDEX_1";
@@ -775,11 +775,11 @@
 
 			new PcjTables().createAndPopulatePcj(conn, accCon, tablename1,
 					queryString1, new String[] { "e", "c", "l", "o" },
-					Optional.<PcjVarOrderFactory> absent());
+					Optional.absent());
 
 			new PcjTables().createAndPopulatePcj(conn, accCon, tablename2,
 					queryString2, new String[] { "e", "c", "l", "o" },
-					Optional.<PcjVarOrderFactory> absent());
+					Optional.absent());
 
 		} catch (final RyaDAOException e) {
 			throw new Error("While creating PCJ tables.",e);
diff --git a/extras/indexingExample/src/main/java/StatementMetadataExample.java b/extras/indexingExample/src/main/java/StatementMetadataExample.java
index b759fd2..9f0afc9 100644
--- a/extras/indexingExample/src/main/java/StatementMetadataExample.java
+++ b/extras/indexingExample/src/main/java/StatementMetadataExample.java
@@ -23,7 +23,6 @@
 import java.util.List;
 import java.util.Set;
 
-
 import org.apache.accumulo.core.client.Connector;
 import org.apache.commons.lang3.Validate;
 import org.apache.hadoop.conf.Configuration;
@@ -39,24 +38,25 @@
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataOptimizer;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 public class StatementMetadataExample {
 
diff --git a/extras/periodic.notification/api/pom.xml b/extras/periodic.notification/api/pom.xml
index ebed3c7..1118e14 100644
--- a/extras/periodic.notification/api/pom.xml
+++ b/extras/periodic.notification/api/pom.xml
@@ -40,8 +40,8 @@
             <artifactId>gson</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-query</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-query</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.kafka</groupId>
diff --git a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BinPruner.java b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BinPruner.java
index f4a083c..8aee25b 100644
--- a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BinPruner.java
+++ b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BinPruner.java
@@ -18,8 +18,8 @@
  */
 package org.apache.rya.periodic.notification.api;
 
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Object that cleans up old {@link BindingSet}s corresponding to the specified
diff --git a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetExporter.java b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetExporter.java
index 491576b..364ad4e 100644
--- a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetExporter.java
+++ b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetExporter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.rya.periodic.notification.api;
 
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * An Object that is used to export {@link BindingSet}s to an external repository or queuing system.
diff --git a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetRecord.java b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetRecord.java
index c3f70f1..1deb230 100644
--- a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetRecord.java
+++ b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/api/BindingSetRecord.java
@@ -18,7 +18,7 @@
  */
 package org.apache.rya.periodic.notification.api;
 
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Objects;
 
diff --git a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/serialization/BindingSetSerDe.java b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/serialization/BindingSetSerDe.java
index 6db7b18..ba7dcad 100644
--- a/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/serialization/BindingSetSerDe.java
+++ b/extras/periodic.notification/api/src/main/java/org/apache/rya/periodic/notification/serialization/BindingSetSerDe.java
@@ -28,14 +28,17 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Joiner;
 import com.google.common.primitives.Bytes;
 
+import com.google.common.base.Joiner;
+import com.google.common.primitives.Bytes;
+
 /**
  * Kafka {@link Serializer} and {@link Deserializer} for producing and consuming messages
  * from Kafka.
diff --git a/extras/periodic.notification/service/pom.xml b/extras/periodic.notification/service/pom.xml
index ef07131..dc68d3d 100644
--- a/extras/periodic.notification/service/pom.xml
+++ b/extras/periodic.notification/service/pom.xml
@@ -49,8 +49,8 @@
             <artifactId>rya.indexing</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-query</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-query</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplication.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplication.java
index 79abe2f..66cb25b 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplication.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplication.java
@@ -32,7 +32,7 @@
 import org.apache.rya.periodic.notification.processor.NotificationProcessorExecutor;
 import org.apache.rya.periodic.notification.pruner.PeriodicQueryPrunerExecutor;
 import org.apache.rya.periodic.notification.registration.kafka.KafkaNotificationProvider;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationFactory.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationFactory.java
index fbc03f3..85f6e15 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationFactory.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationFactory.java
@@ -18,13 +18,10 @@
  */
 package org.apache.rya.periodic.notification.application;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.util.Optional;
 import java.util.Properties;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
@@ -54,9 +51,7 @@
 import org.apache.rya.periodic.notification.registration.kafka.KafkaNotificationProvider;
 import org.apache.rya.periodic.notification.serialization.BindingSetSerDe;
 import org.apache.rya.periodic.notification.serialization.CommandNotificationSerializer;
-import org.openrdf.query.BindingSet;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.eclipse.rdf4j.query.BindingSet;
 
 
 /**
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaExporterExecutor.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaExporterExecutor.java
index 815a794..b9f3de8 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaExporterExecutor.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaExporterExecutor.java
@@ -29,7 +29,7 @@
 import org.apache.kafka.clients.producer.KafkaProducer;
 import org.apache.rya.periodic.notification.api.BindingSetRecord;
 import org.apache.rya.periodic.notification.api.LifeCycle;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaPeriodicBindingSetExporter.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaPeriodicBindingSetExporter.java
index c343116..182f328 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaPeriodicBindingSetExporter.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/exporter/KafkaPeriodicBindingSetExporter.java
@@ -31,8 +31,8 @@
 import org.apache.rya.periodic.notification.api.BindingSetExporter;
 import org.apache.rya.periodic.notification.api.BindingSetRecord;
 import org.apache.rya.periodic.notification.api.BindingSetRecordExportException;
-import org.openrdf.model.Literal;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.query.BindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/processor/TimestampedNotificationProcessor.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/processor/TimestampedNotificationProcessor.java
index dcc47b6..a27bf7a 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/processor/TimestampedNotificationProcessor.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/processor/TimestampedNotificationProcessor.java
@@ -30,7 +30,7 @@
 import org.apache.rya.periodic.notification.api.NotificationProcessor;
 import org.apache.rya.periodic.notification.exporter.KafkaPeriodicBindingSetExporter;
 import org.apache.rya.periodic.notification.notification.TimestampedNotification;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -95,7 +95,7 @@
         final long bin = getBinFromTimestamp(ts, period);
         final NodeBin nodeBin = new NodeBin(id, bin);
 
-        try (CloseableIterator<BindingSet> iter = periodicStorage.listResults(id, Optional.of(bin));) {
+        try (CloseableIterator<BindingSet> iter = periodicStorage.listResults(id, Optional.of(bin))) {
 
             while(iter.hasNext()) {
                 bindingSets.add(new BindingSetRecord(iter.next(), id));
diff --git a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/pruner/FluoBinPruner.java b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/pruner/FluoBinPruner.java
index ea08af5..886ffc2 100644
--- a/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/pruner/FluoBinPruner.java
+++ b/extras/periodic.notification/service/src/main/java/org/apache/rya/periodic/notification/pruner/FluoBinPruner.java
@@ -29,9 +29,8 @@
 import org.apache.rya.indexing.pcj.fluo.app.util.BindingHashShardingFunction;
 import org.apache.rya.periodic.notification.api.BinPruner;
 import org.apache.rya.periodic.notification.api.NodeBin;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -43,7 +42,7 @@
 public class FluoBinPruner implements BinPruner {
 
     private static final Logger log = LoggerFactory.getLogger(FluoBinPruner.class);
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private final FluoClient client;
 
     public FluoBinPruner(final FluoClient client) {
@@ -54,10 +53,8 @@
      * This method deletes BindingSets in the specified bin from the BindingSet
      * Column of the indicated Fluo nodeId
      *
-     * @param id
+     * @param nodeBin
      *            - Fluo nodeId
-     * @param bin
-     *            - bin id
      */
     @Override
     public void pruneBindingSetBin(final NodeBin nodeBin) {
@@ -70,7 +67,7 @@
                 throw new RuntimeException();
             }
             final Column batchInfoColumn = type.get().getResultColumn();
-            final Bytes batchInfoSpanPrefix = BindingHashShardingFunction.getShardedScanPrefix(id, vf.createLiteral(bin));
+            final Bytes batchInfoSpanPrefix = BindingHashShardingFunction.getShardedScanPrefix(id, VF.createLiteral(bin));
             final SpanBatchDeleteInformation batchInfo = SpanBatchDeleteInformation.builder().setColumn(batchInfoColumn)
                     .setSpan(Span.prefix(batchInfoSpanPrefix)).build();
             BatchInformationDAO.addBatch(tx, id, batchInfo);
diff --git a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationIT.java b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationIT.java
index cd06f2a..bd87df5 100644
--- a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationIT.java
+++ b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationApplicationIT.java
@@ -71,25 +71,23 @@
 import org.apache.rya.test.kafka.EmbeddedKafkaInstance;
 import org.apache.rya.test.kafka.EmbeddedKafkaSingleton;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
-import com.google.common.collect.Sets;;
-
+import com.google.common.collect.Sets;
 
 public class PeriodicNotificationApplicationIT extends RyaExportITBase {
 
@@ -142,12 +140,11 @@
 
         //make data
         final int periodMult = 15;
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         //Sleep until current time aligns nicely with period to makell
         //results more predictable
         while(System.currentTimeMillis() % (periodMult*1000) > 500) {
-            ;
         }
         final ZonedDateTime time = ZonedDateTime.now();
 
@@ -161,21 +158,21 @@
         final String time3 = zTime3.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasObsType"), vf.createLiteral("ship")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasObsType"), vf.createLiteral("ship")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasObsType"), vf.createLiteral("airplane")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasObsType"), vf.createLiteral("airplane")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasObsType"), vf.createLiteral("ship")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasObsType"), vf.createLiteral("ship")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasObsType"), vf.createLiteral("airplane")),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasObsType"), vf.createLiteral("airplane")),
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasObsType"), vf.createLiteral("automobile")));
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasObsType"), vf.createLiteral("automobile")));
 
         try (FluoClient fluo = FluoClientFactory.getFluoClient(conf.getFluoAppName(), Optional.of(conf.getFluoTableName()), conf)) {
             final Connector connector = ConfigUtils.getConnector(conf);
@@ -210,17 +207,17 @@
                 final Set<BindingSet> expected1 = new HashSet<>();
                 final QueryBindingSet bs1 = new QueryBindingSet();
                 bs1.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(0)));
-                bs1.addBinding("total", new LiteralImpl("2", XMLSchema.INTEGER));
+                bs1.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
                 bs1.addBinding("type", vf.createLiteral("airplane"));
 
                 final QueryBindingSet bs2 = new QueryBindingSet();
                 bs2.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(0)));
-                bs2.addBinding("total", new LiteralImpl("2", XMLSchema.INTEGER));
+                bs2.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
                 bs2.addBinding("type", vf.createLiteral("ship"));
 
                 final QueryBindingSet bs3 = new QueryBindingSet();
                 bs3.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(0)));
-                bs3.addBinding("total", new LiteralImpl("1", XMLSchema.INTEGER));
+                bs3.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
                 bs3.addBinding("type", vf.createLiteral("automobile"));
 
                 expected1.add(bs1);
@@ -230,12 +227,12 @@
                 final Set<BindingSet> expected2 = new HashSet<>();
                 final QueryBindingSet bs4 = new QueryBindingSet();
                 bs4.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(1)));
-                bs4.addBinding("total", new LiteralImpl("2", XMLSchema.INTEGER));
+                bs4.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
                 bs4.addBinding("type", vf.createLiteral("airplane"));
 
                 final QueryBindingSet bs5 = new QueryBindingSet();
                 bs5.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(1)));
-                bs5.addBinding("total", new LiteralImpl("2", XMLSchema.INTEGER));
+                bs5.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
                 bs5.addBinding("type", vf.createLiteral("ship"));
 
                 expected2.add(bs4);
@@ -244,12 +241,12 @@
                 final Set<BindingSet> expected3 = new HashSet<>();
                 final QueryBindingSet bs6 = new QueryBindingSet();
                 bs6.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(2)));
-                bs6.addBinding("total", new LiteralImpl("1", XMLSchema.INTEGER));
+                bs6.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
                 bs6.addBinding("type", vf.createLiteral("ship"));
 
                 final QueryBindingSet bs7 = new QueryBindingSet();
                 bs7.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(ids.get(2)));
-                bs7.addBinding("total", new LiteralImpl("1", XMLSchema.INTEGER));
+                bs7.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
                 bs7.addBinding("type", vf.createLiteral("airplane"));
 
                 expected3.add(bs6);
@@ -286,12 +283,11 @@
 
         //make data
         final int periodMult = 15;
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         //Sleep until current time aligns nicely with period to make
         //results more predictable
         while(System.currentTimeMillis() % (periodMult*1000) > 500) {
-            ;
         }
         final ZonedDateTime time = ZonedDateTime.now();
 
@@ -305,15 +301,15 @@
         final String time3 = zTime3.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")));
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")));
 
         try (FluoClient fluo = FluoClientFactory.getFluoClient(conf.getFluoAppName(), Optional.of(conf.getFluoTableName()), conf)) {
             final Connector connector = ConfigUtils.getConnector(conf);
@@ -378,12 +374,11 @@
 
         //make data
         final int periodMult = 15;
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         //Sleep until current time aligns nicely with period to make
         //results more predictable
         while(System.currentTimeMillis() % (periodMult*1000) > 500) {
-            ;
         }
         final ZonedDateTime time = ZonedDateTime.now();
 
@@ -397,15 +392,15 @@
         final String time3 = zTime3.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")));
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")));
 
         try (FluoClient fluo = FluoClientFactory.getFluoClient(conf.getFluoAppName(), Optional.of(conf.getFluoTableName()), conf)) {
             final Connector connector = ConfigUtils.getConnector(conf);
diff --git a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationProviderIT.java b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationProviderIT.java
index e05ca6f..cadbc57 100644
--- a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationProviderIT.java
+++ b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/application/PeriodicNotificationProviderIT.java
@@ -31,9 +31,9 @@
 import org.apache.rya.periodic.notification.coordinator.PeriodicNotificationCoordinatorExecutor;
 import org.apache.rya.periodic.notification.notification.TimestampedNotification;
 import org.apache.rya.periodic.notification.recovery.PeriodicNotificationProvider;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/exporter/PeriodicNotificationExporterIT.java b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/exporter/PeriodicNotificationExporterIT.java
index 82338b9..a2c76ec 100644
--- a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/exporter/PeriodicNotificationExporterIT.java
+++ b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/exporter/PeriodicNotificationExporterIT.java
@@ -38,13 +38,13 @@
 import org.apache.rya.periodic.notification.serialization.BindingSetSerDe;
 import org.apache.rya.test.kafka.KafkaITBase;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 public class PeriodicNotificationExporterIT extends KafkaITBase {
 
@@ -53,7 +53,7 @@
     public KafkaTestInstanceRule kafkaTestInstanceRule = new KafkaTestInstanceRule(false);
 
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testExporter() throws InterruptedException {
@@ -69,13 +69,13 @@
         final KafkaExporterExecutor exporter = new KafkaExporterExecutor(new KafkaProducer<String, BindingSet>(createKafkaProducerConfig()), 1, records);
         exporter.start();
         final QueryBindingSet bs1 = new QueryBindingSet();
-        bs1.addBinding(PeriodicQueryResultStorage.PeriodicBinId, vf.createLiteral(1L));
-        bs1.addBinding("name", vf.createURI("uri:Bob"));
+        bs1.addBinding(PeriodicQueryResultStorage.PeriodicBinId, VF.createLiteral(1L));
+        bs1.addBinding("name", VF.createIRI("uri:Bob"));
         final BindingSetRecord record1 = new BindingSetRecord(bs1, topic1);
 
         final QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding(PeriodicQueryResultStorage.PeriodicBinId, vf.createLiteral(2L));
-        bs2.addBinding("name", vf.createURI("uri:Joe"));
+        bs2.addBinding(PeriodicQueryResultStorage.PeriodicBinId, VF.createLiteral(2L));
+        bs2.addBinding("name", VF.createIRI("uri:Joe"));
         final BindingSetRecord record2 = new BindingSetRecord(bs2, topic2);
 
         records.add(record1);
diff --git a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/processor/PeriodicNotificationProcessorIT.java b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/processor/PeriodicNotificationProcessorIT.java
index 221a18d..1c04a42 100644
--- a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/processor/PeriodicNotificationProcessorIT.java
+++ b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/processor/PeriodicNotificationProcessorIT.java
@@ -34,16 +34,16 @@
 import org.apache.rya.periodic.notification.api.NodeBin;
 import org.apache.rya.periodic.notification.notification.PeriodicNotification;
 import org.apache.rya.periodic.notification.notification.TimestampedNotification;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 public class PeriodicNotificationProcessorIT extends AccumuloExportITBase {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final String RYA_INSTANCE_NAME = "rya_";
     
     @Test
@@ -72,26 +72,26 @@
         Set<VisibilityBindingSet> storageResults = new HashSet<>();
         
         QueryBindingSet bs1 = new QueryBindingSet();
-        bs1.addBinding("periodicBinId", vf.createLiteral(binId1));
-        bs1.addBinding("id", vf.createLiteral(1));
+        bs1.addBinding("periodicBinId", VF.createLiteral(binId1));
+        bs1.addBinding("id", VF.createLiteral(1));
         expected.add(bs1);
         storageResults.add(new VisibilityBindingSet(bs1));
         
         QueryBindingSet bs2 = new QueryBindingSet();
-        bs2.addBinding("periodicBinId", vf.createLiteral(binId1));
-        bs2.addBinding("id", vf.createLiteral(2));
+        bs2.addBinding("periodicBinId", VF.createLiteral(binId1));
+        bs2.addBinding("id", VF.createLiteral(2));
         expected.add(bs2);
         storageResults.add(new VisibilityBindingSet(bs2));
         
         QueryBindingSet bs3 = new QueryBindingSet();
-        bs3.addBinding("periodicBinId", vf.createLiteral(binId2));
-        bs3.addBinding("id", vf.createLiteral(3));
+        bs3.addBinding("periodicBinId", VF.createLiteral(binId2));
+        bs3.addBinding("id", VF.createLiteral(3));
         expected.add(bs3);
         storageResults.add(new VisibilityBindingSet(bs3));
         
         QueryBindingSet bs4 = new QueryBindingSet();
-        bs4.addBinding("periodicBinId", vf.createLiteral(binId2));
-        bs4.addBinding("id", vf.createLiteral(4));
+        bs4.addBinding("periodicBinId", VF.createLiteral(binId2));
+        bs4.addBinding("id", VF.createLiteral(4));
         expected.add(bs4);
         storageResults.add(new VisibilityBindingSet(bs4));
         
diff --git a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/pruner/PeriodicNotificationBinPrunerIT.java b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/pruner/PeriodicNotificationBinPrunerIT.java
index ac2202c..d403450 100644
--- a/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/pruner/PeriodicNotificationBinPrunerIT.java
+++ b/extras/periodic.notification/tests/src/test/java/org/apache/rya/periodic/notification/pruner/PeriodicNotificationBinPrunerIT.java
@@ -53,16 +53,15 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
 import org.apache.rya.periodic.notification.api.NodeBin;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Sets;
 
@@ -88,7 +87,7 @@
         String queryId = FluoQueryUtils.convertFluoQueryIdToPcjId(createPeriodicQuery.createPeriodicQuery(sparql).getQueryId());
 
         // create statements to ingest into Fluo
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         ZonedDateTime time = ZonedDateTime.now();
         long currentTime = time.toInstant().toEpochMilli();
@@ -106,24 +105,24 @@
         String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasId"), vf.createLiteral("id_4")),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasId"), vf.createLiteral("id_4")),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")));
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")));
 
         // add statements to Fluo
         InsertTriples inserter = new InsertTriples();
@@ -250,8 +249,10 @@
     }
 
     private void compareFluoCounts(FluoClient client, String pcjId, long bin) {
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, new LiteralImpl(Long.toString(bin), XMLSchema.LONG));
+
+        bs.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(Long.toString(bin), XMLSchema.LONG));
 
         VariableOrder varOrder = new VariableOrder(IncrementalUpdateConstants.PERIODIC_BIN_ID);
 
diff --git a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/BenchmarkStatementGenerator.java b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/BenchmarkStatementGenerator.java
index fdd3b63..e766c18 100644
--- a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/BenchmarkStatementGenerator.java
+++ b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/BenchmarkStatementGenerator.java
@@ -25,10 +25,10 @@
 import javax.xml.datatype.DatatypeConfigurationException;
 import javax.xml.datatype.DatatypeFactory;
 
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -41,11 +41,10 @@
 
     private static final Logger logger = LoggerFactory.getLogger(BenchmarkStatementGenerator.class);
 
-    private final ValueFactory vf;
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private final DatatypeFactory dtf;
 
     public BenchmarkStatementGenerator() throws DatatypeConfigurationException {
-        vf = new ValueFactoryImpl();
         dtf = DatatypeFactory.newInstance();
     }
 
@@ -69,7 +68,7 @@
      */
     public List<Statement> generate(final long numObservationsPerType, final int numTypes, final String typePrefix, final long observationOffset, final ZonedDateTime zonedTime) {
         final String time = zonedTime.format(DateTimeFormatter.ISO_INSTANT);
-        final Literal litTime = vf.createLiteral(dtf.newXMLGregorianCalendar(time));
+        final Literal litTime = VF.createLiteral(dtf.newXMLGregorianCalendar(time));
         final List<Statement> statements = Lists.newArrayList();
 
         for (long i = 0; i < numObservationsPerType; i++) {
@@ -80,8 +79,8 @@
                 final String obsId = "urn:obs_" + String.format("%020d", observationId);
                 final String type = typePrefix + j;
                 //logger.info(obsId + " " + type + " " + litTime);
-                statements.add(vf.createStatement(vf.createURI(obsId), vf.createURI("uri:hasTime"), litTime));
-                statements.add(vf.createStatement(vf.createURI(obsId), vf.createURI("uri:hasObsType"), vf.createLiteral(type)));
+                statements.add(VF.createStatement(VF.createIRI(obsId), VF.createIRI("uri:hasTime"), litTime));
+                statements.add(VF.createStatement(VF.createIRI(obsId), VF.createIRI("uri:hasObsType"), VF.createLiteral(type)));
             }
         }
 
diff --git a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/KafkaLatencyBenchmark.java b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/KafkaLatencyBenchmark.java
index e75d499..258d9df 100644
--- a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/KafkaLatencyBenchmark.java
+++ b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/periodic/KafkaLatencyBenchmark.java
@@ -53,8 +53,8 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.fluo.app.export.kafka.KryoVisibilityBindingSetSerializer;
 import org.apache.rya.periodic.notification.serialization.BindingSetSerDe;
-import org.openrdf.model.Statement;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.BindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/PCJOptimizerBenchmark.java b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/PCJOptimizerBenchmark.java
index cf4ca8f..8b386ab 100644
--- a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/PCJOptimizerBenchmark.java
+++ b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/PCJOptimizerBenchmark.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -33,6 +33,10 @@
 import org.apache.rya.indexing.external.tupleSet.SimpleExternalTupleSet;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.Param;
 import org.openjdk.jmh.annotations.Scope;
@@ -43,10 +47,6 @@
 import org.openjdk.jmh.runner.options.CommandLineOptionException;
 import org.openjdk.jmh.runner.options.CommandLineOptions;
 import org.openjdk.jmh.runner.options.OptionsBuilder;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.Lists;
diff --git a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/QueryBenchmark.java b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/QueryBenchmark.java
index 248ea88..68fa53d 100644
--- a/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/QueryBenchmark.java
+++ b/extras/rya.benchmark/src/main/java/org/apache/rya/benchmark/query/QueryBenchmark.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -35,10 +35,24 @@
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.log4j.PatternLayout;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.benchmark.query.Parameters.NumReadsRuns;
 import org.apache.rya.benchmark.query.QueryBenchmark.QueryBenchmarkRun.NotEnoughResultsException;
 import org.apache.rya.benchmark.query.Rya.Accumulo;
 import org.apache.rya.benchmark.query.Rya.SecondaryIndexing;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
+import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinUpdaterType;
+import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
+import org.eclipse.rdf4j.sail.SailException;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Mode;
@@ -51,21 +65,6 @@
 import org.openjdk.jmh.runner.Runner;
 import org.openjdk.jmh.runner.options.CommandLineOptions;
 import org.openjdk.jmh.runner.options.OptionsBuilder;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
-import org.openrdf.sail.SailException;
-
-import info.aduna.iteration.CloseableIteration;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
-import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinUpdaterType;
-import org.apache.rya.sail.config.RyaSailFactory;
 
 /**
  * A benchmark that may be used to evaluate the performance of SPARQL queries
diff --git a/extras/rya.benchmark/src/test/java/org/apache/rya/benchmark/query/QueryBenchmarkRunIT.java b/extras/rya.benchmark/src/test/java/org/apache/rya/benchmark/query/QueryBenchmarkRunIT.java
index dd5fe68..1160ad3 100644
--- a/extras/rya.benchmark/src/test/java/org/apache/rya/benchmark/query/QueryBenchmarkRunIT.java
+++ b/extras/rya.benchmark/src/test/java/org/apache/rya/benchmark/query/QueryBenchmarkRunIT.java
@@ -42,10 +42,10 @@
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailConnection;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailConnection;
+import org.eclipse.rdf4j.sail.SailException;
 
 /**
  * Integration tests {@link QueryBenchmarkRun}.
@@ -121,23 +121,23 @@
 
         final SailConnection sailConn = sail.getConnection();
         sailConn.begin();
-        sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:Bob"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:David"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:Eve"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:Frank"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:George"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
-        sailConn.addStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:likes"), vf.createURI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:David"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:George"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
+        sailConn.addStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:likes"), vf.createIRI("urn:icecream"));
 
-        sailConn.addStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:David"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:Eve"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:Frank"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:blue"));
-        sailConn.addStatement(vf.createURI("urn:George"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:green"));
-        sailConn.addStatement(vf.createURI("urn:Hillary"), vf.createURI("urn:hasEyeColor"), vf.createURI("urn:brown"));
+        sailConn.addStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:David"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:Frank"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:blue"));
+        sailConn.addStatement(vf.createIRI("urn:George"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:green"));
+        sailConn.addStatement(vf.createIRI("urn:Hillary"), vf.createIRI("urn:hasEyeColor"), vf.createIRI("urn:brown"));
         sailConn.commit();
         sailConn.close();
     }
diff --git a/extras/rya.export/export.accumulo/pom.xml b/extras/rya.export/export.accumulo/pom.xml
index 48a83d1..06201dc 100644
--- a/extras/rya.export/export.accumulo/pom.xml
+++ b/extras/rya.export/export.accumulo/pom.xml
@@ -73,6 +73,12 @@
             <version>${accumulo.version}</version>
             <type>pom</type>
         </dependency>
+
+        <dependency>
+            <groupId>org.apache.accumulo</groupId>
+            <artifactId>accumulo-minicluster</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.thrift</groupId>
             <artifactId>libthrift</artifactId>
diff --git a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/AccumuloRyaStatementStore.java b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/AccumuloRyaStatementStore.java
index f5992df..ddcdd4c 100644
--- a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/AccumuloRyaStatementStore.java
+++ b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/AccumuloRyaStatementStore.java
@@ -38,10 +38,8 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
-import org.apache.rya.export.InstanceType;
 import org.apache.rya.export.accumulo.parent.AccumuloParentMetadataRepository;
 import org.apache.rya.export.accumulo.util.AccumuloRyaUtils;
-import org.apache.rya.export.api.MergerException;
 import org.apache.rya.export.api.metadata.MergeParentMetadata;
 import org.apache.rya.export.api.metadata.ParentMetadataExistsException;
 import org.apache.rya.export.api.store.AddStatementException;
@@ -50,12 +48,11 @@
 import org.apache.rya.export.api.store.RemoveStatementException;
 import org.apache.rya.export.api.store.RyaStatementStore;
 import org.apache.rya.export.api.store.UpdateStatementException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 import com.google.common.base.Function;
 import com.google.common.collect.Iterators;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Allows specific CRUD operations an Accumulo {@link RyaStatement} storage
  * system.
@@ -79,15 +76,9 @@
 
     /**
      * Creates a new instance of {@link AccumuloRyaStatementStore}.
-     * @param instanceName the Accumulo instance name.
-     * @param username the Accumulo user name.
-     * @param password the Accumulo user's password.
-     * @param instanceType the {@link InstanceType}.
+     * @param dao the {@AccumuloRyaDAO}.
      * @param tablePrefix the Rya instance's table prefix.
-     * @param auths the comma-separated list of Accumulo authorizations for the
-     * user.
-     * @param zooKeepers the comma-separated list of zoo keeper host names.
-     * @throws MergerException
+     * @param ryaInstance the Rya instance name.
      */
     public AccumuloRyaStatementStore(final AccumuloRyaDAO dao, final String tablePrefix, final String ryaInstance) {
         this.tablePrefix = tablePrefix;
diff --git a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/conf/AccumuloExportConstants.java b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/conf/AccumuloExportConstants.java
index 51dec9b..1fc9eaa 100644
--- a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/conf/AccumuloExportConstants.java
+++ b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/conf/AccumuloExportConstants.java
@@ -27,6 +27,7 @@
 import org.apache.log4j.Logger;
 import org.apache.rya.accumulo.mr.MRUtils;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.export.InstanceType;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 
 import com.google.common.collect.ImmutableList;
diff --git a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/util/AccumuloRyaUtils.java b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/util/AccumuloRyaUtils.java
index 1073b6e..090d22f 100644
--- a/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/util/AccumuloRyaUtils.java
+++ b/extras/rya.export/export.accumulo/src/main/java/org/apache/rya/export/accumulo/util/AccumuloRyaUtils.java
@@ -61,7 +61,7 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.openrdf.model.ValueFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableSet;
@@ -104,7 +104,7 @@
      * @return the {@link RyaURI}.
      */
     public static RyaURI createRyaUri(final String namespace, final String localName) {
-        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createURI(namespace, localName));
+        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createIRI(namespace, localName));
     }
 
     /**
diff --git a/extras/rya.export/export.client/pom.xml b/extras/rya.export/export.client/pom.xml
index 979cb7d..c942702 100644
--- a/extras/rya.export/export.client/pom.xml
+++ b/extras/rya.export/export.client/pom.xml
@@ -56,21 +56,20 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryrender</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryrender</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-turtle</artifactId>
-            <version>${openrdf.sesame.version}</version>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-turtle</artifactId>
         </dependency>
 
         <!-- Testing dependencies. -->
diff --git a/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/MergeDriverClient.java b/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/MergeDriverClient.java
index 232a0ed..2a902a7 100644
--- a/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/MergeDriverClient.java
+++ b/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/MergeDriverClient.java
@@ -45,10 +45,10 @@
 import org.apache.rya.export.client.merge.StatementStoreFactory;
 import org.apache.rya.export.client.merge.VisibilityStatementMerger;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.SailException;
 
 import com.google.common.base.Optional;
 
@@ -89,7 +89,7 @@
             final String tomcat = configuration.getChildTomcatUrl();
             final String ntpHost = configuration.getNtpServerHost();
             try {
-                offset = Optional.<Long>fromNullable(TimeUtils.getNtpServerAndMachineTimeDifference(ntpHost, tomcat));
+                offset = Optional.fromNullable(TimeUtils.getNtpServerAndMachineTimeDifference(ntpHost, tomcat));
             } catch (final IOException e) {
                 LOG.error("Unable to get time difference between time server: " + ntpHost + " and the server: " + tomcat, e);
             }
diff --git a/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/conf/TimeUtils.java b/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/conf/TimeUtils.java
index b1731de..30ac924 100644
--- a/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/conf/TimeUtils.java
+++ b/extras/rya.export/export.client/src/main/java/org/apache/rya/export/client/conf/TimeUtils.java
@@ -31,10 +31,10 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.net.ntp.NTPUDPClient;
 import org.apache.commons.net.ntp.TimeInfo;
 import org.apache.log4j.Logger;
-import org.codehaus.plexus.util.StringUtils;
 import org.mortbay.jetty.HttpMethods;
 
 import com.google.common.net.HttpHeaders;
diff --git a/extras/rya.export/export.integration/src/test/java/org/apache/rya/indexing/export/ITBase.java b/extras/rya.export/export.integration/src/test/java/org/apache/rya/indexing/export/ITBase.java
index 60fff56..83fd774 100644
--- a/extras/rya.export/export.integration/src/test/java/org/apache/rya/indexing/export/ITBase.java
+++ b/extras/rya.export/export.integration/src/test/java/org/apache/rya/indexing/export/ITBase.java
@@ -44,16 +44,16 @@
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.AfterClass;
-import org.openrdf.model.Statement;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
 
 import com.mongodb.MongoClient;
 import com.mongodb.MongoException;
@@ -193,7 +193,7 @@
     }
 
     /**
-     * A helper function for creating a Sesame {@link Statement} that represents
+     * A helper function for creating a RDF4J {@link Statement} that represents
      * a Triple..
      *
      * @param subject
diff --git a/extras/rya.forwardchain/pom.xml b/extras/rya.forwardchain/pom.xml
index 454cb74..2fdaf15 100644
--- a/extras/rya.forwardchain/pom.xml
+++ b/extras/rya.forwardchain/pom.xml
@@ -31,8 +31,8 @@
 
     <dependencies>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-runtime</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-runtime</artifactId>
             </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/ForwardChainConstants.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/ForwardChainConstants.java
index f1fe8b3..d4ae96f 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/ForwardChainConstants.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/ForwardChainConstants.java
@@ -22,15 +22,15 @@
 import org.apache.rya.api.domain.RyaSchema;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
 
 public class ForwardChainConstants {
     private static final ValueFactory VF = RdfCloudTripleStoreConstants.VALUE_FACTORY;
     private static final String NAMESPACE = RyaSchema.NAMESPACE;
 
-    public static final URI DERIVATION_TIME = VF.createURI(NAMESPACE, "forwardChainIteration");
-    public static final URI DERIVATION_RULE = VF.createURI(NAMESPACE, "forwardChainRule");
+    public static final IRI DERIVATION_TIME = VF.createIRI(NAMESPACE, "forwardChainIteration");
+    public static final IRI DERIVATION_RULE = VF.createIRI(NAMESPACE, "forwardChainRule");
 
     public static final RyaURI RYA_DERIVATION_RULE = RdfToRyaConversions.convertURI(DERIVATION_RULE);
     public static final RyaURI RYA_DERIVATION_TIME = RdfToRyaConversions.convertURI(DERIVATION_TIME);
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractConstructRule.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractConstructRule.java
index c4c12c7..649baa7 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractConstructRule.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractConstructRule.java
@@ -21,8 +21,8 @@
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.strategy.AbstractRuleExecutionStrategy;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.parser.ParsedGraphQuery;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.parser.ParsedGraphQuery;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractInconsistencyRule.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractInconsistencyRule.java
index 451c5e4..56afae7 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractInconsistencyRule.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AbstractInconsistencyRule.java
@@ -24,7 +24,7 @@
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.strategy.AbstractRuleExecutionStrategy;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 /**
  * A rule that identifies an inconsistency in the data, but does not add or
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AntecedentVisitor.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AntecedentVisitor.java
index 1f2cbba..766b001 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AntecedentVisitor.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/AntecedentVisitor.java
@@ -21,8 +21,8 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Query visitor that identifies all triple patterns represented as
@@ -33,7 +33,7 @@
  * This means relying on this analysis to determine whether a fact can be part
  * of a solution can yield false positives, but not false negatives.
  */
-class AntecedentVisitor extends QueryModelVisitorBase<RuntimeException> {
+class AntecedentVisitor extends AbstractQueryModelVisitor<RuntimeException> {
     private Set<StatementPattern> antecedentStatementPatterns = new HashSet<>();
 
     /**
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitor.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitor.java
index e28dbe3..cd002da 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitor.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitor.java
@@ -25,18 +25,18 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.BNodeGenerator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.BNodeGenerator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Query visitor that identifies all triple patterns produced by a "CONSTRUCT"
@@ -53,7 +53,7 @@
  * this analysis may produce an overly broad set of possible consequents
  * compared to some more sophisticated method.
  */
-public class ConstructConsequentVisitor extends QueryModelVisitorBase<RuntimeException> {
+public class ConstructConsequentVisitor extends AbstractQueryModelVisitor<RuntimeException> {
     private Set<StatementPattern> consequentStatementPatterns = new HashSet<>();
 
     private static final String SUBJECT_VAR_NAME = "subject";
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Rule.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Rule.java
index 74004b9..89e3bc7 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Rule.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Rule.java
@@ -23,7 +23,7 @@
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.strategy.AbstractRuleExecutionStrategy;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 /**
  * Represents a forward-chaining inference rule. A rule is triggered by some
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Ruleset.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Ruleset.java
index 965d2d3..484fc8a 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Ruleset.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/Ruleset.java
@@ -25,7 +25,7 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.log4j.Logger;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/SpinConstructRule.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/SpinConstructRule.java
index 44e15e6..114d88e 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/SpinConstructRule.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/rule/SpinConstructRule.java
@@ -26,42 +26,43 @@
 import org.apache.log4j.Logger;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.StatementMetadata;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.forwardchain.ForwardChainConstants;
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.strategy.AbstractRuleExecutionStrategy;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SP;
-import org.openrdf.model.vocabulary.SPIN;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandlerBase;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.SingletonSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedGraphQuery;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SP;
+import org.eclipse.rdf4j.model.vocabulary.SPIN;
+import org.eclipse.rdf4j.query.AbstractTupleQueryResultHandler;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.SingletonSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedGraphQuery;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
@@ -176,8 +177,8 @@
         return var == null ? null : var.getValue();
     }
 
-    private static class TypeRequirementVisitor extends QueryModelVisitorBase<RuntimeException> {
-        private static final Var RDF_TYPE_VAR = new Var("-const-" + RDF.TYPE.stringValue(), RDF.TYPE);
+    private static class TypeRequirementVisitor extends AbstractQueryModelVisitor<RuntimeException> {
+        private static final Var RDF_TYPE_VAR = VarNameUtils.createUniqueConstVar(RDF.TYPE);
         private static final Set<Resource> BASE_TYPES = Sets.newHashSet(RDFS.RESOURCE, OWL.THING);
         static {
             RDF_TYPE_VAR.setConstant(true);
@@ -186,7 +187,7 @@
         private final String varName;
         private final StatementPattern typeRequirement;
         public TypeRequirementVisitor(String varName, Resource requiredType) {
-            final Var typeVar = new Var("-const-" + requiredType.stringValue(), requiredType);
+            final Var typeVar = VarNameUtils.createUniqueConstVar(requiredType);
             typeVar.setConstant(true);
             this.varName = varName;
             if (BASE_TYPES.contains(requiredType)) {
@@ -285,7 +286,7 @@
         try {
             conn = repository.getConnection();
             TupleQuery ruleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, ruleQueryString);
-            ruleQuery.evaluate(new TupleQueryResultHandlerBase() {
+            ruleQuery.evaluate(new AbstractTupleQueryResultHandler() {
                 @Override
                 public void handleSolution(BindingSet bs) throws TupleQueryResultHandlerException {
                 // For each rule identifier found, instantiate a SpinRule
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/MongoPipelineStrategy.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/MongoPipelineStrategy.java
index c095122..95ad841 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/MongoPipelineStrategy.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/MongoPipelineStrategy.java
@@ -46,8 +46,8 @@
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.bson.Document;
 import org.bson.conversions.Bson;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 import com.google.common.base.Preconditions;
 import com.mongodb.Block;
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/RoundRobinStrategy.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/RoundRobinStrategy.java
index eb044fc..9d54f93 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/RoundRobinStrategy.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/RoundRobinStrategy.java
@@ -32,7 +32,7 @@
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.rule.Rule;
 import org.apache.rya.forwardchain.rule.Ruleset;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/SailExecutionStrategy.java b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/SailExecutionStrategy.java
index d09c50c..86e04eb 100644
--- a/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/SailExecutionStrategy.java
+++ b/extras/rya.forwardchain/src/main/java/org/apache/rya/forwardchain/strategy/SailExecutionStrategy.java
@@ -36,16 +36,16 @@
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.calrissian.mango.collect.CloseableIterable;
-import org.openrdf.model.Statement;
-import org.openrdf.query.GraphQuery;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.parser.ParsedGraphQuery;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailGraphQuery;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.helpers.RDFHandlerBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.GraphQuery;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.parser.ParsedGraphQuery;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailGraphQuery;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
 
 import com.google.common.base.Preconditions;
 
@@ -186,7 +186,7 @@
         }
     }
 
-    private static class InferredStatementHandler<T extends RdfCloudTripleStoreConfiguration> extends RDFHandlerBase {
+    private static class InferredStatementHandler<T extends RdfCloudTripleStoreConfiguration> extends AbstractRDFHandler {
         private RyaDAO<T> dao;
         private RyaQueryEngine<T> engine;
         private long numStatementsAdded = 0;
diff --git a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/batch/MongoSpinIT.java b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/batch/MongoSpinIT.java
index c70a025..72fb085 100644
--- a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/batch/MongoSpinIT.java
+++ b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/batch/MongoSpinIT.java
@@ -20,6 +20,7 @@
 
 import java.io.BufferedReader;
 import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.net.URL;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -34,29 +35,30 @@
 import org.apache.rya.mongodb.EmbeddedMongoFactory;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.ListBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.Rio;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.ListBindingSet;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.Rio;
 
+import com.google.common.base.Charsets;
 import com.google.common.io.Resources;
 import com.mongodb.MongoClient;
 import com.mongodb.ServerAddress;
 
 public class MongoSpinIT {
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final String EX = "http://example.org/";
 
     private MongoDBRdfConfiguration conf;
@@ -94,9 +96,11 @@
         ToolRunner.run(conf, tool, new String[] {});
         solutions = executeQuery(Resources.getResource("query.sparql"));
         expected.add(new ListBindingSet(Arrays.asList("X", "Y"),
-            VF.createURI(EX, "Alice"), VF.createURI(EX, "Department1")));
+            VF.createIRI(EX, "Alice"), VF.createIRI(EX, "Department1")));
         Assert.assertEquals(expected, solutions);
-        Assert.assertEquals(24, tool.getNumInferences());
+        // TODO: Check if spin rules with empty WHERE clauses, such as
+        // rl:scm-cls in the owlrl.ttl test file, should be included.
+        Assert.assertEquals(48, tool.getNumInferences());
     }
 
     @Test
@@ -112,13 +116,15 @@
         ToolRunner.run(conf, tool, new String[] {});
         solutions = executeQuery(Resources.getResource("query.sparql"));
         expected.add(new ListBindingSet(Arrays.asList("X", "Y"),
-            VF.createURI(EX, "Alice"), VF.createURI(EX, "Department1")));
+            VF.createIRI(EX, "Alice"), VF.createIRI(EX, "Department1")));
         Assert.assertEquals(expected, solutions);
-        Assert.assertEquals(24, tool.getNumInferences());
+        // TODO: Check if spin rules with empty WHERE clauses, such as
+        // rl:scm-cls in the owlrl.ttl test file, should be included.
+        Assert.assertEquals(41, tool.getNumInferences());
     }
 
     private void insertDataFile(URL dataFile, String defaultNamespace) throws Exception {
-        RDFFormat format = Rio.getParserFormatForFileName(dataFile.getFile());
+        RDFFormat format = Rio.getParserFormatForFileName(dataFile.getFile()).get();
         SailRepositoryConnection conn = repository.getConnection();
         try {
             conn.add(dataFile, defaultNamespace, format);
@@ -127,20 +133,22 @@
         }
     }
 
-    Set<BindingSet> executeQuery(URL queryFile) throws Exception {
+    private Set<BindingSet> executeQuery(URL queryFile) throws Exception {
         SailRepositoryConnection conn = repository.getConnection();
         try {
-            InputStream queryIS = queryFile.openStream();
-            BufferedReader br = new BufferedReader(new java.io.InputStreamReader(queryIS, "UTF-8"));
-            String query = br.lines().collect(Collectors.joining("\n"));
-            br.close();
-            TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
-            TupleQueryResult result = tupleQuery.evaluate();
-            Set<BindingSet> solutions = new HashSet<>();
-            while (result.hasNext()) {
-                solutions.add(result.next());
+            try(
+                final InputStream queryIS = queryFile.openStream();
+                final BufferedReader br = new BufferedReader(new InputStreamReader(queryIS, Charsets.UTF_8));
+            ) {
+                final String query = br.lines().collect(Collectors.joining("\n"));
+                final TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
+                final TupleQueryResult result = tupleQuery.evaluate();
+                final Set<BindingSet> solutions = new HashSet<>();
+                while (result.hasNext()) {
+                    solutions.add(result.next());
+                }
+                return solutions;
             }
-            return solutions;
         } finally {
             closeQuietly(conn);
         }
diff --git a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/AntecedentVisitorTest.java b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/AntecedentVisitorTest.java
index 7761a1a..ca9df6e 100644
--- a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/AntecedentVisitorTest.java
+++ b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/AntecedentVisitorTest.java
@@ -20,34 +20,35 @@
 
 import java.util.Set;
 
+import org.apache.rya.api.domain.VarNameUtils;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.StatementPattern.Scope;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.StatementPattern.Scope;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 
 public class AntecedentVisitorTest {
     private static Var c(Value val) {
-        Var v = new Var("-const-" + val.stringValue(), val);
+        final Var v = VarNameUtils.createUniqueConstVar(val);
         v.setAnonymous(true);
         return v;
     }
 
-    private static ValueFactory VF = ValueFactoryImpl.getInstance();
-    private static String EX = "http://example.org/";
-    private static URI G1 = VF.createURI(EX, "Graph1");
-    private static URI G2 = VF.createURI(EX, "Graph2");
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final String EX = "http://example.org/";
+    private static final IRI G1 = VF.createIRI(EX, "Graph1");
+    private static final IRI G2 = VF.createIRI(EX, "Graph2");
 
     @Test
     public void testSelectQuery() throws Exception {
diff --git a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitorTest.java b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitorTest.java
index 0865ef8..9acdbff 100644
--- a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitorTest.java
+++ b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/ConstructConsequentVisitorTest.java
@@ -21,23 +21,23 @@
 import java.util.Arrays;
 import java.util.Set;
 
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.BNodeGenerator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.SingletonSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.BNodeGenerator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.SingletonSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/RulesetTest.java b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/RulesetTest.java
index adb851b..13ea873 100644
--- a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/RulesetTest.java
+++ b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/RulesetTest.java
@@ -22,21 +22,22 @@
 import java.util.Set;
 
 import org.apache.rya.api.domain.StatementMetadata;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.forwardchain.ForwardChainException;
 import org.apache.rya.forwardchain.strategy.AbstractRuleExecutionStrategy;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
 public class RulesetTest {
     private static Var c(Value val) {
-        Var v = new Var("-const-" + val.stringValue(), val);
+        final Var v = VarNameUtils.createUniqueConstVar(val);
         v.setAnonymous(true);
         return v;
     }
diff --git a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/SpinConstructRuleTest.java b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/SpinConstructRuleTest.java
index 9bbcce0..5e525bc 100644
--- a/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/SpinConstructRuleTest.java
+++ b/extras/rya.forwardchain/src/test/java/org/apache/rya/forwardchain/rule/SpinConstructRuleTest.java
@@ -20,35 +20,36 @@
 
 import java.util.Arrays;
 
+import org.apache.rya.api.domain.VarNameUtils;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.parser.ParsedGraphQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.parser.ParsedGraphQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.HashMultiset;
 import com.google.common.collect.Multiset;
 
 public class SpinConstructRuleTest {
-    private static ValueFactory VF = ValueFactoryImpl.getInstance();
-    private static SPARQLParser PARSER = new SPARQLParser();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final SPARQLParser PARSER = new SPARQLParser();
 
-    private static URI RL_CAX_SCO = VF.createURI("http://example.org/rl/cax-sco");
-    private static URI RL_SCM_CLS = VF.createURI("http://example.org/rl/scm-cls");
-    private static URI RL_PRP_SPO1 = VF.createURI("http://example.org/rl/prp-spo");
-    private static URI LIVING_THING = VF.createURI("http://example.org/LivingThing");
+    private static final IRI RL_CAX_SCO = VF.createIRI("http://example.org/rl/cax-sco");
+    private static final IRI RL_SCM_CLS = VF.createIRI("http://example.org/rl/scm-cls");
+    private static final IRI RL_PRP_SPO1 = VF.createIRI("http://example.org/rl/prp-spo");
+    private static final IRI LIVING_THING = VF.createIRI("http://example.org/LivingThing");
 
     private static Var c(Value val) {
-        return new Var("-const-" + val.stringValue(), val);
+        return VarNameUtils.createUniqueConstVar(val);
     }
     private static Var ac(Value val) {
         Var v = c(val);
@@ -62,7 +63,7 @@
                 + "  ?this a <" + LIVING_THING.stringValue() + "> .\n"
                 + "} WHERE { }";
         ParsedGraphQuery query = (ParsedGraphQuery) PARSER.parseQuery(text, null);
-        SpinConstructRule rule = new SpinConstructRule(FOAF.PERSON, VF.createURI("urn:person-is-living"), query);
+        SpinConstructRule rule = new SpinConstructRule(FOAF.PERSON, VF.createIRI("urn:person-is-living"), query);
         Multiset<StatementPattern> expectedAntecedents = HashMultiset.create(Arrays.asList(
                 new StatementPattern(new Var("this"), c(RDF.TYPE), c(FOAF.PERSON))));
         Multiset<StatementPattern> expectedConsequents = HashMultiset.create(Arrays.asList(
@@ -120,6 +121,8 @@
         String text = "CONSTRUCT {\n"
                 // actual rule is "?this subClassOf ?this", but reflexive construct patterns produce
                 // bnodes due to an openrdf bug, resulting in incorrect matches
+                // TODO: is the above comment still a concern with RDF4J? bnodes
+                // don't appear to be produced with RDF4J
                 + "  ?this rdfs:subClassOf ?something .\n"
                 + "  ?this owl:equivalentClass ?something .\n"
                 + "  ?this rdfs:subClassOf owl:Thing .\n"
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoEnabledFilterFunctionOptimizer.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoEnabledFilterFunctionOptimizer.java
index a425ce4..bd82c21 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoEnabledFilterFunctionOptimizer.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoEnabledFilterFunctionOptimizer.java
@@ -43,31 +43,30 @@
 import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
 import org.apache.rya.mongodb.MongoSecondaryIndex;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.And;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.And;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Lists;
 
 public class GeoEnabledFilterFunctionOptimizer implements QueryOptimizer, Configurable {
     private static final Logger LOG = Logger.getLogger(GeoEnabledFilterFunctionOptimizer.class);
-    private final ValueFactory valueFactory = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private Configuration conf;
     private GeoIndexer geoIndexer;
@@ -190,12 +189,12 @@
     }
 
     //find vars contained in filters
-    private static class SearchVarVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class SearchVarVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final Collection<Var> searchProperties = new ArrayList<>();
 
         @Override
         public void meet(final FunctionCall fn) {
-            final URI fun = new URIImpl(fn.getURI());
+            final IRI fun = VF.createIRI(fn.getURI());
             final Var result = IndexingFunctionRegistry.getResultVarFromFunctionCall(fun, fn.getArgs());
             if (result != null && !searchProperties.contains(result)) {
                 searchProperties.add(result);
@@ -204,7 +203,7 @@
     }
 
     //find StatementPatterns containing filter variables
-    private static class MatchStatementVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class MatchStatementVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final Collection<Var> propertyVars;
         private final Collection<Var> usedVars = new ArrayList<>();
         private final List<StatementPattern> matchStatements = new ArrayList<>();
@@ -226,16 +225,16 @@
         }
     }
 
-    private abstract class AbstractEnhanceVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private abstract class AbstractEnhanceVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         final String matchVar;
-        List<URI> func = Lists.newArrayList();
+        List<IRI> func = Lists.newArrayList();
         List<Object[]> args = Lists.newArrayList();
 
         public AbstractEnhanceVisitor(final String matchVar) {
             this.matchVar = matchVar;
         }
 
-        protected void addFilter(final URI uri, final Object[] values) {
+        protected void addFilter(final IRI uri, final Object[] values) {
             func.add(uri);
             args.add(values);
         }
@@ -250,12 +249,12 @@
 
         @Override
         public void meet(final FunctionCall call) {
-            final URI fnUri = valueFactory.createURI(call.getURI());
+            final IRI fnUri = VF.createIRI(call.getURI());
             final Var resultVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(fnUri, call.getArgs());
             if (resultVar != null && resultVar.getName().equals(matchVar)) {
-                addFilter(valueFactory.createURI(call.getURI()), GeoParseUtils.extractArguments(matchVar, call));
+                addFilter(VF.createIRI(call.getURI()), GeoParseUtils.extractArguments(matchVar, call));
                 if (call.getParentNode() instanceof Filter || call.getParentNode() instanceof And || call.getParentNode() instanceof LeftJoin) {
-                    call.replaceWith(new ValueConstant(valueFactory.createLiteral(true)));
+                    call.replaceWith(new ValueConstant(VF.createLiteral(true)));
                 } else {
                     throw new IllegalArgumentException("Query error: Found " + call + " as part of an expression that is too complex");
                 }
@@ -299,7 +298,7 @@
 
         public IndexerExprReplacer(final List<IndexingExpr> indxExpr) {
             this.indxExpr = indxExpr;
-            final URI func = indxExpr.get(0).getFunction();
+            final IRI func = indxExpr.get(0).getFunction();
             type = IndexingFunctionRegistry.getFunctionType(func);
         }
 
@@ -329,7 +328,7 @@
         }
     }
 
-    private static class VarExchangeVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class VarExchangeVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final  StatementPattern exchangeVar;
         public VarExchangeVisitor(final StatementPattern sp) {
             exchangeVar = sp;
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexer.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexer.java
index d091d32..2a20cc2 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexer.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexer.java
@@ -1,10 +1,3 @@
-package org.apache.rya.indexing;
-
-import org.openrdf.model.Statement;
-import org.openrdf.query.QueryEvaluationException;
-
-import com.vividsolutions.jts.geom.Geometry;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -23,12 +16,15 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing;
 
-
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
 import org.apache.rya.indexing.accumulo.geo.GeoTupleSet.GeoSearchFunctionFactory.NearQuery;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+
+import com.vividsolutions.jts.geom.Geometry;
 
 /**
  * A repository to store, index, and retrieve {@link Statement}s based on geospatial features.
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexingTestUtils.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexingTestUtils.java
index b0c636d..223a9e2 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexingTestUtils.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoIndexingTestUtils.java
@@ -21,7 +21,7 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Utility methods to help test geo indexing methods.
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoRyaSailFactory.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoRyaSailFactory.java
index c53fea1..24cba6a 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoRyaSailFactory.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/GeoRyaSailFactory.java
@@ -48,8 +48,8 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoParseUtils.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoParseUtils.java
index 779a61e..3f8f1e8 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoParseUtils.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoParseUtils.java
@@ -28,13 +28,13 @@
 
 import org.apache.log4j.Logger;
 import org.apache.rya.indexing.GeoConstants;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.xml.sax.SAXException;
 
 import com.vividsolutions.jts.geom.Geometry;
@@ -67,7 +67,7 @@
 	}
 
     public static Literal getLiteral(final Statement statement) throws ParseException {
-        final org.openrdf.model.Value v = statement.getObject();
+        final Value v = statement.getObject();
         if (!(v instanceof Literal)) {
             throw new ParseException("Statement does not contain Literal: " + statement.toString());
         }
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoTupleSet.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoTupleSet.java
index 888c099..87f6a9b 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoTupleSet.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoTupleSet.java
@@ -1,33 +1,3 @@
-package org.apache.rya.indexing.accumulo.geo;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-
-import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.hadoop.conf.Configuration;
-import org.apache.rya.indexing.GeoConstants;
-import org.apache.rya.indexing.GeoIndexer;
-import org.apache.rya.indexing.IndexingExpr;
-import org.apache.rya.indexing.IteratorFactory;
-import org.apache.rya.indexing.SearchFunction;
-import org.apache.rya.indexing.StatementConstraints;
-import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Var;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.io.ParseException;
-import com.vividsolutions.jts.io.WKTReader;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -46,9 +16,36 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.accumulo.geo;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
+import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.rya.indexing.GeoConstants;
+import org.apache.rya.indexing.GeoIndexer;
+import org.apache.rya.indexing.IndexingExpr;
+import org.apache.rya.indexing.IteratorFactory;
+import org.apache.rya.indexing.SearchFunction;
+import org.apache.rya.indexing.StatementConstraints;
+import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Var;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
 
 //Indexing Node for geo expressions to be inserted into execution plan
 //to delegate geo portion of query to geo index
@@ -120,7 +117,7 @@
     public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(final BindingSet bindings)
             throws QueryEvaluationException {
 
-        final URI funcURI = filterInfo.getFunction();
+        final IRI funcURI = filterInfo.getFunction();
         final SearchFunction searchFunction = new GeoSearchFunctionFactory(conf, geoIndexer).getSearchFunction(funcURI);
 
         String queryText;
@@ -170,7 +167,7 @@
 
         Configuration conf;
 
-        private final Map<URI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
+        private final Map<IRI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
 
         private final GeoIndexer geoIndexer;
 
@@ -186,7 +183,7 @@
          * @param searchFunction
          * @return
          */
-        public SearchFunction getSearchFunction(final URI searchFunction) {
+        public SearchFunction getSearchFunction(final IRI searchFunction) {
 
             SearchFunction geoFunc = null;
 
@@ -199,7 +196,7 @@
             return geoFunc;
         }
 
-        private SearchFunction getSearchFunctionInternal(final URI searchFunction) throws QueryEvaluationException {
+        private SearchFunction getSearchFunctionInternal(final IRI searchFunction) throws QueryEvaluationException {
             final SearchFunction sf = SEARCH_FUNCTION_MAP.get(searchFunction);
 
             if (sf != null) {
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/OptionalConfigUtils.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/OptionalConfigUtils.java
index bfd39d0..42331ea 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/OptionalConfigUtils.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/accumulo/geo/OptionalConfigUtils.java
@@ -22,7 +22,6 @@
 import java.util.Set;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
@@ -32,8 +31,7 @@
 import org.apache.rya.indexing.GeoIndexerType;
 import org.apache.rya.indexing.GeoTemporalIndexerType;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.apache.rya.indexing.geotemporal.GeoTemporalOptimizer;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
 import com.google.common.collect.Lists;
 
@@ -60,7 +58,7 @@
     public static final String GEO_PREDICATES_LIST = "sc.geo.predicates";
     public static final String GEO_INDEXER_TYPE = "sc.geo.geo_indexer_type";
 
-    public static Set<URI> getGeoPredicates(final Configuration conf) {
+    public static Set<IRI> getGeoPredicates(final Configuration conf) {
         return getPredicates(conf, GEO_PREDICATES_LIST);
     }
 
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexSetProvider.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexSetProvider.java
index bf12f26..bae2326 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexSetProvider.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexSetProvider.java
@@ -39,13 +39,14 @@
 import org.apache.rya.indexing.geotemporal.model.EventQueryNode;
 import org.apache.rya.indexing.geotemporal.model.EventQueryNode.EventQueryNodeBuilder;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
@@ -55,6 +56,7 @@
  */
 public class GeoTemporalIndexSetProvider implements ExternalSetProvider<EventQueryNode> {
     private static final Logger LOG = Logger.getLogger(GeoTemporalIndexSetProvider.class);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     //organzied by object var.  Each object is a filter, or set of filters
     private Multimap<Var, IndexingExpr> filterMap;
@@ -71,7 +73,7 @@
     private Map<Var, StatementPattern> objectPatterns;
 
 
-    private static URI filterURI;
+    private static IRI filterURI;
 
     private final EventStorage eventStorage;
 
@@ -117,7 +119,7 @@
         for(final StatementPattern sp : patterns) {
             final Var obj = sp.getObjectVar();
 
-            ///filter map does not have -const-
+            ///filter map does not have _const_
 
 
             if(filterMap.containsKey(obj)) {
@@ -211,7 +213,7 @@
     }
 
     private void addFilter(final FunctionCall call) {
-        filterURI = new URIImpl(call.getURI());
+        filterURI = VF.createIRI(call.getURI());
         final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, call.getArgs());
         filterMap.put(objVar, new IndexingExpr(filterURI, objectPatterns.get(objVar), GeoParseUtils.extractArguments(objVar.getName(), call)));
     }
@@ -220,10 +222,10 @@
      * Finds the object/function in a Filter.  If the associated statement pattern
      * has been found, creates the {@link IndexingExpr} and adds it to the map.
      */
-    private class FilterVisitor extends QueryModelVisitorBase<Exception> {
+    private class FilterVisitor extends AbstractQueryModelVisitor<Exception> {
         @Override
         public void meet(final FunctionCall call) throws Exception {
-            filterURI = new URIImpl(call.getURI());
+            filterURI = VF.createIRI(call.getURI());
             final FUNCTION_TYPE type = IndexingFunctionRegistry.getFunctionType(filterURI);
             if(type == FUNCTION_TYPE.GEO || type == FUNCTION_TYPE.TEMPORAL) {
                 final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, call.getArgs());
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
index d74dca6..9db4bd7 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalIndexer.java
@@ -21,9 +21,10 @@
 import org.apache.rya.api.persist.index.RyaSecondaryIndexer;
 import org.apache.rya.indexing.GeoConstants;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * A repository to store, index, and retrieve {@link Statement}s based on geotemporal features.
@@ -88,17 +89,17 @@
          */
         OVERLAPS(GeoConstants.GEO_SF_OVERLAPS);
 
-        private final URI uri;
+        private final IRI uri;
 
-        private GeoPolicy(final URI uri) {
+        private GeoPolicy(final IRI uri) {
             this.uri = uri;
         }
 
-        public URI getURI() {
+        public IRI getURI() {
             return uri;
         }
 
-        public static GeoPolicy fromURI(final URI uri) {
+        public static GeoPolicy fromURI(final IRI uri) {
             for(final GeoPolicy policy : GeoPolicy.values()) {
                 if(policy.getURI().equals(uri)) {
                     return policy;
@@ -109,6 +110,7 @@
     }
 
     static final String TEMPORAL_NS = "tag:rya-rdf.org,2015:temporal#";
+
     /**
      * Used to indicate which temporal filter functions to use in a query.
      */
@@ -116,62 +118,62 @@
         /**
          * The provided instant in time equals the instant the event took place.
          */
-        INSTANT_EQUALS_INSTANT(true, new URIImpl(TEMPORAL_NS+"equals")),
+        INSTANT_EQUALS_INSTANT(true, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"equals")),
 
         /**
          * The provided instant in time was before when the event took place.
          */
-        INSTANT_BEFORE_INSTANT(true, new URIImpl(TEMPORAL_NS+"before")),
+        INSTANT_BEFORE_INSTANT(true, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"before")),
 
         /**
          * The provided instant in time was after when the event took place.
          */
-        INSTANT_AFTER_INSTANT(true, new URIImpl(TEMPORAL_NS+"after")),
+        INSTANT_AFTER_INSTANT(true, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"after")),
 
         /**
          * The provided instant in time was before a time period.
          */
-        INSTANT_BEFORE_INTERVAL(false, new URIImpl(TEMPORAL_NS+"beforeInterval")),
+        INSTANT_BEFORE_INTERVAL(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"beforeInterval")),
 
         /**
          * The provided instant in time took place within a set of time.
          */
-        INSTANT_IN_INTERVAL(false, new URIImpl(TEMPORAL_NS+"insideInterval")),
+        INSTANT_IN_INTERVAL(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"insideInterval")),
 
         /**
          * The provided instant in time took place after a time period.
          */
-        INSTANT_AFTER_INTERVAL(false, new URIImpl(TEMPORAL_NS+"afterInterval")),
+        INSTANT_AFTER_INTERVAL(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"afterInterval")),
 
         /**
          * The provided instant in time equals the start of the interval in which the event took place.
          */
-        INSTANT_START_INTERVAL(false, new URIImpl(TEMPORAL_NS+"hasBeginningInterval")),
+        INSTANT_START_INTERVAL(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"hasBeginningInterval")),
 
         /**
          * The provided instant in time equals the end of the interval in which the event took place.
          */
-        INSTANT_END_INTERVAL(false, new URIImpl(TEMPORAL_NS+"hasEndInterval")),
+        INSTANT_END_INTERVAL(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"hasEndInterval")),
 
         /**
          * The provided interval equals the interval in which the event took place.
          */
-        INTERVAL_EQUALS(false, new URIImpl(TEMPORAL_NS+"intervalEquals")),
+        INTERVAL_EQUALS(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"intervalEquals")),
 
         /**
          * The provided interval is before the interval in which the event took place.
          */
-        INTERVAL_BEFORE(false, new URIImpl(TEMPORAL_NS+"intervalBefore")),
+        INTERVAL_BEFORE(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"intervalBefore")),
 
         /**
          * The provided interval is after the interval in which the event took place.
          */
-        INTERVAL_AFTER(false, new URIImpl(TEMPORAL_NS+"intervalAfter"));
+        INTERVAL_AFTER(false, SimpleValueFactory.getInstance().createIRI(TEMPORAL_NS+"intervalAfter"));
 
         private final boolean isInstant;
-        private final URI uri;
+        private final IRI uri;
 
-        TemporalPolicy(final boolean isInstant, final URI uri) {
+        TemporalPolicy(final boolean isInstant, final IRI uri) {
             this.isInstant = isInstant;
             this.uri = uri;
         }
@@ -180,11 +182,11 @@
             return isInstant;
         }
 
-        public URI getURI() {
+        public IRI getURI() {
             return uri;
         }
 
-        public static TemporalPolicy fromURI(final URI uri) {
+        public static TemporalPolicy fromURI(final IRI uri) {
             for(final TemporalPolicy policy : TemporalPolicy.values()) {
                 if(policy.getURI().equals(uri)) {
                     return policy;
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalToSegmentConverter.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalToSegmentConverter.java
index 22bfdb1..df9dac9 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalToSegmentConverter.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/GeoTemporalToSegmentConverter.java
@@ -28,9 +28,9 @@
 import org.apache.rya.indexing.external.matching.JoinSegment;
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.geotemporal.model.EventQueryNode;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode.java b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode.java
index 104fca8..53d4b74 100644
--- a/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode.java
+++ b/extras/rya.geoindexing/geo.common/src/main/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode.java
@@ -38,24 +38,26 @@
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.indexing.mongodb.update.RyaObjectStorage.ObjectStorageException;
 import org.apache.rya.rdftriplestore.evaluation.ExternalBatchingIterator;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.iterator.CollectionIteration;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.evaluation.iterator.CollectionIteration;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.vividsolutions.jts.geom.Geometry;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class EventQueryNode extends ExternalSet implements ExternalBatchingIterator {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private final Collection<FunctionCall> usedFilters;
     private final Collection<IndexingExpr> geoFilters;
     private final Collection<IndexingExpr> temporalFilters;
@@ -186,7 +188,7 @@
                 final MapBindingSet resultSet = new MapBindingSet();
                 if(event.getGeometry().isPresent()) {
                     final Geometry geo = event.getGeometry().get();
-                    final Value geoValue = ValueFactoryImpl.getInstance().createLiteral(geo.toText());
+                    final Value geoValue = VF.createLiteral(geo.toText());
                     final Var geoObj = geoPattern.getObjectVar();
                     resultSet.addBinding(geoObj.getName(), geoValue);
                 }
@@ -197,9 +199,9 @@
                     DateTime dt = opt.get().getAsDateTime();
                     dt = dt.toDateTime(DateTimeZone.UTC);
                     final String str = dt.toString(TemporalInstantRfc3339.FORMATTER);
-                    temporalValue = ValueFactoryImpl.getInstance().createLiteral(str);
+                    temporalValue = VF.createLiteral(str);
                 } else if(event.getInterval().isPresent()) {
-                    temporalValue = ValueFactoryImpl.getInstance().createLiteral(event.getInterval().get().getAsPair());
+                    temporalValue = VF.createLiteral(event.getInterval().get().getAsPair());
                 } else {
                     temporalValue = null;
                 }
diff --git a/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoMesaGeoIndexer.java b/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoMesaGeoIndexer.java
index b029b02..2771749 100644
--- a/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoMesaGeoIndexer.java
+++ b/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoMesaGeoIndexer.java
@@ -49,6 +49,11 @@
 import org.apache.rya.indexing.StatementSerializer;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.accumulo.geo.GeoTupleSet.GeoSearchFunctionFactory.NearQuery;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.geotools.data.DataStore;
 import org.geotools.data.DataStoreFinder;
 import org.geotools.data.DataUtilities;
@@ -71,16 +76,10 @@
 import org.opengis.filter.Filter;
 import org.opengis.filter.FilterFactory;
 import org.opengis.filter.identity.Identifier;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
 
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.io.ParseException;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * A {@link GeoIndexer} wrapper around a GeoMesa {@link AccumuloDataStore}. This class configures and connects to the Datastore, creates the
  * RDF Feature Type, and interacts with the Datastore.
@@ -136,7 +135,7 @@
     private static final String CONTEXT_ATTRIBUTE = "C";
     private static final String GEOMETRY_ATTRIBUTE = Constants.SF_PROPERTY_GEOMETRY;
 
-    private Set<URI> validPredicates;
+    private Set<IRI> validPredicates;
     private Configuration conf;
     private FeatureStore<SimpleFeatureType, SimpleFeature> featureStore;
     private FeatureSource<SimpleFeatureType, SimpleFeature> featureSource;
@@ -306,7 +305,7 @@
         }
         if (contraints.hasPredicates()) {
             final List<String> predicates = new ArrayList<String>();
-            for (final URI u : contraints.getPredicates()) {
+            for (final IRI u : contraints.getPredicates()) {
                 predicates.add("( " + PREDICATE_ATTRIBUTE + "= '" + u.stringValue() + "') ");
             }
             filterParms.add("(" + StringUtils.join(predicates, " OR ") + ")");
@@ -420,7 +419,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return validPredicates;
     }
 
diff --git a/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/geoExamples/RyaGeoDirectExample.java b/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/geoExamples/RyaGeoDirectExample.java
index 664bbee..37a008b 100644
--- a/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/geoExamples/RyaGeoDirectExample.java
+++ b/extras/rya.geoindexing/geo.geomesa/src/main/java/org/apache/rya/indexing/geoExamples/RyaGeoDirectExample.java
@@ -28,20 +28,20 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 
 public class RyaGeoDirectExample {
 	private static final Logger log = Logger.getLogger(RyaGeoDirectExample.class);
diff --git a/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerSfTest.java b/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerSfTest.java
index 4eba96a..b033b03 100644
--- a/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerSfTest.java
+++ b/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerSfTest.java
@@ -36,6 +36,13 @@
 import org.apache.rya.indexing.GeoIndexerType;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.geotools.geometry.jts.Geometries;
 import org.junit.Assert;
 import org.junit.Before;
@@ -44,14 +51,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
@@ -67,14 +66,14 @@
 import com.vividsolutions.jts.io.ParseException;
 import com.vividsolutions.jts.io.gml2.GMLWriter;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Tests all of the "simple functions" of the geoindexer specific to GML.
  * Parameterized so that each test is run for WKT and for GML.
  */
 @RunWith(value = Parameterized.class)
 public class GeoIndexerSfTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private static AccumuloRdfConfiguration conf;
     private static GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 4326);
     private static GeoMesaGeoIndexer g;
@@ -121,24 +120,24 @@
      * JUnit 4 parameterized iterates thru this list and calls the constructor with each.
      * For each test, Call the constructor three times, for WKT and for GML encoding 1, and GML encoding 2
      */
-    private static final URI USE_JTS_LIB_ENCODING = new URIImpl("uri:useLib") ;
-    private static final URI USE_ROUGH_ENCODING = new URIImpl("uri:useRough") ;
+    private static final IRI USE_JTS_LIB_ENCODING = VF.createIRI("uri:useLib") ;
+    private static final IRI USE_ROUGH_ENCODING = VF.createIRI("uri:useRough") ;
 
     @Parameters
-    public static Collection<URI[]> constructorData() {
-        final URI[][] data = new URI[][] { { GeoConstants.XMLSCHEMA_OGC_WKT, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_ROUGH_ENCODING } };
+    public static Collection<IRI[]> constructorData() {
+        final IRI[][] data = new IRI[][] { { GeoConstants.XMLSCHEMA_OGC_WKT, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_ROUGH_ENCODING } };
         return Arrays.asList(data);
     }
 
-    private final URI schemaToTest;
-    private final URI encodeMethod;
+    private final IRI schemaToTest;
+    private final IRI encodeMethod;
 
     /**
      * Constructor required by JUnit parameterized runner.  See {@link #constructorData()} for constructor values.
-     * @param schemaToTest the schema to test {@link URI}.
-     * @param encodeMethod the encode method {@link URI}.
+     * @param schemaToTest the schema to test {@link IRI}.
+     * @param encodeMethod the encode method {@link IRI}.
      */
-    public GeoIndexerSfTest(final URI schemaToTest, final URI encodeMethod) {
+    public GeoIndexerSfTest(final IRI schemaToTest, final IRI encodeMethod) {
         this.schemaToTest = schemaToTest;
         this.encodeMethod = encodeMethod;
     }
@@ -185,11 +184,11 @@
         g.storeStatement(createRyaStatement(G, schemaToTest, encodeMethod));
     }
 
-    private static RyaStatement createRyaStatement(final Geometry geo, final URI schema, final URI encodingMethod) {
+    private static RyaStatement createRyaStatement(final Geometry geo, final IRI schema, final IRI encodingMethod) {
         return RdfToRyaConversions.convertStatement(genericStatement(geo,schema,encodingMethod));
     }
 
-    private static Statement genericStatement(final Geometry geo, final URI schema, final URI encodingMethod) {
+    private static Statement genericStatement(final Geometry geo, final IRI schema, final IRI encodingMethod) {
         if (schema.equals(GeoConstants.XMLSCHEMA_OGC_WKT)) {
             return genericStatementWkt(geo);
         } else if (schema.equals(GeoConstants.XMLSCHEMA_OGC_GML)) {
@@ -199,17 +198,15 @@
     }
 
     private static Statement genericStatementWkt(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:" + NAMES.get(geo));
-        final URI predicate = GeoConstants.GEO_AS_WKT;
-        final Value object = vf.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return new StatementImpl(subject, predicate, object);
+        final Resource subject = VF.createIRI("uri:" + NAMES.get(geo));
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
+        final Value object = VF.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
+        return VF.createStatement(subject, predicate, object);
     }
 
-    private static Statement genericStatementGml(final Geometry geo, final URI encodingMethod) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:" + NAMES.get(geo));
-        final URI predicate = GeoConstants.GEO_AS_GML;
+    private static Statement genericStatementGml(final Geometry geo, final IRI encodingMethod) {
+        final Resource subject = VF.createIRI("uri:" + NAMES.get(geo));
+        final IRI predicate = GeoConstants.GEO_AS_GML;
 
         final String gml ;
         if (encodingMethod == USE_JTS_LIB_ENCODING) {
@@ -224,8 +221,8 @@
         //        System.out.println("========== GML====");
         }
 
-        final Value object = vf.createLiteral(gml, GeoConstants.XMLSCHEMA_OGC_GML);
-        return new StatementImpl(subject, predicate, object);
+        final Value object = VF.createLiteral(gml, GeoConstants.XMLSCHEMA_OGC_GML);
+        return VF.createStatement(subject, predicate, object);
     }
 
     /**
diff --git a/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerTest.java b/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerTest.java
index 0077c29..d52a3f1 100644
--- a/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerTest.java
+++ b/extras/rya.geoindexing/geo.geomesa/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoIndexerTest.java
@@ -33,14 +33,12 @@
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.collect.Sets;
 import com.vividsolutions.jts.geom.Coordinate;
@@ -95,30 +93,30 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
             final Point point = gf.createPoint(new Coordinate(10, 10));
             final Value pointValue = vf.createLiteral("Point(10 10)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final URI invalidPredicate = GeoConstants.GEO_AS_WKT;
+            final IRI invalidPredicate = GeoConstants.GEO_AS_WKT;
 
             // These should not be stored because they are not in the predicate list
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), invalidPredicate, pointValue)));
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), invalidPredicate, pointValue)));
 
-            final URI pred1 = vf.createURI("pred:1");
-            final URI pred2 = vf.createURI("pred:2");
+            final IRI pred1 = vf.createIRI("pred:1");
+            final IRI pred2 = vf.createIRI("pred:2");
 
             // These should be stored because they are in the predicate list
-            final Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1, pointValue);
-            final Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2, pointValue);
+            final Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1, pointValue);
+            final Statement s4 = vf.createStatement(vf.createIRI("foo:subj4"), pred2, pointValue);
             f.storeStatement(convertStatement(s3));
             f.storeStatement(convertStatement(s4));
 
             // This should not be stored because the object is not valid wkt
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
 
             // This should not be stored because the object is not a literal
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj6"), pred1, vf.createURI("p:Point(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj6"), pred1, vf.createIRI("p:Point(10 10)"))));
 
             f.flush();
 
@@ -134,13 +132,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -178,13 +176,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -207,13 +205,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -246,13 +244,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -265,7 +263,7 @@
 
             // query with wrong context
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
         }
     }
 
@@ -275,13 +273,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -293,7 +291,7 @@
             Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(subject))));
 
             // query with wrong subject
-            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -303,13 +301,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -323,10 +321,10 @@
 
             // query with wrong context
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
 
             // query with wrong subject
-            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -336,13 +334,13 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -356,7 +354,7 @@
 
             // query with wrong predicate
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createURI("other:pred"))))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createIRI("other:pred"))))));
         }
     }
 
@@ -366,19 +364,19 @@
         try (final GeoMesaGeoIndexer f = new GeoMesaGeoIndexer()) {
             f.setConf(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource context = vf.createURI("foo:context");
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource context = vf.createIRI("foo:context");
 
-            final Resource subjectEast = vf.createURI("foo:subj:east");
-            final URI predicateEast = GeoConstants.GEO_AS_WKT;
+            final Resource subjectEast = vf.createIRI("foo:subj:east");
+            final IRI predicateEast = GeoConstants.GEO_AS_WKT;
             final Value objectEast = vf.createLiteral("Point(179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementEast = new ContextStatementImpl(subjectEast, predicateEast, objectEast, context);
+            final Statement statementEast = vf.createStatement(subjectEast, predicateEast, objectEast, context);
             f.storeStatement(convertStatement(statementEast));
 
-            final Resource subjectWest = vf.createURI("foo:subj:west");
-            final URI predicateWest = GeoConstants.GEO_AS_WKT;
+            final Resource subjectWest = vf.createIRI("foo:subj:west");
+            final IRI predicateWest = GeoConstants.GEO_AS_WKT;
             final Value objectWest = vf.createLiteral("Point(-179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementWest = new ContextStatementImpl(subjectWest, predicateWest, objectWest, context);
+            final Statement statementWest = vf.createStatement(subjectWest, predicateWest, objectWest, context);
             f.storeStatement(convertStatement(statementWest));
 
             f.flush();
diff --git a/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoWaveGeoIndexer.java b/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoWaveGeoIndexer.java
index 0a4e767..8684d11 100644
--- a/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoWaveGeoIndexer.java
+++ b/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/accumulo/geo/GeoWaveGeoIndexer.java
@@ -51,6 +51,11 @@
 import org.apache.rya.indexing.StatementSerializer;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.accumulo.geo.GeoTupleSet.GeoSearchFunctionFactory.NearQuery;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 import org.geotools.data.DataStore;
 import org.geotools.data.DataUtilities;
 import org.geotools.data.FeatureSource;
@@ -67,15 +72,10 @@
 import org.opengis.filter.Filter;
 import org.opengis.filter.FilterFactory;
 import org.opengis.filter.identity.Identifier;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.QueryEvaluationException;
 
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.io.ParseException;
 
-import info.aduna.iteration.CloseableIteration;
 import mil.nga.giat.geowave.adapter.vector.FeatureDataAdapter;
 import mil.nga.giat.geowave.adapter.vector.plugin.GeoWaveGTDataStore;
 import mil.nga.giat.geowave.adapter.vector.plugin.GeoWaveGTDataStoreFactory;
@@ -147,7 +147,7 @@
     private static final String GEO_ID_ATTRIBUTE = "geo_id";
     private static final String GEOMETRY_ATTRIBUTE = "geowave_index_geometry";
 
-    private Set<URI> validPredicates;
+    private Set<IRI> validPredicates;
     private Configuration conf;
     private FeatureStore<SimpleFeatureType, SimpleFeature> featureStore;
     private FeatureSource<SimpleFeatureType, SimpleFeature> featureSource;
@@ -367,7 +367,7 @@
         }
         if (contraints.hasPredicates()) {
             final List<String> predicates = new ArrayList<String>();
-            for (final URI u : contraints.getPredicates()) {
+            for (final IRI u : contraints.getPredicates()) {
                 predicates.add("( " + PREDICATE_ATTRIBUTE + "= '" + u.stringValue() + "') ");
             }
             filterParms.add("(" + StringUtils.join(predicates, " OR ") + ")");
@@ -488,7 +488,7 @@
     }
 
     @Override
-    public Set<URI> getIndexablePredicates() {
+    public Set<IRI> getIndexablePredicates() {
         return validPredicates;
     }
 
diff --git a/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/geoExamples/GeowaveDirectExample.java b/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/geoExamples/GeowaveDirectExample.java
index 33a4bec..9242b3c 100644
--- a/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/geoExamples/GeowaveDirectExample.java
+++ b/extras/rya.geoindexing/geo.geowave/src/main/java/org/apache/rya/indexing/geoExamples/GeowaveDirectExample.java
@@ -29,20 +29,20 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig;
 import org.apache.rya.indexing.external.PrecomputedJoinIndexerConfig.PrecomputedJoinStorageType;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 
 public class GeowaveDirectExample {
 	private static final Logger log = Logger.getLogger(GeowaveDirectExample.class);
diff --git a/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerSfTest.java b/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerSfTest.java
index 0cf2544..10f6a13 100644
--- a/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerSfTest.java
+++ b/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerSfTest.java
@@ -43,6 +43,13 @@
 import org.apache.rya.indexing.GeoIndexerType;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.geotools.geometry.jts.Geometries;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -52,14 +59,6 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
@@ -76,7 +75,6 @@
 import com.vividsolutions.jts.io.ParseException;
 import com.vividsolutions.jts.io.gml2.GMLWriter;
 
-import info.aduna.iteration.CloseableIteration;
 import mil.nga.giat.geowave.datastore.accumulo.minicluster.MiniAccumuloClusterFactory;
 
 /**
@@ -85,6 +83,8 @@
  */
 @RunWith(value = Parameterized.class)
 public class GeoWaveIndexerSfTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private static AccumuloRdfConfiguration conf;
     private static GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 4326);
     private static GeoWaveGeoIndexer g;
@@ -139,24 +139,24 @@
      * JUnit 4 parameterized iterates thru this list and calls the constructor with each.
      * For each test, Call the constructor three times, for WKT and for GML encoding 1, and GML encoding 2
      */
-    private static final URI USE_JTS_LIB_ENCODING = new URIImpl("uri:useLib") ;
-    private static final URI USE_ROUGH_ENCODING = new URIImpl("uri:useRough") ;
+    private static final IRI USE_JTS_LIB_ENCODING = VF.createIRI("uri:useLib") ;
+    private static final IRI USE_ROUGH_ENCODING = VF.createIRI("uri:useRough") ;
 
     @Parameters
-    public static Collection<URI[]> constructorData() {
-        final URI[][] data = new URI[][] { { GeoConstants.XMLSCHEMA_OGC_WKT, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING } };
+    public static Collection<IRI[]> constructorData() {
+        final IRI[][] data = new IRI[][] { { GeoConstants.XMLSCHEMA_OGC_WKT, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING }, { GeoConstants.XMLSCHEMA_OGC_GML, USE_JTS_LIB_ENCODING } };
         return Arrays.asList(data);
     }
 
-    private final URI schemaToTest;
-    private final URI encodeMethod;
+    private final IRI schemaToTest;
+    private final IRI encodeMethod;
 
     /**
      * Constructor required by JUnit parameterized runner.  See {@link #constructorData()} for constructor values.
-     * @param schemaToTest the schema to test {@link URI}.
-     * @param encodeMethod the encode method {@link URI}.
+     * @param schemaToTest the schema to test {@link IRI}.
+     * @param encodeMethod the encode method {@link IRI}.
      */
-    public GeoWaveIndexerSfTest(final URI schemaToTest, final URI encodeMethod) {
+    public GeoWaveIndexerSfTest(final IRI schemaToTest, final IRI encodeMethod) {
         this.schemaToTest = schemaToTest;
         this.encodeMethod = encodeMethod;
     }
@@ -228,11 +228,11 @@
         g.storeStatement(createRyaStatement(G, schemaToTest, encodeMethod));
     }
 
-    private static RyaStatement createRyaStatement(final Geometry geo, final URI schema, final URI encodingMethod) {
+    private static RyaStatement createRyaStatement(final Geometry geo, final IRI schema, final IRI encodingMethod) {
         return RdfToRyaConversions.convertStatement(genericStatement(geo,schema,encodingMethod));
     }
 
-    private static Statement genericStatement(final Geometry geo, final URI schema, final URI encodingMethod) {
+    private static Statement genericStatement(final Geometry geo, final IRI schema, final IRI encodingMethod) {
         if (schema.equals(GeoConstants.XMLSCHEMA_OGC_WKT)) {
             return genericStatementWkt(geo);
         } else if (schema.equals(GeoConstants.XMLSCHEMA_OGC_GML)) {
@@ -242,17 +242,15 @@
     }
 
     private static Statement genericStatementWkt(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:" + NAMES.get(geo));
-        final URI predicate = GeoConstants.GEO_AS_WKT;
-        final Value object = vf.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return new StatementImpl(subject, predicate, object);
+        final Resource subject = VF.createIRI("uri:" + NAMES.get(geo));
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
+        final Value object = VF.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
+        return VF.createStatement(subject, predicate, object);
     }
 
-    private static Statement genericStatementGml(final Geometry geo, final URI encodingMethod) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:" + NAMES.get(geo));
-        final URI predicate = GeoConstants.GEO_AS_GML;
+    private static Statement genericStatementGml(final Geometry geo, final IRI encodingMethod) {
+        final Resource subject = VF.createIRI("uri:" + NAMES.get(geo));
+        final IRI predicate = GeoConstants.GEO_AS_GML;
 
         final String gml ;
         if (encodingMethod == USE_JTS_LIB_ENCODING) {
@@ -267,8 +265,8 @@
         //        System.out.println("========== GML====");
         }
 
-        final Value object = vf.createLiteral(gml, GeoConstants.XMLSCHEMA_OGC_GML);
-        return new StatementImpl(subject, predicate, object);
+        final Value object = VF.createLiteral(gml, GeoConstants.XMLSCHEMA_OGC_GML);
+        return VF.createStatement(subject, predicate, object);
     }
 
     /**
diff --git a/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerTest.java b/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerTest.java
index 1930a50..c590e2f 100644
--- a/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerTest.java
+++ b/extras/rya.geoindexing/geo.geowave/src/test/java/org/apache/rya/indexing/accumulo/geo/GeoWaveIndexerTest.java
@@ -37,19 +37,17 @@
 import org.apache.rya.indexing.GeoIndexerType;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.Sets;
 import com.google.common.io.Files;
@@ -140,30 +138,30 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
             final Point point = gf.createPoint(new Coordinate(10, 10));
             final Value pointValue = vf.createLiteral("Point(10 10)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final URI invalidPredicate = GeoConstants.GEO_AS_WKT;
+            final IRI invalidPredicate = GeoConstants.GEO_AS_WKT;
 
             // These should not be stored because they are not in the predicate list
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), invalidPredicate, pointValue)));
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), invalidPredicate, pointValue)));
 
-            final URI pred1 = vf.createURI("pred:1");
-            final URI pred2 = vf.createURI("pred:2");
+            final IRI pred1 = vf.createIRI("pred:1");
+            final IRI pred2 = vf.createIRI("pred:2");
 
             // These should be stored because they are in the predicate list
-            final Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1, pointValue);
-            final Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2, pointValue);
+            final Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1, pointValue);
+            final Statement s4 = vf.createStatement(vf.createIRI("foo:subj4"), pred2, pointValue);
             f.storeStatement(convertStatement(s3));
             f.storeStatement(convertStatement(s4));
 
             // This should not be stored because the object is not valid wkt
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
 
             // This should not be stored because the object is not a literal
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj6"), pred1, vf.createURI("p:Point(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj6"), pred1, vf.createIRI("p:Point(10 10)"))));
 
             f.flush();
 
@@ -180,13 +178,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -225,13 +223,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -255,13 +253,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -294,13 +292,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -313,7 +311,7 @@
 
             // query with wrong context
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
         }
     }
 
@@ -324,13 +322,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -342,7 +340,7 @@
             Assert.assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(subject))));
 
             // query with wrong subject
-            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -353,13 +351,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -373,10 +371,10 @@
 
             // query with wrong context
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
 
             // query with wrong subject
-            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            Assert.assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -387,13 +385,13 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -407,7 +405,7 @@
 
             // query with wrong predicate
             Assert.assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createURI("other:pred"))))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createIRI("other:pred"))))));
         }
     }
 
@@ -418,19 +416,19 @@
             f.setConf(conf);
             f.purge(conf);
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource context = vf.createURI("foo:context");
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource context = vf.createIRI("foo:context");
 
-            final Resource subjectEast = vf.createURI("foo:subj:east");
-            final URI predicateEast = GeoConstants.GEO_AS_WKT;
+            final Resource subjectEast = vf.createIRI("foo:subj:east");
+            final IRI predicateEast = GeoConstants.GEO_AS_WKT;
             final Value objectEast = vf.createLiteral("Point(179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementEast = new ContextStatementImpl(subjectEast, predicateEast, objectEast, context);
+            final Statement statementEast = vf.createStatement(subjectEast, predicateEast, objectEast, context);
             f.storeStatement(convertStatement(statementEast));
 
-            final Resource subjectWest = vf.createURI("foo:subj:west");
-            final URI predicateWest = GeoConstants.GEO_AS_WKT;
+            final Resource subjectWest = vf.createIRI("foo:subj:west");
+            final IRI predicateWest = GeoConstants.GEO_AS_WKT;
             final Value objectWest = vf.createLiteral("Point(-179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementWest = new ContextStatementImpl(subjectWest, predicateWest, objectWest, context);
+            final Statement statementWest = vf.createStatement(subjectWest, predicateWest, objectWest, context);
             f.storeStatement(convertStatement(statementWest));
 
             f.flush();
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geoExamples/RyaMongoGeoDirectExample.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geoExamples/RyaMongoGeoDirectExample.java
index 04488bb..bed432d 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geoExamples/RyaMongoGeoDirectExample.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geoExamples/RyaMongoGeoDirectExample.java
@@ -30,18 +30,18 @@
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration.MongoDBIndexingConfigBuilder;
 import org.apache.rya.mongodb.EmbeddedMongoFactory;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 
 import com.mongodb.MongoClient;
 import com.mongodb.ServerAddress;
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategy.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategy.java
index 5db432b..54bb90c 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategy.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategy.java
@@ -48,10 +48,10 @@
 import org.apache.rya.indexing.mongodb.geo.GmlParser;
 import org.apache.rya.indexing.mongodb.temporal.TemporalMongoDBStorageStrategy;
 import org.joda.time.DateTime;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.BasicDBObjectBuilder;
@@ -116,7 +116,7 @@
     @Override
     public DBObject serialize(final RyaStatement ryaStatement) {
         final BasicDBObjectBuilder builder = BasicDBObjectBuilder.start("_id", ryaStatement.getSubject().hashCode());
-        final URI obj = ryaStatement.getObject().getDataType();
+        final IRI obj = ryaStatement.getObject().getDataType();
 
 
         if(obj.equals(GeoConstants.GEO_AS_WKT) || obj.equals(GeoConstants.GEO_AS_GML) ||
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexer.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexer.java
index ce6d653..bc836bd 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexer.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexer.java
@@ -46,8 +46,8 @@
 import org.apache.rya.indexing.mongodb.geo.GmlParser;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.joda.time.DateTime;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
 
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.io.ParseException;
@@ -126,7 +126,7 @@
                 }
 
                 final Event currentEvent = updated.build();
-                final URI pred = statement.getObject().getDataType();
+                final IRI pred = statement.getObject().getDataType();
                 if((pred.equals(GeoConstants.GEO_AS_WKT) || pred.equals(GeoConstants.GEO_AS_GML) ||
                    pred.equals(GeoConstants.XMLSCHEMA_OGC_WKT) || pred.equals(GeoConstants.XMLSCHEMA_OGC_GML))
                    && currentEvent.getGeometry().isPresent()) {
@@ -174,7 +174,7 @@
                 updated = Event.builder(old.get());
             }
 
-            final URI pred = statement.getObject().getDataType();
+            final IRI pred = statement.getObject().getDataType();
             if(pred.equals(GeoConstants.GEO_AS_WKT) || pred.equals(GeoConstants.GEO_AS_GML) ||
                pred.equals(GeoConstants.XMLSCHEMA_OGC_WKT) || pred.equals(GeoConstants.XMLSCHEMA_OGC_GML)) {
                 //is geo
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/GeoMongoDBStorageStrategy.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/GeoMongoDBStorageStrategy.java
index 634359f..0043e04 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/GeoMongoDBStorageStrategy.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/GeoMongoDBStorageStrategy.java
@@ -28,8 +28,8 @@
 import org.apache.rya.indexing.accumulo.geo.GeoParseUtils;
 import org.apache.rya.indexing.mongodb.IndexingMongoDBStorageStrategy;
 import org.bson.Document;
-import org.openrdf.model.Statement;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import com.mongodb.BasicDBObject;
 import com.mongodb.BasicDBObjectBuilder;
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoIndexer.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoIndexer.java
index 2abee76..9c23b51 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoIndexer.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoIndexer.java
@@ -31,15 +31,14 @@
 import org.apache.rya.indexing.mongodb.AbstractMongoIndexer;
 import org.apache.rya.indexing.mongodb.geo.GeoMongoDBStorageStrategy.GeoQuery;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.openrdf.model.Statement;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 import com.mongodb.DBObject;
 import com.vividsolutions.jts.geom.Geometry;
 
-import info.aduna.iteration.CloseableIteration;
-
 public class MongoGeoIndexer extends AbstractMongoIndexer<GeoMongoDBStorageStrategy> implements GeoIndexer {
     private static final String COLLECTION_SUFFIX = "geo";
     private static final Logger logger = Logger.getLogger(MongoGeoIndexer.class);
diff --git a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoTupleSet.java b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoTupleSet.java
index c564d02..7ec141d 100644
--- a/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoTupleSet.java
+++ b/extras/rya.geoindexing/geo.mongo/src/main/java/org/apache/rya/indexing/mongodb/geo/MongoGeoTupleSet.java
@@ -1,21 +1,3 @@
-package org.apache.rya.indexing.mongodb.geo;
-
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.hadoop.conf.Configuration;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Maps;
-import com.vividsolutions.jts.geom.Geometry;
-import com.vividsolutions.jts.io.ParseException;
-import com.vividsolutions.jts.io.WKTReader;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -34,9 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.mongodb.geo;
 
+import java.util.Map;
+import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.rya.indexing.GeoConstants;
 import org.apache.rya.indexing.GeoIndexer;
 import org.apache.rya.indexing.IndexingExpr;
@@ -45,6 +30,18 @@
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.geo.GeoTupleSet;
 import org.apache.rya.indexing.external.tupleSet.ExternalTupleSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Maps;
+import com.vividsolutions.jts.geom.Geometry;
+import com.vividsolutions.jts.io.ParseException;
+import com.vividsolutions.jts.io.WKTReader;
 
 public class MongoGeoTupleSet extends ExternalTupleSet {
 
@@ -114,7 +111,7 @@
             throws QueryEvaluationException {
         
       
-        URI funcURI = filterInfo.getFunction();
+        IRI funcURI = filterInfo.getFunction();
         SearchFunction searchFunction = (new MongoGeoSearchFunctionFactory(conf)).getSearchFunction(funcURI);
         if(filterInfo.getArguments().length > 1) {
             throw new IllegalArgumentException("Index functions do not support more than two arguments.");
@@ -133,7 +130,7 @@
         
         Configuration conf;
         
-        private final Map<URI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
+        private final Map<IRI, SearchFunction> SEARCH_FUNCTION_MAP = Maps.newHashMap();
 
         public MongoGeoSearchFunctionFactory(Configuration conf) {
             this.conf = conf;
@@ -146,7 +143,7 @@
          * @param searchFunction
          * @return
          */
-        public SearchFunction getSearchFunction(final URI searchFunction) {
+        public SearchFunction getSearchFunction(final IRI searchFunction) {
 
             SearchFunction geoFunc = null;
 
@@ -159,7 +156,7 @@
             return geoFunc;
         }
 
-        private SearchFunction getSearchFunctionInternal(final URI searchFunction) throws QueryEvaluationException {
+        private SearchFunction getSearchFunctionInternal(final IRI searchFunction) throws QueryEvaluationException {
             SearchFunction sf = SEARCH_FUNCTION_MAP.get(searchFunction);
 
             if (sf != null) {
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
index 9f60e2e..d5b6e79 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalProviderTest.java
@@ -31,10 +31,10 @@
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 public class GeoTemporalProviderTest {
     private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
@@ -51,10 +51,10 @@
      */
     @Test
     public void twoPatternsTwoFilters_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -72,10 +72,10 @@
 
     @Test
     public void onePatternTwoFilters_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -92,10 +92,10 @@
 
     @Test
     public void twoPatternsOneFilter_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -112,8 +112,8 @@
 
     @Test
     public void twoPatternsNoFilter_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -129,10 +129,10 @@
 
     @Test
     public void twoPatternsTwoFiltersNotValid_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         //Only handles geo and temporal filters
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
@@ -151,10 +151,10 @@
 
     @Test
     public void twoSubjOneFilter_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -174,10 +174,10 @@
 
     @Test
     public void twoNode_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
@@ -199,10 +199,10 @@
 
     @Test
     public void twoSubjectMultiFilter_test() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Value geo = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         final Value temp = vf.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
-        final URI tempPred = vf.createURI(URI_PROPERTY_AT_TIME);
+        final IRI tempPred = vf.createIRI(URI_PROPERTY_AT_TIME);
         final String query =
             "PREFIX geo: <http://www.opengis.net/ont/geosparql#>" +
             "PREFIX geos: <http://www.opengis.net/def/function/geosparql/>" +
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
index 51b2ba0..a5411d0 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/GeoTemporalTestUtils.java
@@ -27,14 +27,14 @@
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.external.matching.QuerySegment;
 import org.apache.rya.indexing.geotemporal.model.EventQueryNode;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.ComparisonFailure;
 import org.mockito.Mockito;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.GeometryFactory;
@@ -112,7 +112,7 @@
         return collector.getTupleExpr();
     }
 
-    private static class NodeCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class NodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
         private final List<QueryModelNode> stPatterns = new ArrayList<>();
 
         public List<QueryModelNode> getTupleExpr() {
@@ -130,7 +130,7 @@
         }
     }
 
-    private static class FunctionCallCollector extends QueryModelVisitorBase<RuntimeException> {
+    private static class FunctionCallCollector extends AbstractQueryModelVisitor<RuntimeException> {
         private final List<FunctionCall> filters = new ArrayList<>();
 
         public List<FunctionCall> getTupleExpr() {
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
index d629d04..316117b 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/MongoGeoTemporalIndexIT.java
@@ -37,23 +37,23 @@
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 public class MongoGeoTemporalIndexIT extends MongoITBase {
     private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
 
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     public void updateConfiguration(final MongoDBRdfConfiguration conf) {
@@ -162,19 +162,20 @@
     }
 
     private void addStatements(final SailRepositoryConnection conn) throws Exception {
-        URI subject = VF.createURI("urn:event1");
-        final URI predicate = VF.createURI(URI_PROPERTY_AT_TIME);
+        IRI subject = VF.createIRI("urn:event1");
+        final IRI predicate = VF.createIRI(URI_PROPERTY_AT_TIME);
         Value object = VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
         conn.add(VF.createStatement(subject, predicate, object));
 
         object = VF.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
         conn.add(VF.createStatement(subject, GeoConstants.GEO_AS_WKT, object));
 
-        subject = VF.createURI("urn:event2");
+        subject = VF.createIRI("urn:event2");
         object = VF.createLiteral(new TemporalInstantRfc3339(2015, 12, 30, 12, 00, 0).toString());
         conn.add(VF.createStatement(subject, predicate, object));
 
         object = VF.createLiteral("Point(1 1)", GeoConstants.XMLSCHEMA_OGC_WKT);
         conn.add(VF.createStatement(subject, GeoConstants.GEO_AS_WKT, object));
+        conn.commit();
     }
 }
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
index 9875091..cfcb513 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/model/EventQueryNode2IT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -18,6 +18,7 @@
  */
 package org.apache.rya.indexing.geotemporal.model;
 
+import static org.apache.rya.api.domain.VarNameUtils.prependConstant;
 import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getFilters;
 import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps;
 import static org.junit.Assert.assertEquals;
@@ -26,6 +27,7 @@
 import static org.mockito.Mockito.mock;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.rya.api.domain.RyaURI;
@@ -37,44 +39,42 @@
 import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.Geometry;
 import com.vividsolutions.jts.geom.GeometryFactory;
 import com.vividsolutions.jts.geom.PrecisionModel;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Integration tests the methods of {@link EventQueryNode}.
  */
 public class EventQueryNode2IT extends MongoITBase {
     private static final GeometryFactory GF = new GeometryFactory(new PrecisionModel(), 4326);
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test(expected = IllegalStateException.class)
     public void constructor_differentSubjects() throws Exception {
         final Var geoSubj = new Var("point");
-        final Var geoPred = new Var("-const-http://www.opengis.net/ont/geosparql#asWKT", ValueFactoryImpl.getInstance().createURI("http://www.opengis.net/ont/geosparql#asWKT"));
+        final Var geoPred = new Var(prependConstant("http://www.opengis.net/ont/geosparql#asWKT"), VF.createIRI("http://www.opengis.net/ont/geosparql#asWKT"));
         final Var geoObj = new Var("wkt");
         final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj);
 
         final Var timeSubj = new Var("time");
-        final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime"));
+        final Var timePred = new Var(prependConstant("http://www.w3.org/2006/time#inXSDDateTime"), VF.createIRI(prependConstant("http://www.w3.org/2006/time#inXSDDateTime")));
         final Var timeObj = new Var("time");
         final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj);
         // This will fail.
@@ -97,7 +97,7 @@
         final StatementPattern geoSP = new StatementPattern(geoSubj, geoPred, geoObj);
 
         final Var timeSubj = new Var("time");
-        final Var timePred = new Var("-const-http://www.w3.org/2006/time#inXSDDateTime", ValueFactoryImpl.getInstance().createURI("-const-http://www.w3.org/2006/time#inXSDDateTime"));
+        final Var timePred = new Var(prependConstant("http://www.w3.org/2006/time#inXSDDateTime"), VF.createIRI(prependConstant("http://www.w3.org/2006/time#inXSDDateTime")));
         final Var timeObj = new Var("time");
         final StatementPattern timeSP = new StatementPattern(timeSubj, timePred, timeObj);
         // This will fail.
@@ -252,7 +252,7 @@
 
         final EventQueryNode node = buildNode(storage, query);
         final MapBindingSet existingBindings = new MapBindingSet();
-        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
+        existingBindings.addBinding("event", VF.createIRI("urn:event-2222"));
         final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings);
         final MapBindingSet expected = new MapBindingSet();
         expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
@@ -304,7 +304,7 @@
 
         final EventQueryNode node = buildNode(storage, query);
         final MapBindingSet existingBindings = new MapBindingSet();
-        existingBindings.addBinding("event", VF.createURI("urn:event-2222"));
+        existingBindings.addBinding("event", VF.createIRI("urn:event-2222"));
         final CloseableIteration<BindingSet, QueryEvaluationException> rez = node.evaluate(existingBindings);
         final MapBindingSet expected = new MapBindingSet();
         expected.addBinding("wkt", VF.createLiteral("POINT (-1 -1)"));
@@ -313,15 +313,16 @@
         assertFalse(rez.hasNext());
     }
 
-    private EventQueryNode buildNode(final EventStorage store, final String query) throws Exception {
+    private static EventQueryNode buildNode(final EventStorage store, final String query) throws Exception {
         final List<IndexingExpr> geoFilters = new ArrayList<>();
         final List<IndexingExpr> temporalFilters = new ArrayList<>();
         final List<StatementPattern> sps = getSps(query);
         final List<FunctionCall> filters = getFilters(query);
         for(final FunctionCall filter : filters) {
-            final URI filterURI = new URIImpl(filter.getURI());
+            final IRI filterURI = VF.createIRI(filter.getURI());
             final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs());
-            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter));
+            final Value[] arguments = extractArguments(objVar.getName(), filter);
+            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), Arrays.stream(arguments).toArray());
             if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) {
                 geoFilters.add(expr);
             } else {
@@ -342,7 +343,7 @@
             .build();
     }
 
-    private Value[] extractArguments(final String matchName, final FunctionCall call) {
+    private static Value[] extractArguments(final String matchName, final FunctionCall call) {
         final Value args[] = new Value[call.getArgs().size() - 1];
         int argI = 0;
         for (int i = 0; i != call.getArgs().size(); ++i) {
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
index 125a2e4..f18b1da 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/GeoTemporalMongoDBStorageStrategyTest.java
@@ -23,6 +23,7 @@
 import static org.apache.rya.indexing.geotemporal.GeoTemporalTestUtils.getSps;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.apache.rya.api.resolver.RdfToRyaConversions;
@@ -32,21 +33,19 @@
 import org.apache.rya.indexing.IndexingFunctionRegistry.FUNCTION_TYPE;
 import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.GeoPolicy;
 import org.apache.rya.indexing.geotemporal.GeoTemporalIndexer.TemporalPolicy;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
 
 import com.mongodb.DBObject;
 import com.mongodb.util.JSON;
@@ -60,6 +59,8 @@
  * @see GeoPolicy Geo Filter Functions
  */
 public class GeoTemporalMongoDBStorageStrategyTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private GeoTemporalMongoDBStorageStrategy adapter;
     @Before
     public void setup() {
@@ -92,8 +93,9 @@
         final List<FunctionCall> filters = getFilters(query);
         for(final FunctionCall filter : filters) {
             //should only be one.
-            final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(new URIImpl(filter.getURI()), filter.getArgs());
-            final IndexingExpr expr = new IndexingExpr(new URIImpl(filter.getURI()), sps.get(0), extractArguments(objVar.getName(), filter));
+            final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(VF.createIRI(filter.getURI()), filter.getArgs());
+            final Value[] arguments = extractArguments(objVar.getName(), filter);
+            final IndexingExpr expr = new IndexingExpr(VF.createIRI(filter.getURI()), sps.get(0), Arrays.stream(arguments).toArray());
             geoFilters.add(expr);
         }
         final List<IndexingExpr> temporalFilters = new ArrayList<>();
@@ -134,8 +136,9 @@
               final List<StatementPattern> sps = getSps(query);
               final List<FunctionCall> filters = getFilters(query);
               for(final FunctionCall filter : filters) {
-                  final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(new URIImpl(filter.getURI()), filter.getArgs());
-                  final IndexingExpr expr = new IndexingExpr(new URIImpl(filter.getURI()), sps.get(0), extractArguments(objVar.getName(), filter));
+                  final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(VF.createIRI(filter.getURI()), filter.getArgs());
+                  final Value[] arguments = extractArguments(objVar.getName(), filter);
+                  final IndexingExpr expr = new IndexingExpr(VF.createIRI(filter.getURI()), sps.get(0), Arrays.stream(arguments).toArray());
                   geoFilters.add(expr);
               }
               final List<IndexingExpr> temporalFilters = new ArrayList<>();
@@ -178,8 +181,9 @@
         final List<FunctionCall> filters = getFilters(query);
         for(final FunctionCall filter : filters) {
             //should only be one.
-            final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(new URIImpl(filter.getURI()), filter.getArgs());
-            final IndexingExpr expr = new IndexingExpr(new URIImpl(filter.getURI()), sps.get(0), extractArguments(objVar.getName(), filter));
+            final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(VF.createIRI(filter.getURI()), filter.getArgs());
+            final Value[] arguments = extractArguments(objVar.getName(), filter);
+            final IndexingExpr expr = new IndexingExpr(VF.createIRI(filter.getURI()), sps.get(0), Arrays.stream(arguments).toArray());
             temporalFilters.add(expr);
         }
         final DBObject actual = adapter.getFilterQuery(geoFilters, temporalFilters);
@@ -209,8 +213,9 @@
               final List<StatementPattern> sps = getSps(query);
               final List<FunctionCall> filters = getFilters(query);
               for(final FunctionCall filter : filters) {
-                  final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(new URIImpl(filter.getURI()), filter.getArgs());
-                  final IndexingExpr expr = new IndexingExpr(new URIImpl(filter.getURI()), sps.get(0), extractArguments(objVar.getName(), filter));
+                  final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(VF.createIRI(filter.getURI()), filter.getArgs());
+                  final Value[] arguments = extractArguments(objVar.getName(), filter);
+                  final IndexingExpr expr = new IndexingExpr(VF.createIRI(filter.getURI()), sps.get(0), Arrays.stream(arguments).toArray());
                   temporalFilters.add(expr);
               }
               final DBObject actual = adapter.getFilterQuery(geoFilters, temporalFilters);
@@ -255,9 +260,10 @@
               final List<StatementPattern> sps = getSps(query);
               final List<FunctionCall> filters = getFilters(query);
               for(final FunctionCall filter : filters) {
-                  final URI filterURI = new URIImpl(filter.getURI());
+                  final IRI filterURI = VF.createIRI(filter.getURI());
                   final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs());
-                  final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter));
+                  final Value[] arguments = extractArguments(objVar.getName(), filter);
+                  final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), Arrays.stream(arguments).toArray());
                   if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) {
                       geoFilters.add(expr);
                   } else {
@@ -309,9 +315,10 @@
               final List<StatementPattern> sps = getSps(query);
               final List<FunctionCall> filters = getFilters(query);
               for(final FunctionCall filter : filters) {
-                  final URI filterURI = new URIImpl(filter.getURI());
+                  final IRI filterURI = VF.createIRI(filter.getURI());
                   final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs());
-                  final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter));
+                  final Value[] arguments = extractArguments(objVar.getName(), filter);
+                  final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), Arrays.stream(arguments).toArray());
                   if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) {
                       geoFilters.add(expr);
                   } else {
@@ -375,9 +382,10 @@
         final List<StatementPattern> sps = getSps(query);
         final List<FunctionCall> filters = getFilters(query);
         for(final FunctionCall filter : filters) {
-            final URI filterURI = new URIImpl(filter.getURI());
+            final IRI filterURI = VF.createIRI(filter.getURI());
             final Var objVar = IndexingFunctionRegistry.getResultVarFromFunctionCall(filterURI, filter.getArgs());
-            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), extractArguments(objVar.getName(), filter));
+            final Value[] arguments = extractArguments(objVar.getName(), filter);
+            final IndexingExpr expr = new IndexingExpr(filterURI, sps.get(0), Arrays.stream(arguments).toArray());
             if(IndexingFunctionRegistry.getFunctionType(filterURI) == FUNCTION_TYPE.GEO) {
                 geoFilters.add(expr);
              } else {
@@ -412,15 +420,14 @@
 
     @Test
     public void serializeTest() {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("foo:subj");
-        final Resource context = vf.createURI("foo:context");
+        final Resource subject = VF.createIRI("foo:subj");
+        final Resource context = VF.createIRI("foo:context");
 
         //GEO
-        URI predicate = GeoConstants.GEO_AS_WKT;
-        Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
+        IRI predicate = GeoConstants.GEO_AS_WKT;
+        Value object = VF.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
 
-        Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+        Statement statement = VF.createStatement(subject, predicate, object, context);
         DBObject actual = adapter.serialize(RdfToRyaConversions.convertStatement(statement));
         String expectedString =
             "{ "
@@ -434,9 +441,9 @@
         assertEqualMongo(expected, actual);
 
         //TIME INSTANT
-        predicate = new URIImpl("Property:event:time");
-        object = vf.createLiteral("2015-12-30T12:00:00Z");
-        statement = new ContextStatementImpl(subject, predicate, object, context);
+        predicate = VF.createIRI("Property:event:time");
+        object = VF.createLiteral("2015-12-30T12:00:00Z");
+        statement = VF.createStatement(subject, predicate, object, context);
         actual = adapter.serialize(RdfToRyaConversions.convertStatement(statement));
         expectedString =
                 "{"
@@ -451,9 +458,9 @@
         assertEqualMongo(expected, actual);
 
         //TIME INTERVAL
-        predicate = new URIImpl("Property:circa");
-        object = vf.createLiteral("[1969-12-31T19:00:00-05:00,1969-12-31T19:00:01-05:00]");
-        statement = new ContextStatementImpl(subject, predicate, object, context);
+        predicate = VF.createIRI("Property:circa");
+        object = VF.createLiteral("[1969-12-31T19:00:00-05:00,1969-12-31T19:00:01-05:00]");
+        statement = VF.createStatement(subject, predicate, object, context);
         actual = adapter.serialize(RdfToRyaConversions.convertStatement(statement));
         expectedString =
                 "{"
@@ -471,7 +478,7 @@
         assertEqualMongo(expected, actual);
     }
 
-    private Value[] extractArguments(final String matchName, final FunctionCall call) {
+    private static Value[] extractArguments(final String matchName, final FunctionCall call) {
         final Value args[] = new Value[call.getArgs().size() - 1];
         int argI = 0;
         for (int i = 0; i != call.getArgs().size(); ++i) {
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexerIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexerIT.java
index 881289a..5136a32 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexerIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoGeoTemporalIndexerIT.java
@@ -34,12 +34,11 @@
 import org.apache.rya.mongodb.MongoITBase;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.vividsolutions.jts.geom.Geometry;
 
@@ -101,18 +100,18 @@
     }
 
     private static RyaStatement statement(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:test");
-        final URI predicate = GeoConstants.GEO_AS_WKT;
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("uri:test");
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
         final Value object = vf.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object));
+        return RdfToRyaConversions.convertStatement(vf.createStatement(subject, predicate, object));
     }
 
     private static RyaStatement statement(final TemporalInstant instant) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:test");
-        final URI predicate = vf.createURI("Property:atTime");
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("uri:test");
+        final IRI predicate = vf.createIRI("Property:atTime");
         final Value object = vf.createLiteral(instant.toString());
-        return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object));
+        return RdfToRyaConversions.convertStatement(vf.createStatement(subject, predicate, object));
     }
 }
\ No newline at end of file
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java
index f38fc06..81e0682 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerFilterIT.java
@@ -32,22 +32,21 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.Geometry;
@@ -286,12 +285,12 @@
     }
 
     private static RyaStatement statement(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("urn:geo");
-        final URI predicate = GeoConstants.GEO_AS_WKT;
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("urn:geo");
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
         final WKTWriter w = new WKTWriter();
         final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object));
+        return RdfToRyaConversions.convertStatement(vf.createStatement(subject, predicate, object));
     }
 
 }
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerIT.java
index 40751ae..ff723f8 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerIT.java
@@ -33,15 +33,13 @@
 import org.apache.rya.indexing.mongodb.geo.MongoGeoIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.Sets;
 import com.vividsolutions.jts.geom.Coordinate;
@@ -69,30 +67,30 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
 
             final Point point = gf.createPoint(new Coordinate(10, 10));
             final Value pointValue = vf.createLiteral("Point(10 10)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final URI invalidPredicate = GeoConstants.GEO_AS_WKT;
+            final IRI invalidPredicate = GeoConstants.GEO_AS_WKT;
 
             // These should not be stored because they are not in the predicate list
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj1"), invalidPredicate, pointValue)));
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj2"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj1"), invalidPredicate, pointValue)));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj2"), invalidPredicate, pointValue)));
 
-            final URI pred1 = vf.createURI("pred:1");
-            final URI pred2 = vf.createURI("pred:2");
+            final IRI pred1 = vf.createIRI("pred:1");
+            final IRI pred2 = vf.createIRI("pred:2");
 
             // These should be stored because they are in the predicate list
-            final Statement s3 = new StatementImpl(vf.createURI("foo:subj3"), pred1, pointValue);
-            final Statement s4 = new StatementImpl(vf.createURI("foo:subj4"), pred2, pointValue);
+            final Statement s3 = vf.createStatement(vf.createIRI("foo:subj3"), pred1, pointValue);
+            final Statement s4 = vf.createStatement(vf.createIRI("foo:subj4"), pred2, pointValue);
             f.storeStatement(convertStatement(s3));
             f.storeStatement(convertStatement(s4));
 
             // This should not be stored because the object is not valid wkt
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj5"), pred1, vf.createLiteral("soint(10 10)"))));
 
             // This should not be stored because the object is not a literal
-            f.storeStatement(convertStatement(new StatementImpl(vf.createURI("foo:subj6"), pred1, vf.createURI("p:Point(10 10)"))));
+            f.storeStatement(convertStatement(vf.createStatement(vf.createIRI("foo:subj6"), pred1, vf.createIRI("p:Point(10 10)"))));
 
             f.flush();
 
@@ -109,13 +107,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(0 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -154,13 +152,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -184,13 +182,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -224,13 +222,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -243,7 +241,7 @@
 
             // query with wrong context
             assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
         }
     }
 
@@ -254,13 +252,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -272,7 +270,7 @@
             assertEquals(Sets.newHashSet(statement), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(subject))));
 
             // query with wrong subject
-            assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -283,13 +281,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -303,10 +301,10 @@
 
             // query with wrong context
             assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createURI("foo:context2")))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setContext(vf.createIRI("foo:context2")))));
 
             // query with wrong subject
-            assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createURI("foo:subj2")))));
+            assertEquals(Sets.newHashSet(), getSet(f.queryWithin(p1, new StatementConstraints().setSubject(vf.createIRI("foo:subj2")))));
         }
     }
 
@@ -317,13 +315,13 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource subject = vf.createURI("foo:subj");
-            final URI predicate = GeoConstants.GEO_AS_WKT;
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource subject = vf.createIRI("foo:subj");
+            final IRI predicate = GeoConstants.GEO_AS_WKT;
             final Value object = vf.createLiteral("Point(-77.03524 38.889468)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Resource context = vf.createURI("foo:context");
+            final Resource context = vf.createIRI("foo:context");
 
-            final Statement statement = new ContextStatementImpl(subject, predicate, object, context);
+            final Statement statement = vf.createStatement(subject, predicate, object, context);
             f.storeStatement(convertStatement(statement));
             f.flush();
 
@@ -337,7 +335,7 @@
 
             // query with wrong predicate
             assertEquals(Sets.newHashSet(),
-                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createURI("other:pred"))))));
+                    getSet(f.queryWithin(p1, new StatementConstraints().setPredicates(Collections.singleton(vf.createIRI("other:pred"))))));
         }
     }
 
@@ -348,19 +346,19 @@
             f.setConf(conf);
             f.init();
 
-            final ValueFactory vf = new ValueFactoryImpl();
-            final Resource context = vf.createURI("foo:context");
+            final ValueFactory vf = SimpleValueFactory.getInstance();
+            final Resource context = vf.createIRI("foo:context");
 
-            final Resource subjectEast = vf.createURI("foo:subj:east");
-            final URI predicateEast = GeoConstants.GEO_AS_WKT;
+            final Resource subjectEast = vf.createIRI("foo:subj:east");
+            final IRI predicateEast = GeoConstants.GEO_AS_WKT;
             final Value objectEast = vf.createLiteral("Point(179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementEast = new ContextStatementImpl(subjectEast, predicateEast, objectEast, context);
+            final Statement statementEast = vf.createStatement(subjectEast, predicateEast, objectEast, context);
             f.storeStatement(convertStatement(statementEast));
 
-            final Resource subjectWest = vf.createURI("foo:subj:west");
-            final URI predicateWest = GeoConstants.GEO_AS_WKT;
+            final Resource subjectWest = vf.createIRI("foo:subj:west");
+            final IRI predicateWest = GeoConstants.GEO_AS_WKT;
             final Value objectWest = vf.createLiteral("Point(-179 0)", GeoConstants.XMLSCHEMA_OGC_WKT);
-            final Statement statementWest = new ContextStatementImpl(subjectWest, predicateWest, objectWest, context);
+            final Statement statementWest = vf.createStatement(subjectWest, predicateWest, objectWest, context);
             f.storeStatement(convertStatement(statementWest));
 
             f.flush();
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerSfIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerSfIT.java
index a544a78..c6efc69 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerSfIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoGeoIndexerSfIT.java
@@ -37,15 +37,15 @@
 import org.apache.rya.indexing.mongodb.geo.MongoGeoIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -54,8 +54,6 @@
 import com.vividsolutions.jts.geom.Point;
 import com.vividsolutions.jts.geom.Polygon;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Tests all of the "simple functions" of the geoindexer.
  */
@@ -105,11 +103,11 @@
     }
 
     private static RyaStatement statement(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("uri:" + names.get(geo));
-        final URI predicate = GeoConstants.GEO_AS_WKT;
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("uri:" + names.get(geo));
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
         final Value object = vf.createLiteral(geo.toString(), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object));
+        return RdfToRyaConversions.convertStatement(vf.createStatement(subject, predicate, object));
 
     }
 
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java
index 6acc998..7f998b1 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/mongo/MongoIndexerDeleteIT.java
@@ -31,21 +31,20 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.Update;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.mongodb.MongoClient;
 import com.vividsolutions.jts.geom.Coordinate;
@@ -122,7 +121,7 @@
     }
 
     private void populateRya(final SailRepositoryConnection conn) throws Exception {
-        final ValueFactory VF = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         // geo 2x2 points
         final GeometryFactory GF = new GeometryFactory();
         for (int x = 0; x <= 1; x++) {
@@ -135,26 +134,27 @@
         }
 
         // freetext
-        final URI person = VF.createURI("http://example.org/ontology/Person");
+        final IRI person = vf.createIRI("http://example.org/ontology/Person");
         String uuid;
 
         uuid = "urn:people";
-        conn.add(VF.createURI(uuid), RDF.TYPE, person);
-        conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Alice Palace Hose", VF.createURI("http://www.w3.org/2001/XMLSchema#string")));
-        conn.add(VF.createURI(uuid), RDFS.LABEL, VF.createLiteral("Bob Snob Hose", "en"));
+        conn.add(vf.createIRI(uuid), RDF.TYPE, person);
+        conn.add(vf.createIRI(uuid), RDFS.LABEL, vf.createLiteral("Alice Palace Hose", vf.createIRI("http://www.w3.org/2001/XMLSchema#string")));
+        conn.add(vf.createIRI(uuid), RDFS.LABEL, vf.createLiteral("Bob Snob Hose"));
 
         // temporal
         final TemporalInstant instant = new TemporalInstantRfc3339(1, 2, 3, 4, 5, 6);
-        conn.add(VF.createURI("foo:time"), VF.createURI("Property:atTime"), VF.createLiteral(instant.toString()));
+        conn.add(vf.createIRI("foo:time"), vf.createIRI("Property:atTime"), vf.createLiteral(instant.toString()));
+        conn.commit();
     }
 
     private static RyaStatement statement(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("urn:geo");
-        final URI predicate = GeoConstants.GEO_AS_WKT;
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("urn:geo");
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
         final WKTWriter w = new WKTWriter();
         final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return RdfToRyaConversions.convertStatement(new StatementImpl(subject, predicate, object));
+        return RdfToRyaConversions.convertStatement(vf.createStatement(subject, predicate, object));
     }
 
 }
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PeriodicQueryResultStorage.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PeriodicQueryResultStorage.java
index 2936738..c770e45 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PeriodicQueryResultStorage.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PeriodicQueryResultStorage.java
@@ -25,7 +25,7 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.utils.CloseableIterator;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Interface for storing and retrieving Periodic Query Results.
@@ -72,7 +72,7 @@
      * @return PeriodicQueryStorageMetadata
      * @throws PeriodicQueryStorageException
      */
-    public PeriodicQueryStorageMetadata getPeriodicQueryMetadata(String queryID) throws PeriodicQueryStorageException;;
+    public PeriodicQueryStorageMetadata getPeriodicQueryMetadata(String queryID) throws PeriodicQueryStorageException;
 
     /**
      * Add periodic query results to the storage layer indicated by the given query id
@@ -80,7 +80,7 @@
      * @param results - query results to be added to storage
      * @throws PeriodicQueryStorageException
      */
-    public void addPeriodicQueryResults(String queryId, Collection<VisibilityBindingSet> results) throws PeriodicQueryStorageException;;
+    public void addPeriodicQueryResults(String queryId, Collection<VisibilityBindingSet> results) throws PeriodicQueryStorageException;
 
     /**
      * Deletes periodic query results from the storage layer
@@ -88,14 +88,14 @@
      * @param binID - bin id indicating the periodic id of results to be deleted
      * @throws PeriodicQueryStorageException
      */
-    public void deletePeriodicQueryResults(String queryId, long binID) throws PeriodicQueryStorageException;;
+    public void deletePeriodicQueryResults(String queryId, long binID) throws PeriodicQueryStorageException;
 
     /**
      * Deletes all results for the storage layer indicated by the given query id
      * @param queryID - id indicating the storage layer whose results will be deleted
      * @throws PeriodicQueryStorageException
      */
-    public void deletePeriodicQuery(String queryID) throws PeriodicQueryStorageException;;
+    public void deletePeriodicQuery(String queryID) throws PeriodicQueryStorageException;
 
     /**
      * List results in the given storage layer indicated by the query id
@@ -104,7 +104,7 @@
      * @return
      * @throws PeriodicQueryStorageException
      */
-    public CloseableIterator<BindingSet> listResults(String queryId, Optional<Long> binID) throws PeriodicQueryStorageException;;
+    public CloseableIterator<BindingSet> listResults(String queryId, Optional<Long> binID) throws PeriodicQueryStorageException;
 
     /**
      * List all storage tables containing periodic results.
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PrecomputedJoinStorage.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PrecomputedJoinStorage.java
index 70c8b0e..ebb8e8d 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PrecomputedJoinStorage.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/PrecomputedJoinStorage.java
@@ -24,7 +24,7 @@
 
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.utils.CloseableIterator;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializer.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializer.java
index 999b26f..599a48a 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializer.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializer.java
@@ -28,22 +28,20 @@
 import java.util.Arrays;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Set;
-
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-
-import com.google.common.primitives.Bytes;
 
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaContext;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.api.resolver.RyaTypeResolverException;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+
+import com.google.common.primitives.Bytes;
+
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 
 /**
  * Converts {@link BindingSet}s to byte[]s and back again. The bytes do not
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjStorage.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjStorage.java
index f3d078d..03d3e4f 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjStorage.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjStorage.java
@@ -43,8 +43,8 @@
 import org.apache.rya.indexing.pcj.storage.PCJIdFactory;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPeriodicQueryResultStorage.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPeriodicQueryResultStorage.java
index 8124aff..889c8ca 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPeriodicQueryResultStorage.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPeriodicQueryResultStorage.java
@@ -44,16 +44,17 @@
 import org.apache.rya.indexing.pcj.storage.PeriodicQueryStorageException;
 import org.apache.rya.indexing.pcj.storage.PeriodicQueryStorageMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.AggregateOperatorBase;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.AbstractAggregateOperator;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Preconditions;
 
@@ -215,8 +216,9 @@
     }
 
     private Text getRowPrefix(final long binId) throws BindingSetConversionException {
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding(PeriodicQueryResultStorage.PeriodicBinId, new LiteralImpl(Long.toString(binId), XMLSchema.LONG));
+        bs.addBinding(PeriodicQueryResultStorage.PeriodicBinId, vf.createLiteral(Long.toString(binId), XMLSchema.LONG));
 
         return new Text(converter.convert(bs, new VariableOrder(PeriodicQueryResultStorage.PeriodicBinId)));
     }
@@ -257,7 +259,7 @@
      * written to the table.
      *
      */
-    static class AggregateVariableRemover extends QueryModelVisitorBase<RuntimeException> {
+    static class AggregateVariableRemover extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<String> bindingNames;
 
@@ -270,7 +272,7 @@
 
         @Override
         public void meet(final ExtensionElem node) {
-            if(node.getExpr() instanceof AggregateOperatorBase) {
+            if(node.getExpr() instanceof AbstractAggregateOperator) {
                 bindingNames.remove(node.getName());
             }
         }
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloValueBindingSetIterator.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloValueBindingSetIterator.java
index c488d36..b539196 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloValueBindingSetIterator.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloValueBindingSetIterator.java
@@ -27,7 +27,7 @@
 import org.apache.fluo.api.data.Bytes;
 import org.apache.rya.api.utils.CloseableIterator;
 import org.apache.rya.indexing.pcj.storage.PeriodicQueryResultStorage;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Implementation of CloseableIterator for retrieving results from a {@link PeriodicQueryResultStorage}
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetConverter.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetConverter.java
index c920824..9130a75 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetConverter.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetConverter.java
@@ -18,8 +18,8 @@
  */
 package org.apache.rya.indexing.pcj.storage.accumulo;
 
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverter.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverter.java
index 4120fd9..45a1f61 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverter.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverter.java
@@ -26,15 +26,14 @@
 
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import com.google.common.base.Joiner;
 
@@ -52,7 +51,7 @@
     public static final String TYPE_DELIM = "<<~>>";
     public static final String NULL_VALUE_STRING = Character.toString( '\0' );
 
-    private static final ValueFactory valueFactory = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     public String convert(final BindingSet bindingSet, final VariableOrder varOrder) {
@@ -124,12 +123,12 @@
         final String typeString = valueAndType[1];
 
         // Convert the String Type into a URI that describes the type.
-        final URI typeURI = valueFactory.createURI(typeString);
+        final IRI typeURI = VF.createIRI(typeString);
 
         // Convert the String Value into a Value.
         final Value value = typeURI.equals(XMLSchema.ANYURI) ?
-                valueFactory.createURI(dataString) :
-                valueFactory.createLiteral(dataString, new URIImpl(typeString));
+                VF.createIRI(dataString) :
+                VF.createLiteral(dataString, VF.createIRI(typeString));
 
         return value;
     }
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTables.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTables.java
index 9346c00..2380ebb 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTables.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTables.java
@@ -59,14 +59,14 @@
 import org.apache.rya.api.utils.CloseableIterator;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage.PCJStorageException;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 import com.google.common.base.Optional;
 
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjVarOrderFactory.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjVarOrderFactory.java
index b699ab4..863895f 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjVarOrderFactory.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjVarOrderFactory.java
@@ -20,11 +20,11 @@
 
 import java.util.Set;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
+
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 
-import org.openrdf.query.MalformedQueryException;
-
 /**
  * Create alternative variable orders for a SPARQL query based on
  * the original ordering of its results.
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ScannerBindingSetIterator.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ScannerBindingSetIterator.java
index b457dfd..75446fd 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ScannerBindingSetIterator.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ScannerBindingSetIterator.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -29,7 +29,7 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.rya.api.utils.CloseableIterator;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactory.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactory.java
index e297ec9..b1a3e89 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactory.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactory.java
@@ -24,14 +24,14 @@
 import java.util.List;
 import java.util.Set;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
+
 /**
  * Shifts the variables to the left so that each variable will appear at
  * the head of the varOrder once.
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VariableOrder.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VariableOrder.java
index 151db50..8a7d15b 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VariableOrder.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VariableOrder.java
@@ -23,7 +23,8 @@
 import java.util.Collection;
 import java.util.Iterator;
 
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDe.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDe.java
index 5ddde85..3ba5e06 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDe.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDe.java
@@ -28,6 +28,7 @@
 import org.apache.fluo.api.data.Bytes;
 import org.apache.rya.api.model.BindingSetDecorator;
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.query.AbstractBindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -67,20 +68,30 @@
         requireNonNull(bytes);
         try (final ValidatingObjectInputStream vois = new ValidatingObjectInputStream(new ByteArrayInputStream(bytes.toArray()))) {
             // Perform input validation.  Only the following classes are allowed to be deserialized.
-            vois.accept(VisibilityBindingSet.class,
-                    BindingSetDecorator.class,
-                    org.openrdf.query.impl.MapBindingSet.class,
+            vois.accept(
+                    VisibilityBindingSet.class,
+                    java.lang.Byte.class,
+                    java.lang.Double.class,
+                    java.lang.Float.class,
+                    java.lang.Integer.class,
+                    java.lang.Long.class,
+                    java.lang.Number.class,
+                    java.lang.Short.class,
+                    java.math.BigDecimal.class,
+                    java.math.BigInteger.class,
                     java.util.LinkedHashMap.class,
                     java.util.HashMap.class,
-                    java.math.BigInteger.class,
-                    java.math.BigDecimal.class,
-                    java.lang.Number.class,
-                    org.openrdf.query.impl.BindingImpl.class,
-                    org.openrdf.model.impl.LiteralImpl.class,
-                    org.openrdf.model.impl.IntegerLiteralImpl.class,
-                    org.openrdf.model.impl.DecimalLiteralImpl.class,
-                    org.openrdf.model.impl.URIImpl.class,
-                    org.openrdf.query.algebra.evaluation.QueryBindingSet.class);
+                    org.apache.rya.api.model.BindingSetDecorator.class,
+                    org.eclipse.rdf4j.query.impl.SimpleBinding.class,
+                    org.eclipse.rdf4j.model.impl.SimpleIRI.class,
+                    org.eclipse.rdf4j.model.impl.SimpleLiteral.class,
+                    org.eclipse.rdf4j.model.impl.IntegerLiteral.class,
+                    org.eclipse.rdf4j.model.impl.DecimalLiteral.class,
+                    org.eclipse.rdf4j.model.impl.NumericLiteral.class,
+                    org.eclipse.rdf4j.query.AbstractBindingSet.class,
+                    org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet.class,
+                    org.eclipse.rdf4j.query.impl.MapBindingSet.class
+                );
             vois.accept("[B");
             final Object o = vois.readObject();
             if(o instanceof VisibilityBindingSet) {
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverter.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverter.java
index becf1d5..3a4028f 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverter.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverter.java
@@ -18,12 +18,12 @@
  */
 package org.apache.rya.indexing.pcj.storage.accumulo;
 
+import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
+
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
 
-import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.query.BindingSet;
-
 /**
  * Converts {@link BindingSet}s to Strings and back again. The Strings do not
  * include the binding names and are ordered with a {@link VariableOrder}.
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoBindingSetConverter.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoBindingSetConverter.java
index 010f8bc..92731ac 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoBindingSetConverter.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoBindingSetConverter.java
@@ -20,7 +20,7 @@
 
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter;
 import org.bson.Document;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocuments.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocuments.java
index ecfbc1c..e81d49b 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocuments.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocuments.java
@@ -40,18 +40,19 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.bson.Document;
 import org.bson.conversions.Bson;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 import com.mongodb.MongoClient;
 import com.mongodb.client.FindIterable;
@@ -107,6 +108,7 @@
 
     private final MongoCollection<Document> pcjCollection;
     private static final PcjVarOrderFactory pcjVarOrderFactory = new ShiftVarOrderFactory();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * Creates a new {@link MongoPcjDocuments}.
@@ -418,7 +420,7 @@
                     } else if (!key.equals("_id") && !key.equals(PCJ_ID)) {
                         // is the binding value.
                         final Document typeDoc = (Document) bs.get(key);
-                        final URI dataType = new URIImpl(typeDoc.getString(BINDING_TYPE));
+                        final IRI dataType = VF.createIRI(typeDoc.getString(BINDING_TYPE));
                         final RyaType type = new RyaType(dataType, typeDoc.getString(BINDING_VALUE));
                         final Value value = RyaToRdfConversions.convertValue(type);
                         binding.addBinding(key, value);
diff --git a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorage.java b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorage.java
index f4e4e9e..b484949 100644
--- a/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorage.java
+++ b/extras/rya.indexing.pcj/src/main/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorage.java
@@ -36,7 +36,7 @@
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.mongodb.MongoClient;
 
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializerTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializerTest.java
index d904d83..c1b85cf 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializerTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/AccumuloPcjSerializerTest.java
@@ -20,23 +20,20 @@
 
 import static org.junit.Assert.assertEquals;
 
-import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjSerializer;
-import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter;
-import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
-import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-
 import org.apache.rya.api.resolver.RyaTypeResolverException;
+import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.junit.Test;
 
 /**
  * Tests the methods of {@link AccumuloPcjSerialzer}.
  */
 public class AccumuloPcjSerializerTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * The BindingSet has fewer Bindings than there are variables in the variable
@@ -47,8 +44,8 @@
     public void serialize_bindingsSubsetOfVarOrder() throws BindingSetConversionException {
         // Setup the Binding Set.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
 
         // Setup the variable order.
         final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b");
@@ -73,9 +70,9 @@
     public void serialize_bindingNotInVariableOrder() throws RyaTypeResolverException, BindingSetConversionException {
         // Setup the Binding Set.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
-        originalBindingSet.addBinding("z", new URIImpl("http://d"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
+        originalBindingSet.addBinding("z", VF.createIRI("http://d"));
 
         // Setup the variable order.
         final VariableOrder varOrder = new VariableOrder("x", "y");
@@ -89,8 +86,8 @@
         
         // Show that it only contains the bindings that were part of the Variable Order.
         MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new URIImpl("http://a"));
-        expected.addBinding("y", new URIImpl("http://b"));
+        expected.addBinding("x", VF.createIRI("http://a"));
+        expected.addBinding("y", VF.createIRI("http://b"));
         
         assertEquals(expected, deserialized);
     }
@@ -98,8 +95,8 @@
 	@Test
 	public void basicShortUriBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new URIImpl("http://uri1"));
-		bs.addBinding("Y",new URIImpl("http://uri2"));
+		bs.addBinding("X", VF.createIRI("http://uri1"));
+		bs.addBinding("Y", VF.createIRI("http://uri2"));
 		final VariableOrder varOrder = new VariableOrder("X","Y");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
@@ -111,11 +108,11 @@
 	@Test
 	public void basicLongUriBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new URIImpl("http://uri1"));
-		bs.addBinding("Y",new URIImpl("http://uri2"));
-		bs.addBinding("Z",new URIImpl("http://uri3"));
-		bs.addBinding("A",new URIImpl("http://uri4"));
-		bs.addBinding("B",new URIImpl("http://uri5"));
+		bs.addBinding("X", VF.createIRI("http://uri1"));
+		bs.addBinding("Y", VF.createIRI("http://uri2"));
+		bs.addBinding("Z",VF.createIRI("http://uri3"));
+		bs.addBinding("A", VF.createIRI("http://uri4"));
+		bs.addBinding("B", VF.createIRI("http://uri5"));
 		final VariableOrder varOrder = new VariableOrder("X","Y","Z","A","B");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
@@ -127,8 +124,8 @@
 	@Test
 	public void basicShortStringLiteralBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new LiteralImpl("literal1"));
-		bs.addBinding("Y",new LiteralImpl("literal2"));
+		bs.addBinding("X", VF.createLiteral("literal1"));
+		bs.addBinding("Y", VF.createLiteral("literal2"));
 		final VariableOrder varOrder = new VariableOrder("X","Y");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
@@ -140,8 +137,8 @@
 	@Test
 	public void basicShortMixLiteralBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new LiteralImpl("literal1"));
-		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
+		bs.addBinding("X",VF.createLiteral("literal1"));
+		bs.addBinding("Y",VF.createLiteral("5", VF.createIRI("http://www.w3.org/2001/XMLSchema#integer")));
 		final VariableOrder varOrder = new VariableOrder("X","Y");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
@@ -153,10 +150,10 @@
 	@Test
 	public void basicLongMixLiteralBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new LiteralImpl("literal1"));
-		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
-		bs.addBinding("Z",new LiteralImpl("5.0", new URIImpl("http://www.w3.org/2001/XMLSchema#double")));
-		bs.addBinding("W",new LiteralImpl("1000", new URIImpl("http://www.w3.org/2001/XMLSchema#long")));
+		bs.addBinding("X", VF.createLiteral("literal1"));
+		bs.addBinding("Y", VF.createLiteral("5", VF.createIRI("http://www.w3.org/2001/XMLSchema#integer")));
+		bs.addBinding("Z", VF.createLiteral("5.0", VF.createIRI("http://www.w3.org/2001/XMLSchema#double")));
+		bs.addBinding("W", VF.createLiteral("1000", VF.createIRI("http://www.w3.org/2001/XMLSchema#long")));
 		final VariableOrder varOrder = new VariableOrder("W","X","Y","Z");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
@@ -168,13 +165,13 @@
 	@Test
 	public void basicMixUriLiteralBsTest() throws BindingSetConversionException {
 		final QueryBindingSet bs = new QueryBindingSet();
-		bs.addBinding("X",new LiteralImpl("literal1"));
-		bs.addBinding("Y",new LiteralImpl("5", new URIImpl("http://www.w3.org/2001/XMLSchema#integer")));
-		bs.addBinding("Z",new LiteralImpl("5.0", new URIImpl("http://www.w3.org/2001/XMLSchema#double")));
-		bs.addBinding("W",new LiteralImpl("1000", new URIImpl("http://www.w3.org/2001/XMLSchema#long")));
-		bs.addBinding("A",new URIImpl("http://uri1"));
-		bs.addBinding("B",new URIImpl("http://uri2"));
-		bs.addBinding("C",new URIImpl("http://uri3"));
+		bs.addBinding("X", VF.createLiteral("literal1"));
+		bs.addBinding("Y", VF.createLiteral("5", VF.createIRI("http://www.w3.org/2001/XMLSchema#integer")));
+		bs.addBinding("Z", VF.createLiteral("5.0", VF.createIRI("http://www.w3.org/2001/XMLSchema#double")));
+		bs.addBinding("W", VF.createLiteral("1000", VF.createIRI("http://www.w3.org/2001/XMLSchema#long")));
+		bs.addBinding("A", VF.createIRI("http://uri1"));
+		bs.addBinding("B", VF.createIRI("http://uri2"));
+		bs.addBinding("C", VF.createIRI("http://uri3"));
 		final VariableOrder varOrder = new VariableOrder("A","W","X","Y","Z","B","C");
 
 		BindingSetConverter<byte[]> converter = new AccumuloPcjSerializer();
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
index b263038..3ec2766 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/BindingSetStringConverterTest.java
@@ -24,18 +24,17 @@
 import java.math.BigInteger;
 
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.BooleanLiteralImpl;
-import org.openrdf.model.impl.DecimalLiteralImpl;
-import org.openrdf.model.impl.IntegerLiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Tests the methods of {@link BindingSetStringConverter}.
  */
 public class BindingSetStringConverterTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void noBindings() throws BindingSetConversionException {
@@ -58,9 +57,9 @@
     public void toString_URIs() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
-        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
+        originalBindingSet.addBinding("z", VF.createIRI("http://c"));
 
         // Convert it to a String.
         final VariableOrder varOrder = new VariableOrder("y", "z", "x");
@@ -80,7 +79,7 @@
     public void toString_Decimal() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new DecimalLiteralImpl(new BigDecimal(2.5)));
+        originalBindingSet.addBinding("x", VF.createLiteral(new BigDecimal(2.5)));
 
         // Convert it to a String.
         final VariableOrder varOrder = new VariableOrder("x");
@@ -96,7 +95,7 @@
     public void toString_Boolean() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new BooleanLiteralImpl(true));
+        originalBindingSet.addBinding("x", VF.createLiteral((true)));
 
         // Convert it to a String.
         final VariableOrder varOrder = new VariableOrder("x");
@@ -112,7 +111,7 @@
     public void toString_Integer() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new IntegerLiteralImpl(BigInteger.valueOf(5)));
+        originalBindingSet.addBinding("x", VF.createLiteral((BigInteger.valueOf(5))));
 
         // Convert it to a String.
         final VariableOrder varOrder = new VariableOrder("x");
@@ -132,8 +131,8 @@
     public void toString_bindingsMatchVarOrder() throws BindingSetConversionException {
         // Setup the Binding Set.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
 
         // Setup the variable order.
         final VariableOrder varOrder = new VariableOrder("x", "y");
@@ -158,8 +157,8 @@
     public void toString_bindingsSubsetOfVarOrder() throws BindingSetConversionException {
         // Setup the Binding Set.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
 
         // Setup the variable order.
         final VariableOrder varOrder = new VariableOrder("x", "a", "y", "b");
@@ -192,9 +191,9 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new URIImpl("http://a"));
-        expected.addBinding("y", new URIImpl("http://b"));
-        expected.addBinding("z", new URIImpl("http://c"));
+        expected.addBinding("x", VF.createIRI("http://a"));
+        expected.addBinding("y", VF.createIRI("http://b"));
+        expected.addBinding("z", VF.createIRI("http://c"));
 
         assertEquals(expected, bindingSet);
     }
@@ -219,8 +218,8 @@
 
         // Ensure it converted to the expected reuslt.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new URIImpl("http://value 1"));
-        expected.addBinding("y", new URIImpl("http://value 2"));
+        expected.addBinding("x", VF.createIRI("http://value 1"));
+        expected.addBinding("y", VF.createIRI("http://value 2"));
 
         assertEquals(expected, bindingSet);
     }
@@ -236,7 +235,7 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new DecimalLiteralImpl(new BigDecimal(2.5)));
+        expected.addBinding("x", VF.createLiteral((new BigDecimal(2.5))));
 
         assertEquals(expected, bindingSet);
     }
@@ -252,7 +251,7 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new BooleanLiteralImpl(true));
+        expected.addBinding("x", VF.createLiteral((true)));
 
         assertEquals(expected, bindingSet);
     }
@@ -268,7 +267,7 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("x", new IntegerLiteralImpl(BigInteger.valueOf(5)));
+        expected.addBinding("x", VF.createLiteral((BigInteger.valueOf(5))));
 
         assertEquals(expected, bindingSet);
     }
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIT.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIT.java
index b95c812..f142b77 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIT.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesIT.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertNotNull;
 
 import java.io.IOException;
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Map.Entry;
 import java.util.Set;
@@ -53,21 +54,18 @@
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.zookeeper.ClientCnxn;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.HashMultimap;
@@ -84,6 +82,7 @@
     private static final String CLOUDBASE_INSTANCE = "sc.cloudbase.instancename";
     private static final String CLOUDBASE_USER = "sc.cloudbase.username";
     private static final String CLOUDBASE_PASSWORD = "sc.cloudbase.password";
+    private static final ValueFactory VF =  SimpleValueFactory.getInstance();
 
     private static final AccumuloPcjSerializer converter = new AccumuloPcjSerializer();
 
@@ -209,19 +208,19 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
-        pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
+        final Set<BindingSet> results = Sets.newHashSet(alice, bob, charlie);
+        pcjs.addResults(accumuloConn, pcjTableName, Sets.newHashSet(
                 new VisibilityBindingSet(alice),
                 new VisibilityBindingSet(bob),
                 new VisibilityBindingSet(charlie)));
@@ -260,18 +259,18 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
+        pcjs.addResults(accumuloConn, pcjTableName, Sets.newHashSet(
                 new VisibilityBindingSet(alice),
                 new VisibilityBindingSet(bob),
                 new VisibilityBindingSet(charlie)));
@@ -289,7 +288,7 @@
         }
 
         // Verify the fetched results match the expected ones.
-        final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+        final Set<BindingSet> expected = Sets.newHashSet(alice, bob, charlie);
         assertEquals(expected, results);
     }
 
@@ -297,20 +296,20 @@
      * Ensure when results are already stored in Rya, that we are able to populate
      * the PCJ table for a new SPARQL query using those results.
      * <p>
-     * The method being tested is: {@link PcjTables#populatePcj(Connector, String, RepositoryConnection, String)}
+     * The method being tested is: {@link PcjTables#populatePcj(Connector, String, RepositoryConnection)}
      */
     @Test
     public void populatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(43))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -344,18 +343,18 @@
 
         // Ensure the expected results match those that were stored.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+        final Set<BindingSet> results = Sets.newHashSet(alice, bob, charlie);
 
         final Multimap<String, BindingSet> expectedResults = HashMultimap.create();
         expectedResults.putAll("name;age", results);
@@ -373,14 +372,14 @@
     public void createAndPopulatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException, AccumuloException, AccumuloSecurityException {
         // Load some Triples into Rya.
         final Set<Statement> triples = new HashSet<>();
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(14)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(16)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(12)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(43)) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
         for(final Statement triple : triples) {
             ryaConn.add(triple);
@@ -401,7 +400,7 @@
 
         // Create and populate the PCJ table.
         final PcjTables pcjs = new PcjTables();
-        pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.<PcjVarOrderFactory>absent());
+        pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"name", "age"}, Optional.absent());
 
         // Make sure the cardinality was updated.
         final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
@@ -412,18 +411,18 @@
 
         // Ensure the expected results match those that were stored.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        final Set<BindingSet> results = Sets.<BindingSet>newHashSet(alice, bob, charlie);
+        final Set<BindingSet> results = Sets.newHashSet(alice, bob, charlie);
 
         final Multimap<String, BindingSet> expectedResults = HashMultimap.create();
         expectedResults.putAll("name;age", results);
@@ -487,18 +486,18 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
-        pcjs.addResults(accumuloConn, pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
+        pcjs.addResults(accumuloConn, pcjTableName, Sets.newHashSet(
                 new VisibilityBindingSet(alice),
                 new VisibilityBindingSet(bob),
                 new VisibilityBindingSet(charlie)));
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesWithMockTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesWithMockTest.java
index bbd0f11..cec64fe 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesWithMockTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/PcjTablesWithMockTest.java
@@ -16,21 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
 package org.apache.rya.indexing.pcj.storage.accumulo;
 
 import static org.junit.Assert.assertEquals;
 
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.rya.rdftriplestore.RyaSailRepository;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
@@ -39,20 +32,22 @@
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.log4j.Logger;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.indexing.pcj.storage.PcjException;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.base.Optional;
 
@@ -69,6 +64,7 @@
 	private Connector accumuloConn;
 	private RyaSailRepository ryaRepo;
 	private SailRepositoryConnection ryaConn;
+	private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	@Before
 	public void init() throws AccumuloException, AccumuloSecurityException, RepositoryException {
@@ -79,39 +75,39 @@
 	}
 
 
-	 @Test
-	    public void populatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException {
-	        // Load some Triples into Rya.
-	        final Set<Statement> triples = new HashSet<>();
-	        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-	        triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-	        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-	        triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-	        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-	        triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-	        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-	        triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+    @Test
+    public void populatePcj() throws RepositoryException, PcjException, TableNotFoundException, BindingSetConversionException {
+        // Load some Triples into Rya.
+        final Set<Statement> triples = new HashSet<>();
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+        triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral((43))));
+        triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
-	        for(final Statement triple : triples) {
-	            ryaConn.add(triple);
-	        }
+        for(final Statement triple : triples) {
+            ryaConn.add(triple);
+        }
 
-	        // Create a PCJ table that will include those triples in its results.
-	        final String sparql =
-	                "SELECT ?name ?age " +
-	                "{" +
-	                  "?name <http://hasAge> ?age." +
-	                  "?name <http://playsSport> \"Soccer\" " +
-	                "}";
+        // Create a PCJ table that will include those triples in its results.
+        final String sparql =
+                "SELECT ?name ?age " +
+                "{" +
+                  "?name <http://hasAge> ?age." +
+                  "?name <http://playsSport> \"Soccer\" " +
+                "}";
 
-	        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
-	        final PcjTables pcjs = new PcjTables();
-	        pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"age","name"}, Optional.<PcjVarOrderFactory>absent());
+        final String pcjTableName = new PcjTableNameFactory().makeTableName(RYA_TABLE_PREFIX, "testPcj");
+        final PcjTables pcjs = new PcjTables();
+        pcjs.createAndPopulatePcj(ryaConn, accumuloConn, pcjTableName, sparql, new String[]{"age","name"}, Optional.absent());
 
-	        // Make sure the cardinality was updated.
-	        final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
-	        assertEquals(4, metadata.getCardinality());
-	    }
+        // Make sure the cardinality was updated.
+        final PcjMetadata metadata = pcjs.getPcjMetadata(accumuloConn, pcjTableName);
+        assertEquals(4, metadata.getCardinality());
+    }
 
 
 	@After
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactoryTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactoryTest.java
index 68515f6..b41aba3 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactoryTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/ShiftVarOrderFactoryTest.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -22,8 +22,8 @@
 
 import java.util.Set;
 
+import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDeTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDeTest.java
index b32331c..758965e 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDeTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetSerDeTest.java
@@ -28,12 +28,12 @@
 
 import org.apache.fluo.api.data.Bytes;
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Tests the methods of {@link VisibilityBindingSetSerDe}.
@@ -42,7 +42,7 @@
 
     @Test
     public void rountTrip() throws Exception {
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final MapBindingSet bs = new MapBindingSet();
         bs.addBinding("name", vf.createLiteral("Alice"));
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
index 40e3322..c9252b0 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/VisibilityBindingSetStringConverterTest.java
@@ -23,23 +23,25 @@
 
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetConverter.BindingSetConversionException;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Tests the methods of {@link BindingSetStringConverter}.
  */
 public class VisibilityBindingSetStringConverterTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void toString_URIs() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
-        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
+        originalBindingSet.addBinding("z", VF.createIRI("http://c"));
 
         final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet, "A&B&C");
 
@@ -74,9 +76,9 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("z", new URIImpl("http://c"));
-        expected.addBinding("y", new URIImpl("http://b"));
-        expected.addBinding("x", new URIImpl("http://a"));
+        expected.addBinding("z", VF.createIRI("http://c"));
+        expected.addBinding("y", VF.createIRI("http://b"));
+        expected.addBinding("x", VF.createIRI("http://a"));
         final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected, "A&B");
 
         assertEquals(visiSet, bindingSet);
@@ -86,9 +88,9 @@
     public void toString_URIs_noVisi() throws BindingSetConversionException {
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet = new MapBindingSet();
-        originalBindingSet.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet.addBinding("y", new URIImpl("http://b"));
-        originalBindingSet.addBinding("z", new URIImpl("http://c"));
+        originalBindingSet.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet.addBinding("y", VF.createIRI("http://b"));
+        originalBindingSet.addBinding("z", VF.createIRI("http://c"));
 
         final VisibilityBindingSet visiSet = new VisibilityBindingSet(originalBindingSet);
 
@@ -121,9 +123,9 @@
 
         // Ensure it converted to the expected result.
         final MapBindingSet expected = new MapBindingSet();
-        expected.addBinding("z", new URIImpl("http://c"));
-        expected.addBinding("y", new URIImpl("http://b"));
-        expected.addBinding("x", new URIImpl("http://a"));
+        expected.addBinding("z", VF.createIRI("http://c"));
+        expected.addBinding("y", VF.createIRI("http://b"));
+        expected.addBinding("x", VF.createIRI("http://a"));
         final VisibilityBindingSet visiSet = new VisibilityBindingSet(expected);
 
         assertEquals(visiSet, bindingSet);
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPcjStorageIT.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPcjStorageIT.java
index 33571f7..8968898 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPcjStorageIT.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPcjStorageIT.java
@@ -1,4 +1,4 @@
-/**
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -46,11 +46,12 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.ShiftVarOrderFactory;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -61,13 +62,14 @@
  * also update the Rya instance's details.
  */
 public class AccumuloPcjStorageIT extends AccumuloRyaITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void createPCJ() throws AccumuloException, AccumuloSecurityException, PCJStorageException, NotInitializedException, RyaDetailsRepositoryException {
         // Setup the PCJ storage that will be tested against.
         final Connector connector = super.getClusterInstance().getConnector();
         final String ryaInstanceName = super.getRyaInstanceName();
-        try(final PrecomputedJoinStorage pcjStorage =  new AccumuloPcjStorage(connector, ryaInstanceName)) {
+        try(final PrecomputedJoinStorage pcjStorage = new AccumuloPcjStorage(connector, ryaInstanceName)) {
             // Create a PCJ.
             final String pcjId = pcjStorage.createPcj("SELECT * WHERE { ?a <http://isA> ?b } ");
 
@@ -171,13 +173,13 @@
             final Set<VisibilityBindingSet> results = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             results.add( new VisibilityBindingSet(aliceBS, "") );
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             results.add( new VisibilityBindingSet(charlieBS, "") );
 
             pcjStorage.addResults(pcjId, results);
@@ -205,13 +207,13 @@
             final Set<VisibilityBindingSet> storedResults = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             storedResults.add( new VisibilityBindingSet(aliceBS, "") );
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             storedResults.add( new VisibilityBindingSet(charlieBS, "") );
 
             pcjStorage.addResults(pcjId, storedResults);
@@ -247,13 +249,13 @@
             final Set<VisibilityBindingSet> expectedResults = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             expectedResults.add( new VisibilityBindingSet(aliceBS, "") );
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             expectedResults.add( new VisibilityBindingSet(charlieBS, "") );
 
             pcjStorage.addResults(pcjId, expectedResults);
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPeriodicQueryResultStorageIT.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPeriodicQueryResultStorageIT.java
index 2d9da4d..723c700 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPeriodicQueryResultStorageIT.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/accumulo/integration/AccumuloPeriodicQueryResultStorageIT.java
@@ -37,22 +37,22 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPeriodicQueryResultStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.PeriodicQueryTableNameFactory;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 public class AccumuloPeriodicQueryResultStorageIT extends AccumuloITBase {
 
     private PeriodicQueryResultStorage periodicStorage;
     private static final String RYA = "rya_";
     private static final PeriodicQueryTableNameFactory nameFactory = new PeriodicQueryTableNameFactory();
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Before
     public void init() throws AccumuloException, AccumuloSecurityException {
@@ -86,15 +86,15 @@
 
         //add result matching user's visibility
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("periodicBinId", vf.createLiteral(1L));
-        bs.addBinding("x",vf.createURI("uri:uri123"));
+        bs.addBinding("periodicBinId", VF.createLiteral(1L));
+        bs.addBinding("x", VF.createIRI("uri:uri123"));
         expected.add(bs);
         storageSet.add(new VisibilityBindingSet(bs,"U"));
 
         //add result with different visibility that is not expected
         bs = new QueryBindingSet();
-        bs.addBinding("periodicBinId", vf.createLiteral(1L));
-        bs.addBinding("x",vf.createURI("uri:uri456"));
+        bs.addBinding("periodicBinId", VF.createLiteral(1L));
+        bs.addBinding("x", VF.createIRI("uri:uri456"));
         storageSet.add(new VisibilityBindingSet(bs,"V"));
 
         periodicStorage.addPeriodicQueryResults(id, storageSet);
@@ -129,7 +129,6 @@
                 + "?obs <uri:hasId> ?id } group by ?id"; //n
 
 
-        final ValueFactory vf = new ValueFactoryImpl();
         long currentTime = System.currentTimeMillis();
         String queryId = UUID.randomUUID().toString().replace("-", "");
 
@@ -144,72 +143,72 @@
         long binId = (currentTime/period)*period;
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_1", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId));
+        bs.addBinding("total", VF.createLiteral("2", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_1", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId));
         expected1.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_2", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId));
+        bs.addBinding("total", VF.createLiteral("2", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_2", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId));
         expected1.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_3", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_3", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId));
         expected1.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_4", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_4", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId));
         expected1.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_1", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + period));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_1", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + period));
         expected2.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_2", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + period));
+        bs.addBinding("total", VF.createLiteral("2", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_2", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + period));
         expected2.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_3", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + period));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_3", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + period));
         expected2.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_1", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + 2*period));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_1", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + 2*period));
         expected3.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_2", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + 2*period));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_2", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + 2*period));
         expected3.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("total", vf.createLiteral("1", XMLSchema.INTEGER));
-        bs.addBinding("id", vf.createLiteral("id_1", XMLSchema.STRING));
-        bs.addBinding("periodicBinId", vf.createLiteral(binId + 3*period));
+        bs.addBinding("total", VF.createLiteral("1", XMLSchema.INTEGER));
+        bs.addBinding("id", VF.createLiteral("id_1", XMLSchema.STRING));
+        bs.addBinding("periodicBinId", VF.createLiteral(binId + 3*period));
         expected4.add(bs);
         storageResults.add(new VisibilityBindingSet(bs));
 
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocumentsTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocumentsTest.java
index f522fac..0596daf 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocumentsTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjDocumentsTest.java
@@ -28,14 +28,17 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.mongodb.MongoITBase;
 import org.bson.Document;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
 public class MongoPcjDocumentsTest extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     @Test
     public void pcjToMetadata() throws Exception {
         final MongoPcjDocuments docConverter = new MongoPcjDocuments(getMongoClient(), conf.getRyaInstanceName());
@@ -62,16 +65,16 @@
 
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet1 = new MapBindingSet();
-        originalBindingSet1.addBinding("x", new URIImpl("http://a"));
-        originalBindingSet1.addBinding("y", new URIImpl("http://b"));
-        originalBindingSet1.addBinding("z", new URIImpl("http://c"));
+        originalBindingSet1.addBinding("x", VF.createIRI("http://a"));
+        originalBindingSet1.addBinding("y", VF.createIRI("http://b"));
+        originalBindingSet1.addBinding("z", VF.createIRI("http://c"));
         final VisibilityBindingSet results1 = new VisibilityBindingSet(originalBindingSet1, "A&B&C");
 
         // Setup the binding set that will be converted.
         final MapBindingSet originalBindingSet2 = new MapBindingSet();
-        originalBindingSet2.addBinding("x", new URIImpl("http://1"));
-        originalBindingSet2.addBinding("y", new URIImpl("http://2"));
-        originalBindingSet2.addBinding("z", new URIImpl("http://3"));
+        originalBindingSet2.addBinding("x", VF.createIRI("http://1"));
+        originalBindingSet2.addBinding("y", VF.createIRI("http://2"));
+        originalBindingSet2.addBinding("z", VF.createIRI("http://3"));
         final VisibilityBindingSet results2 = new VisibilityBindingSet(originalBindingSet2, "A&B&C");
 
         final List<VisibilityBindingSet> bindingSets = new ArrayList<>();
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorageIT.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorageIT.java
index 6747558..d87f597 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorageIT.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/MongoPcjStorageIT.java
@@ -45,10 +45,11 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableMap;
@@ -60,6 +61,7 @@
  * also update the Rya instance's details.
  */
 public class MongoPcjStorageIT extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void createPCJ() throws Exception {
@@ -219,13 +221,13 @@
             final Set<VisibilityBindingSet> results = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             results.add( new VisibilityBindingSet(aliceBS, "") );
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             results.add( new VisibilityBindingSet(charlieBS, "") );
 
             pcjStorage.addResults(pcjId, results);
@@ -264,14 +266,14 @@
             final Set<BindingSet> expectedResults = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             visiSets.add( new VisibilityBindingSet(aliceBS, "") );
             expectedResults.add(aliceBS);
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             visiSets.add( new VisibilityBindingSet(charlieBS, "") );
             expectedResults.add(charlieBS);
 
@@ -313,13 +315,13 @@
             final Set<VisibilityBindingSet> expectedResults = new HashSet<>();
 
             final MapBindingSet aliceBS = new MapBindingSet();
-            aliceBS.addBinding("a", new URIImpl("http://Alice"));
-            aliceBS.addBinding("b", new URIImpl("http://Person"));
+            aliceBS.addBinding("a", VF.createIRI("http://Alice"));
+            aliceBS.addBinding("b", VF.createIRI("http://Person"));
             expectedResults.add( new VisibilityBindingSet(aliceBS, "") );
 
             final MapBindingSet charlieBS = new MapBindingSet();
-            charlieBS.addBinding("a", new URIImpl("http://Charlie"));
-            charlieBS.addBinding("b", new URIImpl("http://Comedian"));
+            charlieBS.addBinding("a", VF.createIRI("http://Charlie"));
+            charlieBS.addBinding("b", VF.createIRI("http://Comedian"));
             expectedResults.add( new VisibilityBindingSet(charlieBS, "") );
 
             pcjStorage.addResults(pcjId, expectedResults);
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsIntegrationTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsIntegrationTest.java
index 0c71c9f..e326339 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsIntegrationTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsIntegrationTest.java
@@ -20,6 +20,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -45,17 +46,14 @@
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -65,6 +63,8 @@
  * functions of {@link PcjTables} work within a cluster setting.
  */
 public class PcjDocumentsIntegrationTest extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
         conf.setDisplayQueryPlan(true);
@@ -119,16 +119,16 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
         final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(alice, bob, charlie);
         pcjs.addResults(pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
@@ -161,16 +161,16 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
         pcjs.addResults(pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
                 new VisibilityBindingSet(alice),
@@ -214,14 +214,14 @@
         try {
             // Load some Triples into Rya.
             final Set<Statement> triples = new HashSet<>();
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(43))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
             for(final Statement triple : triples) {
                 ryaConn.add(triple);
@@ -251,16 +251,16 @@
 
             // Ensure the expected results match those that were stored.
             final MapBindingSet alice = new MapBindingSet();
-            alice.addBinding("name", new URIImpl("http://Alice"));
-            alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+            alice.addBinding("name", VF.createIRI("http://Alice"));
+            alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
             final MapBindingSet bob = new MapBindingSet();
-            bob.addBinding("name", new URIImpl("http://Bob"));
-            bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+            bob.addBinding("name", VF.createIRI("http://Bob"));
+            bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
             final MapBindingSet charlie = new MapBindingSet();
-            charlie.addBinding("name", new URIImpl("http://Charlie"));
-            charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+            charlie.addBinding("name", VF.createIRI("http://Charlie"));
+            charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
             final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(alice, bob, charlie);
 
@@ -291,14 +291,14 @@
         try {
             // Load some Triples into Rya.
             final Set<Statement> triples = new HashSet<>();
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(43))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
             for(final Statement triple : triples) {
                 ryaConn.add(triple);
@@ -328,16 +328,16 @@
 
             // Ensure the expected results match those that were stored.
             final MapBindingSet alice = new MapBindingSet();
-            alice.addBinding("name", new URIImpl("http://Alice"));
-            alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+            alice.addBinding("name", VF.createIRI("http://Alice"));
+            alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
             final MapBindingSet bob = new MapBindingSet();
-            bob.addBinding("name", new URIImpl("http://Bob"));
-            bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+            bob.addBinding("name", VF.createIRI("http://Bob"));
+            bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
             final MapBindingSet charlie = new MapBindingSet();
-            charlie.addBinding("name", new URIImpl("http://Charlie"));
-            charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+            charlie.addBinding("name", VF.createIRI("http://Charlie"));
+            charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
             final Set<BindingSet> expected = Sets.<BindingSet>newHashSet(alice, bob, charlie);
 
@@ -397,16 +397,16 @@
 
         // Add a few results to the PCJ table.
         final MapBindingSet alice = new MapBindingSet();
-        alice.addBinding("name", new URIImpl("http://Alice"));
-        alice.addBinding("age", new NumericLiteralImpl(14, XMLSchema.INTEGER));
+        alice.addBinding("name", VF.createIRI("http://Alice"));
+        alice.addBinding("age", VF.createLiteral(BigInteger.valueOf(14)));
 
         final MapBindingSet bob = new MapBindingSet();
-        bob.addBinding("name", new URIImpl("http://Bob"));
-        bob.addBinding("age", new NumericLiteralImpl(16, XMLSchema.INTEGER));
+        bob.addBinding("name", VF.createIRI("http://Bob"));
+        bob.addBinding("age", VF.createLiteral(BigInteger.valueOf(16)));
 
         final MapBindingSet charlie = new MapBindingSet();
-        charlie.addBinding("name", new URIImpl("http://Charlie"));
-        charlie.addBinding("age", new NumericLiteralImpl(12, XMLSchema.INTEGER));
+        charlie.addBinding("name", VF.createIRI("http://Charlie"));
+        charlie.addBinding("age", VF.createLiteral(BigInteger.valueOf(12)));
 
         pcjs.addResults(pcjTableName, Sets.<VisibilityBindingSet>newHashSet(
                 new VisibilityBindingSet(alice),
diff --git a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsWithMockTest.java b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsWithMockTest.java
index a3ba747..2666b85 100644
--- a/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsWithMockTest.java
+++ b/extras/rya.indexing.pcj/src/test/java/org/apache/rya/indexing/pcj/storage/mongo/PcjDocumentsWithMockTest.java
@@ -22,6 +22,7 @@
 
 import static org.junit.Assert.assertEquals;
 
+import java.math.BigInteger;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -33,16 +34,15 @@
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.NumericLiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 public class PcjDocumentsWithMockTest extends MongoITBase {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
         conf.setDisplayQueryPlan(false);
@@ -61,14 +61,14 @@
         try {
             // Load some Triples into Rya.
             final Set<Statement> triples = new HashSet<>();
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://hasAge"), new NumericLiteralImpl(14, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Alice"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://hasAge"), new NumericLiteralImpl(16, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Bob"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://hasAge"), new NumericLiteralImpl(12, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Charlie"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://hasAge"), new NumericLiteralImpl(43, XMLSchema.INTEGER)) );
-            triples.add( new StatementImpl(new URIImpl("http://Eve"), new URIImpl("http://playsSport"), new LiteralImpl("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(14))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Alice"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(16))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Bob"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(12))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Charlie"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://hasAge"), VF.createLiteral(BigInteger.valueOf(43))) );
+            triples.add( VF.createStatement(VF.createIRI("http://Eve"), VF.createIRI("http://playsSport"), VF.createLiteral("Soccer")) );
 
             for(final Statement triple : triples) {
                 ryaConn.add(triple);
diff --git a/extras/rya.manual/src/site/markdown/alx.md b/extras/rya.manual/src/site/markdown/alx.md
index ca28501..a6486f4 100644
--- a/extras/rya.manual/src/site/markdown/alx.md
+++ b/extras/rya.manual/src/site/markdown/alx.md
@@ -57,8 +57,8 @@
 
 ``` JAVA
 import org.springframework.osgi.extensions.annotation.*;
-import org.openrdf.repository.*;
-import org.openrdf.model.ValueFactory;
+import org.eclipse.rdf4j.repository.*;
+import org.eclipse.rdf4j.model.ValueFactory;
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.*;
 
 class TstRepo {
@@ -68,7 +68,7 @@
 		println repo
 		RepositoryConnection conn = repo.getConnection();
 		ValueFactory vf = VALUE_FACTORY;
-        def statements = conn.getStatements(vf.createURI("http://www.Department0.University0.edu"), null, null, true);
+        def statements = conn.getStatements(vf.createIRI("http://www.Department0.University0.edu"), null, null, true);
         while(statements.hasNext()) {
             System.out.println(statements.next());
         }
diff --git a/extras/rya.manual/src/site/markdown/loaddata.md b/extras/rya.manual/src/site/markdown/loaddata.md
index 5d3f298..e5c7bd2 100644
--- a/extras/rya.manual/src/site/markdown/loaddata.md
+++ b/extras/rya.manual/src/site/markdown/loaddata.md
@@ -106,7 +106,7 @@
 
 - rdf.tablePrefix : The tables (spo, po, osp) are prefixed with this qualifier. The tables become: (rdf.tablePrefix)spo,(rdf.tablePrefix)po,(rdf.tablePrefix)osp
 - ac.* : Accumulo connection parameters
-- rdf.format : See RDFFormat from openrdf, samples include (Trig, N-Triples, RDF/XML)
+- rdf.format : See RDFFormat from RDF4J, samples include (Trig, N-Triples, RDF/XML)
 - sc.use_freetext, sc.use_geo, sc.use_temporal, sc.use_entity : If any of these are set to true, statements will also be
     added to the enabled secondary indices.
 - sc.freetext.predicates, sc.geo.predicates, sc.temporal.predicates: If the associated indexer is enabled, these options specify
@@ -116,9 +116,9 @@
 The argument is the directory/file to load. This file needs to be loaded into HDFS before running. If loading a directory, all files should have the same RDF
 format.
 
-## Direct OpenRDF API
+## Direct RDF4J API
 
-Here is some sample code to load data directly through the OpenRDF API. (Loading N-Triples data)
+Here is some sample code to load data directly through the RDF4J API. (Loading N-Triples data)
 You will need at least `accumulo.rya-<version>`, `rya.api`, `rya.sail.impl` on the classpath and transitive dependencies. I find that Maven is the easiest way to get a project dependency tree set up.
 
 ``` JAVA
diff --git a/extras/rya.manual/src/site/markdown/mapreduce.md b/extras/rya.manual/src/site/markdown/mapreduce.md
index f99a78f..ec2bdc8 100644
--- a/extras/rya.manual/src/site/markdown/mapreduce.md
+++ b/extras/rya.manual/src/site/markdown/mapreduce.md
@@ -37,7 +37,7 @@
 
 - *RdfFileInputFormat* will read and parse RDF files of any format. Format must
   be explicitly specified. Reading and parsing is done asynchronously, enabling
-  large input files depending on how much information the openrdf parser itself
+  large input files depending on how much information the RDF4J parser itself
   needs to hold in memory in order to parse the file. (For example, large
   N-Triples files can be handled easily, but large XML files might require you
   to allocate more memory for the Map task.) Handles multiple files if given a
diff --git a/extras/rya.manual/src/site/markdown/overview.md b/extras/rya.manual/src/site/markdown/overview.md
index 46da734..2ce3dc8 100644
--- a/extras/rya.manual/src/site/markdown/overview.md
+++ b/extras/rya.manual/src/site/markdown/overview.md
@@ -21,6 +21,6 @@
 -->
 # Overview
 
-Apache Rya is a scalable RDF Store that is built on top of a Columnar Index Store (such as Accumulo). It is implemented as an extension to OpenRdf to provide easy query mechanisms (SPARQL, SERQL, etc) and Rdf data storage (RDF/XML, NTriples, etc).
+Apache Rya is a scalable RDF Store that is built on top of a Columnar Index Store (such as Accumulo). It is implemented as an extension to RDF4J to provide easy query mechanisms (SPARQL, SERQL, etc) and Rdf data storage (RDF/XML, NTriples, etc).
 
 Rya stands for RDF y(and) Accumulo.
diff --git a/extras/rya.manual/src/site/markdown/sm-addauth.md b/extras/rya.manual/src/site/markdown/sm-addauth.md
index 2f32422..eec0949 100644
--- a/extras/rya.manual/src/site/markdown/sm-addauth.md
+++ b/extras/rya.manual/src/site/markdown/sm-addauth.md
@@ -89,9 +89,9 @@
 
 //define and add statement
 String litdupsNS = "urn:test:litdups#";
-URI cpu = vf.createURI(litdupsNS, "cpu");
-URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-URI uri1 = vf.createURI(litdupsNS, "uri1");
+URI cpu = vf.createIRI(litdupsNS, "cpu");
+URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+URI uri1 = vf.createIRI(litdupsNS, "uri1");
 conn.add(cpu, loadPerc, uri1);
 conn.commit();
 
diff --git a/extras/rya.manual/src/site/markdown/sm-infer.md b/extras/rya.manual/src/site/markdown/sm-infer.md
index c2d112c..8021297 100644
--- a/extras/rya.manual/src/site/markdown/sm-infer.md
+++ b/extras/rya.manual/src/site/markdown/sm-infer.md
@@ -81,11 +81,11 @@
 First the code, which will load the following subclassof relationship: `UndergraduateStudent subclassof Student subclassof Person`. Then we will load into the tables three triples defining `UgradA rdf:type UndergraduateStudent, StudentB rdf:type Student, PersonC rdf:type Person`
 
 ``` JAVA
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "UndergraduateStudent"), RDFS.SUBCLASSOF, vf.createURI(litdupsNS, "Student")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "Student"), RDFS.SUBCLASSOF, vf.createURI(litdupsNS, "Person")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), RDF.TYPE, vf.createURI(litdupsNS, "UndergraduateStudent")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentB"), RDF.TYPE, vf.createURI(litdupsNS, "Student")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "PersonC"), RDF.TYPE, vf.createURI(litdupsNS, "Person")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "UndergraduateStudent"), RDFS.SUBCLASSOF, vf.createIRI(litdupsNS, "Student")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "Student"), RDFS.SUBCLASSOF, vf.createIRI(litdupsNS, "Person")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "UgradA"), RDF.TYPE, vf.createIRI(litdupsNS, "UndergraduateStudent")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "StudentB"), RDF.TYPE, vf.createIRI(litdupsNS, "Student")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "PersonC"), RDF.TYPE, vf.createIRI(litdupsNS, "Person")));
 conn.commit();
 ```
 
@@ -121,10 +121,10 @@
          FixedStatementPattern
             Var (name=79f261ee-e930-4af1-bc09-e637cc0affef)
             Var (name=c-79f261ee-e930-4af1-bc09-e637cc0affef, value=http://www.w3.org/2000/01/rdf-schema#subClassOf)
-            Var (name=-const-2, value=urn:test:litdups#Person, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#Person, anonymous)
          DoNotExpandSP
             Var (name=s)
-            Var (name=-const-1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
+            Var (name=_const_1, value=http://www.w3.org/1999/02/22-rdf-syntax-ns#type, anonymous)
             Var (name=79f261ee-e930-4af1-bc09-e637cc0affef)
 ```
 
@@ -140,13 +140,13 @@
 Sample Code:
 
 ``` JAVA
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "undergradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "degreeFrom")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "gradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "degreeFrom")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "degreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "memberOf")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "memberOf"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "associatedWith")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), vf.createURI(litdupsNS, "undergradDegreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradB"), vf.createURI(litdupsNS, "gradDegreeFrom"), vf.createURI(litdupsNS, "Yale")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "ProfessorC"), vf.createURI(litdupsNS, "memberOf"), vf.createURI(litdupsNS, "Harvard")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "undergradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createIRI(litdupsNS, "degreeFrom")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "gradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createIRI(litdupsNS, "degreeFrom")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "degreeFrom"), RDFS.SUBPROPERTYOF, vf.createIRI(litdupsNS, "memberOf")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "memberOf"), RDFS.SUBPROPERTYOF, vf.createIRI(litdupsNS, "associatedWith")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "UgradA"), vf.createIRI(litdupsNS, "undergradDegreeFrom"), vf.createIRI(litdupsNS, "Harvard")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "GradB"), vf.createIRI(litdupsNS, "gradDegreeFrom"), vf.createIRI(litdupsNS, "Yale")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "ProfessorC"), vf.createIRI(litdupsNS, "memberOf"), vf.createIRI(litdupsNS, "Harvard")));
 conn.commit();
 ```
 
@@ -183,11 +183,11 @@
          FixedStatementPattern
             Var (name=0bad69f3-4769-4293-8318-e828b23dc52a)
             Var (name=c-0bad69f3-4769-4293-8318-e828b23dc52a, value=http://www.w3.org/2000/01/rdf-schema#subPropertyOf)
-            Var (name=-const-1, value=urn:test:litdups#memberOf, anonymous)
+            Var (name=_const_1, value=urn:test:litdups#memberOf, anonymous)
          DoNotExpandSP
             Var (name=s)
             Var (name=0bad69f3-4769-4293-8318-e828b23dc52a)
-            Var (name=-const-2, value=urn:test:litdups#Harvard, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#Harvard, anonymous)
 ```
 
 ### InverseOf
@@ -197,10 +197,10 @@
 Code:
 
 ``` JAVA
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "degreeFrom"), OWL.INVERSEOF, vf.createURI(litdupsNS, "hasAlumnus")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), vf.createURI(litdupsNS, "degreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradB"), vf.createURI(litdupsNS, "degreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "Harvard"), vf.createURI(litdupsNS, "hasAlumnus"), vf.createURI(litdupsNS, "AlumC")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "degreeFrom"), OWL.INVERSEOF, vf.createIRI(litdupsNS, "hasAlumnus")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "UgradA"), vf.createIRI(litdupsNS, "degreeFrom"), vf.createIRI(litdupsNS, "Harvard")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "GradB"), vf.createIRI(litdupsNS, "degreeFrom"), vf.createIRI(litdupsNS, "Harvard")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "Harvard"), vf.createIRI(litdupsNS, "hasAlumnus"), vf.createIRI(litdupsNS, "AlumC")));
 conn.commit();
 ```
 
@@ -236,13 +236,13 @@
          ProjectionElem "s"
       InferUnion
          StatementPattern
-            Var (name=-const-1, value=urn:test:litdups#Harvard, anonymous)
-            Var (name=-const-2, value=urn:test:litdups#hasAlumnus, anonymous)
+            Var (name=_const_1, value=urn:test:litdups#Harvard, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#hasAlumnus, anonymous)
             Var (name=s)
          StatementPattern
             Var (name=s)
-            Var (name=-const-2, value=urn:test:litdups#degreeFrom)
-            Var (name=-const-1, value=urn:test:litdups#Harvard, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#degreeFrom)
+            Var (name=_const_1, value=urn:test:litdups#Harvard, anonymous)
 ```
 
 ### SymmetricProperty
@@ -252,9 +252,9 @@
 Code:
 
 ``` JAVA
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "friendOf"), RDF.TYPE, OWL.SYMMETRICPROPERTY));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "Bob"), vf.createURI(litdupsNS, "friendOf"), vf.createURI(litdupsNS, "Jeff")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "James"), vf.createURI(litdupsNS, "friendOf"), vf.createURI(litdupsNS, "Jeff")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "friendOf"), RDF.TYPE, OWL.SYMMETRICPROPERTY));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "Bob"), vf.createIRI(litdupsNS, "friendOf"), vf.createIRI(litdupsNS, "Jeff")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "James"), vf.createIRI(litdupsNS, "friendOf"), vf.createIRI(litdupsNS, "Jeff")));
 conn.commit();
 ```
 
@@ -287,11 +287,11 @@
       InferUnion
          StatementPattern
             Var (name=s)
-            Var (name=-const-1, value=urn:test:litdups#friendOf, anonymous)
-            Var (name=-const-2, value=urn:test:litdups#Bob, anonymous)
+            Var (name=_const_1, value=urn:test:litdups#friendOf, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#Bob, anonymous)
          StatementPattern
-            Var (name=-const-2, value=urn:test:litdups#Bob, anonymous)
-            Var (name=-const-1, value=urn:test:litdups#friendOf, anonymous)
+            Var (name=_const_2, value=urn:test:litdups#Bob, anonymous)
+            Var (name=_const_1, value=urn:test:litdups#friendOf, anonymous)
             Var (name=s)
 ```
 
@@ -302,12 +302,12 @@
 Code:
 
 ``` JAVA
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "subRegionOf"), RDF.TYPE, OWL.TRANSITIVEPROPERTY));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "Queens"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NYC")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "NYC"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NY")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "NY"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "US")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "US"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NorthAmerica")));
-conn.add(new StatementImpl(vf.createURI(litdupsNS, "NorthAmerica"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "World")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "subRegionOf"), RDF.TYPE, OWL.TRANSITIVEPROPERTY));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "Queens"), vf.createIRI(litdupsNS, "subRegionOf"), vf.createIRI(litdupsNS, "NYC")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "NYC"), vf.createIRI(litdupsNS, "subRegionOf"), vf.createIRI(litdupsNS, "NY")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "NY"), vf.createIRI(litdupsNS, "subRegionOf"), vf.createIRI(litdupsNS, "US")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "US"), vf.createIRI(litdupsNS, "subRegionOf"), vf.createIRI(litdupsNS, "NorthAmerica")));
+conn.add(new StatementImpl(vf.createIRI(litdupsNS, "NorthAmerica"), vf.createIRI(litdupsNS, "subRegionOf"), vf.createIRI(litdupsNS, "World")));
 conn.commit();
 ```
 
@@ -348,6 +348,6 @@
          ProjectionElem "s"
       TransitivePropertySP
          Var (name=s)
-         Var (name=-const-1, value=urn:test:litdups#subRegionOf, anonymous)
-         Var (name=-const-2, value=urn:test:litdups#NorthAmerica, anonymous)
+         Var (name=_const_1, value=urn:test:litdups#subRegionOf, anonymous)
+         Var (name=_const_2, value=urn:test:litdups#NorthAmerica, anonymous)
 ```
\ No newline at end of file
diff --git a/extras/rya.manual/src/site/markdown/sm-namedgraph.md b/extras/rya.manual/src/site/markdown/sm-namedgraph.md
index 6826345..766c98a 100644
--- a/extras/rya.manual/src/site/markdown/sm-namedgraph.md
+++ b/extras/rya.manual/src/site/markdown/sm-namedgraph.md
@@ -21,7 +21,7 @@
 -->
 # Named Graphs
 
-Named graphs are supported simply in the Rdf Store in a few ways. OpenRdf supports sending `contexts` as each triple is saved.
+Named graphs are supported simply in the Rdf Store in a few ways. RDF4J supports sending `contexts` as each triple is saved.
 
 ## Simple Named Graph Load and Query
 
@@ -116,19 +116,19 @@
          Join
             StatementPattern FROM NAMED CONTEXT
                Var (name=m)
-               Var (name=-const-2, value=http://www.example.org/vocabulary#name, anonymous)
+               Var (name=_const_2, value=http://www.example.org/vocabulary#name, anonymous)
                Var (name=name)
-               Var (name=-const-1, value=http://www.example.org/exampleDocument#G1, anonymous)
+               Var (name=_const_1, value=http://www.example.org/exampleDocument#G1, anonymous)
             StatementPattern FROM NAMED CONTEXT
                Var (name=m)
-               Var (name=-const-3, value=http://www.example.org/vocabulary#homepage, anonymous)
+               Var (name=_const_3, value=http://www.example.org/vocabulary#homepage, anonymous)
                Var (name=hp)
-               Var (name=-const-1, value=http://www.example.org/exampleDocument#G1, anonymous)
+               Var (name=_const_1, value=http://www.example.org/exampleDocument#G1, anonymous)
          StatementPattern FROM NAMED CONTEXT
             Var (name=m)
-            Var (name=-const-5, value=http://www.example.org/vocabulary#hasSkill, anonymous)
+            Var (name=_const_5, value=http://www.example.org/vocabulary#hasSkill, anonymous)
             Var (name=skill)
-            Var (name=-const-4, value=http://www.example.org/exampleDocument#G2, anonymous)
+            Var (name=_const_4, value=http://www.example.org/exampleDocument#G2, anonymous)
 ```
 
 ## Inserting named graph data through Sparql
diff --git a/extras/rya.manual/src/site/markdown/sm-simpleaqr.md b/extras/rya.manual/src/site/markdown/sm-simpleaqr.md
index 9188c2a..e6d03d4 100644
--- a/extras/rya.manual/src/site/markdown/sm-simpleaqr.md
+++ b/extras/rya.manual/src/site/markdown/sm-simpleaqr.md
@@ -53,9 +53,9 @@
 
 //define and add statement
 String litdupsNS = "urn:test:litdups#";
-URI cpu = vf.createURI(litdupsNS, "cpu");
-URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-URI uri1 = vf.createURI(litdupsNS, "uri1");
+URI cpu = vf.createIRI(litdupsNS, "cpu");
+URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+URI uri1 = vf.createIRI(litdupsNS, "uri1");
 conn.add(cpu, loadPerc, uri1);
 conn.commit();
 
diff --git a/extras/rya.manual/src/site/markdown/sm-sparqlquery.md b/extras/rya.manual/src/site/markdown/sm-sparqlquery.md
index 639ca02..ffa537a 100644
--- a/extras/rya.manual/src/site/markdown/sm-sparqlquery.md
+++ b/extras/rya.manual/src/site/markdown/sm-sparqlquery.md
@@ -53,11 +53,11 @@
 
 //define and add statements
 String litdupsNS = "urn:test:litdups#";
-URI cpu = vf.createURI(litdupsNS, "cpu");
-URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-URI uri1 = vf.createURI(litdupsNS, "uri1");
-URI pred2 = vf.createURI(litdupsNS, "pred2");
-URI uri2 = vf.createURI(litdupsNS, "uri2");
+URI cpu = vf.createIRI(litdupsNS, "cpu");
+URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+URI uri1 = vf.createIRI(litdupsNS, "uri1");
+URI pred2 = vf.createIRI(litdupsNS, "pred2");
+URI uri2 = vf.createIRI(litdupsNS, "uri2");
 conn.add(cpu, loadPerc, uri1);
 conn.commit();
 
diff --git a/extras/rya.manual/src/site/markdown/sm-updatedata.md b/extras/rya.manual/src/site/markdown/sm-updatedata.md
index f0fe664..6d5165f 100644
--- a/extras/rya.manual/src/site/markdown/sm-updatedata.md
+++ b/extras/rya.manual/src/site/markdown/sm-updatedata.md
@@ -21,7 +21,7 @@
 -->
 # Sparql Update
 
-OpenRDF supports the Sparql Update functionality. Here are a few samples:
+RDF4J supports the Sparql Update functionality. Here are a few samples:
 
 Remember, you have to use `RepositoryConnection.prepareUpdate(..)` to perform these queries
 
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/BaseRuleMapper.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/BaseRuleMapper.java
index aca2dbc..862d3bf 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/BaseRuleMapper.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/BaseRuleMapper.java
@@ -27,10 +27,6 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.log4j.Logger;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Or;
-import org.openrdf.query.algebra.ValueExpr;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.mr.MRUtils;
 import org.apache.rya.accumulo.mr.merge.MergeTool;
@@ -46,6 +42,9 @@
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
 import org.apache.rya.rdftriplestore.evaluation.ParallelEvaluationStrategyImpl;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Or;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
 
 /**
  * Take in rows from a table and range defined by query-based rules, convert the rows to
@@ -55,7 +54,7 @@
     /**
      * Hadoop counters for tracking the number of statements and/or raw rows that have been processed.
      */
-    public static enum Counters { STATEMENTS_COPIED, DIRECT_ROWS_COPIED };
+    public enum Counters { STATEMENTS_COPIED, DIRECT_ROWS_COPIED }
 
     private static final Logger log = Logger.getLogger(BaseRuleMapper.class);
 
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/MergeToolMapper.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/MergeToolMapper.java
index f5a9dae..8050ea2 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/MergeToolMapper.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/mappers/MergeToolMapper.java
@@ -40,9 +40,6 @@
 import org.apache.hadoop.io.Text;
 import org.apache.hadoop.mapreduce.Mapper;
 import org.apache.log4j.Logger;
-
-import com.google.common.base.Charsets;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRdfConstants;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
@@ -61,6 +58,8 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
 
+import com.google.common.base.Charsets;
+
 /**
  * Reads from the Parent and Child tables comparing their the keys and adds or deletes the keys
  * from the parent as necessary in order to reflect changes that the child made since the provided
@@ -116,7 +115,7 @@
     /**
      * The result of comparing a child key and parent key which determines what should be done with them.
      */
-    private static enum CompareKeysResult {
+    private enum CompareKeysResult {
         /**
          * Indicates that the child iterator should move to the next key in the child
          * table in order to be compared to the current key in the parent table.
@@ -147,7 +146,7 @@
         /**
          * Indicates that there are no more keys to compare in the child and parent tables.
          */
-        FINISHED;
+        FINISHED
     }
 
     /**
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloQueryRuleset.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloQueryRuleset.java
index caae9f5..aa0f615 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloQueryRuleset.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloQueryRuleset.java
@@ -28,12 +28,6 @@
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Range;
 import org.apache.hadoop.io.Text;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
@@ -43,6 +37,11 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.utils.NullableStatementImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * A {@link QueryRuleset} that additionally maps rules to ranges in Accumulo tables. Also enables
@@ -85,7 +84,7 @@
     private Map.Entry<TABLE_LAYOUT, ByteRange> getRange(final StatementPattern sp) throws IOException {
         final Var context = sp.getContextVar();
         final Statement stmt = new NullableStatementImpl((Resource) sp.getSubjectVar().getValue(),
-                (URI) sp.getPredicateVar().getValue(), sp.getObjectVar().getValue(),
+                (IRI) sp.getPredicateVar().getValue(), sp.getObjectVar().getValue(),
                 context == null ? null : (Resource) context.getValue());
         final RyaStatement rs = RdfToRyaConversions.convertStatement(stmt);
         final TriplePatternStrategy strategy = ryaContext.retrieveStrategy(rs);
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloRyaUtils.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloRyaUtils.java
index 5a3b928..8a02672 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloRyaUtils.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/AccumuloRyaUtils.java
@@ -60,14 +60,13 @@
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
-import org.openrdf.model.Literal;
-import org.openrdf.model.ValueFactory;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.ValueFactory;
 
 import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableSet;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Utility methods for an Accumulo Rya instance.
  */
@@ -123,7 +122,7 @@
      * @return the {@link RyraURI}.
      */
     public static RyaURI createRyaUri(final String namespace, final String localName) {
-        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createURI(namespace, localName));
+        return RdfToRyaConversions.convertURI(VALUE_FACTORY.createIRI(namespace, localName));
     }
 
     /**
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/CopyRule.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/CopyRule.java
index 2f78efa..2bf1e0e 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/CopyRule.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/CopyRule.java
@@ -22,30 +22,29 @@
 import java.util.Map;
 import java.util.UUID;
 
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.And;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.QueryModelNodeBase;
-import org.openrdf.query.algebra.QueryModelVisitor;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.EvaluationStrategy;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
 import org.apache.rya.accumulo.mr.merge.util.QueryRuleset.QueryRulesetException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.AbstractQueryModelNode;
+import org.eclipse.rdf4j.query.algebra.And;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * A rule that defines a subset of statements to copy at the RDF level. Consists of a
  * statement pattern and an optional filter expression.
  */
-public class CopyRule extends QueryModelNodeBase {
-    private static final ValueConstant TRUE = new ValueConstant(ValueFactoryImpl.getInstance().createLiteral(true));
+public class CopyRule extends AbstractQueryModelNode {
+    private static final ValueConstant TRUE = new ValueConstant(SimpleValueFactory.getInstance().createLiteral(true));
 
     private static final String SUFFIX = UUID.randomUUID().toString();
     private static final Var SUBJ_VAR = new Var("subject_" + SUFFIX);
@@ -101,7 +100,7 @@
     /**
      * Visitor that checks a tree for the existence of a given variable name.
      */
-    private static class VarSearchVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class VarSearchVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         boolean found = false;
         private final String queryVar;
         public VarSearchVisitor(final String queryVar) {
@@ -126,7 +125,7 @@
      * operators to preserve meaningful expressions while eliminating undefined
      * conditions.
      */
-    private static class RuleVisitor extends QueryModelVisitorBase<RuntimeException> {
+    private static class RuleVisitor extends AbstractQueryModelVisitor<RuntimeException> {
         private final CopyRule rule;
         RuleVisitor(final CopyRule rule) {
             this.rule = rule;
@@ -335,11 +334,8 @@
                 || (statement == null && other.statement != null)) {
             return false;
         }
-        if ((condition != null && !condition.equals(other.condition))
-                || (condition == null && other.condition != null)) {
-            return false;
-        }
-        return true;
+        return (condition == null || condition.equals(other.condition))
+                && (condition != null || other.condition == null);
     }
 
     @Override
diff --git a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/QueryRuleset.java b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/QueryRuleset.java
index 42109db..f20d16c 100644
--- a/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/QueryRuleset.java
+++ b/extras/rya.merger/src/main/java/org/apache/rya/accumulo/mr/merge/util/QueryRuleset.java
@@ -29,7 +29,6 @@
 import org.apache.commons.io.FileUtils;
 import org.apache.log4j.Logger;
 import org.apache.rya.accumulo.mr.merge.CopyTool;
-import org.apache.rya.accumulo.mr.merge.util.QueryRuleset.QueryRulesetException;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.inference.InferJoin;
@@ -44,30 +43,30 @@
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
 import org.apache.rya.rdftriplestore.utils.TransitivePropertySP;
 import org.apache.rya.sail.config.RyaSailFactory;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.UnsupportedQueryLanguageException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.ListMemberOperator;
-import org.openrdf.query.algebra.Or;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedTupleQuery;
-import org.openrdf.query.parser.QueryParserUtil;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.UnsupportedQueryLanguageException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.ListMemberOperator;
+import org.eclipse.rdf4j.query.algebra.Or;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedTupleQuery;
+import org.eclipse.rdf4j.query.parser.QueryParserUtil;
+import org.eclipse.rdf4j.sail.SailException;
 
 /**
  * Represents a set of {@link CopyRule} instances derived from a query. The ruleset determines a logical
@@ -93,7 +92,7 @@
     /**
      * Takes in a parsed query tree and extracts the rules defining relevant statements.
      */
-    private static class RulesetVisitor extends QueryModelVisitorBase<QueryRulesetException> {
+    private static class RulesetVisitor extends AbstractQueryModelVisitor<QueryRulesetException> {
         List<CopyRule> rules = new LinkedList<>();
         private final Set<Value> superclasses = new HashSet<>();
         private final Set<Value> superproperties = new HashSet<>();
@@ -257,11 +256,11 @@
             if (node instanceof InferUnion) {
                 // If this is the result of inference, search each tree for (non-standard) properties and add them
                 // to the set of properties for which to include schema information.
-                final QueryModelVisitorBase<QueryRulesetException> propertyVisitor = new QueryModelVisitorBase<QueryRulesetException>() {
+                final AbstractQueryModelVisitor<QueryRulesetException> propertyVisitor = new AbstractQueryModelVisitor<QueryRulesetException>() {
                     @Override
                     public void meet(final StatementPattern node) {
                         if (node.getPredicateVar().hasValue()) {
-                            final URI predValue = (URI) node.getPredicateVar().getValue();
+                            final IRI predValue = (IRI) node.getPredicateVar().getValue();
                             final String ns = predValue.getNamespace();
                             if (node instanceof FixedStatementPattern
                                     && (RDFS.SUBPROPERTYOF.equals(predValue) || OWL.EQUIVALENTPROPERTY.equals(predValue))) {
@@ -341,7 +340,7 @@
          * @param objValues Either null or a Set of Values that the object variable can have, tested using a filter
          * @throws QueryRulesetException if the rule can't be created
          */
-        private void addListRule(final Var subjVar, final Set<Value> subjValues, final URI predicate,
+        private void addListRule(final Var subjVar, final Set<Value> subjValues, final IRI predicate,
                 final Var objVar, final Set<Value> objValues) throws QueryRulesetException {
             ListMemberOperator subjCondition = null;
             ListMemberOperator objCondition = null;
@@ -463,7 +462,7 @@
         // consist of only variables (this would result in a rule  that matches every triple).
         // Needs to be done before inference, since inference rules may create such statement patterns
         // that are OK because they won'd be converted to rules directly.
-        te.visit(new QueryModelVisitorBase<QueryRulesetException>() {
+        te.visit(new AbstractQueryModelVisitor<QueryRulesetException>() {
             @Override
             public void meet(final StatementPattern node) throws QueryRulesetException {
                 if (!(node.getSubjectVar().hasValue() || node.getPredicateVar().hasValue() || node.getObjectVar().hasValue())) {
diff --git a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/CopyToolTest.java b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/CopyToolTest.java
index fcf4d9e..d785052 100644
--- a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/CopyToolTest.java
+++ b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/CopyToolTest.java
@@ -57,6 +57,7 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Assert;
@@ -64,8 +65,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Tests for {@link CopyTool}.
  */
diff --git a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/MergeToolTest.java b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/MergeToolTest.java
index 54e5b44..a1c731a 100644
--- a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/MergeToolTest.java
+++ b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/MergeToolTest.java
@@ -40,13 +40,6 @@
 import org.apache.accumulo.core.security.ColumnVisibility;
 import org.apache.hadoop.io.Text;
 import org.apache.log4j.Logger;
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.accumulo.mr.MRUtils;
@@ -59,6 +52,12 @@
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.persist.RyaDAOException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
 
 /**
  * Tests for {@link MergeTool}.
diff --git a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/RulesetCopyIT.java b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/RulesetCopyIT.java
index 1c83378..6a6a53c 100644
--- a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/RulesetCopyIT.java
+++ b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/RulesetCopyIT.java
@@ -49,35 +49,38 @@
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-import org.openrdf.model.Namespace;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
-import info.aduna.iteration.CloseableIteration;
 import junit.framework.Assert;
 
 public class RulesetCopyIT {
     private static final Logger log = Logger.getLogger(RulesetCopyIT.class);
 
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     private static final boolean IS_MOCK = false;
     private static final String CHILD_SUFFIX = MergeTool.CHILD_SUFFIX;
 
@@ -141,7 +144,7 @@
         return new RyaType(lit);
     }
 
-    private static RyaType literal(final String lit, final URI type) {
+    private static RyaType literal(final String lit, final IRI type) {
         return new RyaType(type, lit);
     }
 
@@ -226,7 +229,7 @@
                 makeArgument(MRUtils.AC_USERNAME_PROP + CHILD_SUFFIX, accumuloDualInstanceDriver.getChildUser()),
                 makeArgument(MRUtils.AC_PWD_PROP + CHILD_SUFFIX, CHILD_PASSWORD),
                 makeArgument(MRUtils.TABLE_PREFIX_PROPERTY + CHILD_SUFFIX, CHILD_TABLE_PREFIX),
-                makeArgument(MRUtils.AC_AUTH_PROP + CHILD_SUFFIX, accumuloDualInstanceDriver.getChildAuth() != null ? accumuloDualInstanceDriver.getChildAuth() : null),
+                makeArgument(MRUtils.AC_AUTH_PROP + CHILD_SUFFIX, accumuloDualInstanceDriver.getChildAuth()),
                 makeArgument(MRUtils.AC_ZK_PROP + CHILD_SUFFIX, accumuloDualInstanceDriver.getChildZooKeepers() != null ? accumuloDualInstanceDriver.getChildZooKeepers() : "localhost"),
                 makeArgument(CopyTool.CHILD_TOMCAT_URL_PROP, CHILD_TOMCAT_URL),
                 makeArgument(CopyTool.CREATE_CHILD_INSTANCE_TYPE_PROP, (IS_MOCK ? InstanceType.MOCK : InstanceType.MINI).toString()),
@@ -348,7 +351,7 @@
             statement("test:University1", "test:telephone", literal("555")),
             statement("test:FullProfessor1", "test:worksFor", "test:University1"),
             statement("test:FullProfessor1", "test:hired", literal("2001-01-01T04:01:02.000Z", XMLSchema.DATETIME)),
-            statement("test:University1", "geo:asWKT", literal("Point(-77.03524 38.889468)", new URIImpl("http://www.opengis.net/ont/geosparql#wktLiteral")))
+            statement("test:University1", "geo:asWKT", literal("Point(-77.03524 38.889468)", VF.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral")))
         };
         // These aren't solutions but should be copied:
         final RyaStatement[] copyStatements = {
diff --git a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/util/TestUtils.java b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/util/TestUtils.java
index 8901461..3b4358b 100644
--- a/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/util/TestUtils.java
+++ b/extras/rya.merger/src/test/java/org/apache/rya/accumulo/mr/merge/util/TestUtils.java
@@ -23,12 +23,12 @@
 
 import java.util.Date;
 
-import info.aduna.iteration.CloseableIteration;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 /**
  * Utility methods for testing merging/copying.
@@ -54,7 +54,7 @@
     /**
      * Indicates when something occurred: before or after.
      */
-    public static enum Occurrence {
+    public enum Occurrence {
         BEFORE(-1),
         AFTER(1);
 
@@ -82,7 +82,7 @@
      * is similar to {@code java.util.concurrent.TimeUnit} but adds the week,
      * month, and year units and only converts to milliseconds.
      */
-    public static enum CalendarUnit {
+    public enum CalendarUnit {
         MILLISECOND(1L),
         SECOND(1000L * MILLISECOND.getMilliseconds()),
         MINUTE(60L * SECOND.getMilliseconds()),
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreateFluoPcj.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreateFluoPcj.java
index a988bc7..731952a 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreateFluoPcj.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreateFluoPcj.java
@@ -57,11 +57,11 @@
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.calrissian.mango.collect.CloseableIterable;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
@@ -430,10 +430,10 @@
         }
 
         if (predVal != null) {
-            if(!(predVal instanceof URI)) {
+            if(!(predVal instanceof IRI)) {
                 throw new AssertionError("Predicate must be a URI.");
             }
-            predURI = RdfToRyaConversions.convertURI((URI) predVal);
+            predURI = RdfToRyaConversions.convertURI((IRI) predVal);
         }
 
         if (objVal != null ) {
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePeriodicQuery.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePeriodicQuery.java
index 24adde9..0e7c7cf 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePeriodicQuery.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/CreatePeriodicQuery.java
@@ -32,8 +32,8 @@
 import org.apache.rya.indexing.pcj.storage.PeriodicQueryStorageException;
 import org.apache.rya.periodic.notification.api.PeriodicNotificationClient;
 import org.apache.rya.periodic.notification.notification.PeriodicNotification;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/DeleteFluoPcj.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/DeleteFluoPcj.java
index e0123be..0aaed64 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/DeleteFluoPcj.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/DeleteFluoPcj.java
@@ -39,7 +39,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternIdManager;
 import org.apache.rya.indexing.pcj.fluo.app.query.UnsupportedQueryException;
 import org.apache.rya.indexing.pcj.fluo.app.util.FluoQueryUtils;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/ListFluoQueries.java b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/ListFluoQueries.java
index 8f5bbfe..170711f 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/ListFluoQueries.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.api/src/main/java/org/apache/rya/indexing/pcj/fluo/api/ListFluoQueries.java
@@ -28,9 +28,9 @@
 import org.apache.rya.api.client.CreatePCJ.QueryType;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryMetadataDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.QueryMetadata;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
 
 import com.google.common.base.Preconditions;
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml b/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
index b62beaf..1c6d189 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/pom.xml
@@ -79,8 +79,8 @@
             <artifactId>fluo-recipes-accumulo</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryrender</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryrender</artifactId>
         </dependency>
 
         <dependency>
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/AggregationResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/AggregationResultUpdater.java
index 4fbaad9..a3473ec 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/AggregationResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/AggregationResultUpdater.java
@@ -46,7 +46,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.AggregationMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -195,19 +195,24 @@
             // System.out.println("vois.accept(" + className + ".class, ");};};
                         ) {
                 // These classes are allowed to be deserialized. Others throw InvalidClassException.
-                vois.accept(AggregationState.class,
-                                AverageState.class,
-                                java.util.HashMap.class,
-                                java.math.BigInteger.class,
-                                java.lang.Number.class,
-                                java.math.BigDecimal.class,
-                                org.openrdf.query.impl.MapBindingSet.class,
-                                java.util.LinkedHashMap.class,
-                                org.openrdf.query.impl.BindingImpl.class,
-                                org.openrdf.model.impl.URIImpl.class,
-                                org.openrdf.model.impl.LiteralImpl.class,
-                                org.openrdf.model.impl.DecimalLiteralImpl.class,
-                                org.openrdf.model.impl.IntegerLiteralImpl.class);
+                vois.accept(
+                        AggregationState.class,
+                        AverageState.class,
+                        java.lang.Long.class,
+                        java.lang.Number.class,
+                        java.math.BigDecimal.class,
+                        java.math.BigInteger.class,
+                        java.util.HashMap.class,
+                        java.util.LinkedHashMap.class,
+                        org.eclipse.rdf4j.query.impl.MapBindingSet.class,
+                        org.eclipse.rdf4j.query.impl.SimpleBinding.class,
+                        org.eclipse.rdf4j.model.impl.SimpleIRI.class,
+                        org.eclipse.rdf4j.model.impl.SimpleLiteral.class,
+                        org.eclipse.rdf4j.model.impl.DecimalLiteral.class,
+                        org.eclipse.rdf4j.model.impl.IntegerLiteral.class,
+                        org.eclipse.rdf4j.model.impl.NumericLiteral.class,
+                        org.eclipse.rdf4j.query.AbstractBindingSet.class
+                    );
                 vois.accept("[B"); // Array of Bytes
                 final Object o = vois.readObject();
                 if(o instanceof AggregationState) {
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraph.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraph.java
index ed3c7ce..e0b5df9 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraph.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraph.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -27,10 +28,10 @@
 
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.model.BNode;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.BNodeImpl;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 import com.google.common.base.Preconditions;
 
@@ -85,7 +86,7 @@
     private Map<String, BNode> getBNodeMap() {
         Map<String, BNode> bNodeMap = new HashMap<>();
         for(String name: bNodeNames) {
-            bNodeMap.put(name, new BNodeImpl(UUID.randomUUID().toString()));
+            bNodeMap.put(name, SimpleValueFactory.getInstance().createBNode(UUID.randomUUID().toString()));
         }
         return bNodeMap;
     }
@@ -100,7 +101,7 @@
     
     /**
      * Creates a construct query graph represented as a Set of {@link RyaStatement}s 
-     * @param bs - VisiblityBindingSet used to build statement BindingSets
+     * @param bs - VisibilityBindingSet used to build statement BindingSets
      * @return - Set of RyaStatements that represent a construct query graph.  
      */
     public Set<RyaStatement> createGraphFromBindingSet(VisibilityBindingSet bs) {
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjection.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjection.java
index 1563bb5..fbf95fc 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjection.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjection.java
@@ -18,6 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.io.UnsupportedEncodingException;
 import java.util.Map;
 import java.util.Optional;
@@ -27,16 +28,18 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.openrdf.model.BNode;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.BNodeImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
@@ -44,9 +47,9 @@
 /**
  * This class projects a VisibilityBindingSet onto a RyaStatement. The Binding
  * {@link Value}s that get projected onto subject, predicate and object are
- * indicated by the names {@link ConstructProjection#getSubjectSourceVar()},
- * {@link ConstructProjection#getPredicateSourceVar()} and
- * {@link ConstructProjection#getObjectSourceVar()} and must satisfy standard
+ * indicated by the names {@link ConstructProjection#getSubjectSourceName()},
+ * {@link ConstructProjection#getPredicateSourceName()} and
+ * {@link ConstructProjection#getObjectSourceName()} and must satisfy standard
  * RDF constraints for RDF subjects, predicates and objects. The purpose of
  * projecting {@link BindingSet}s in this way is to provide functionality for
  * SPARQL Construct queries which create RDF statements from query results.
@@ -55,6 +58,7 @@
 public class ConstructProjection {
 
     private static final Logger log = Logger.getLogger(ConstructProjection.class);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private String subjName;
     private String predName;
     private String objName;
@@ -69,17 +73,17 @@
         Preconditions.checkNotNull(subjectVar);
         Preconditions.checkNotNull(predicateVar);
         Preconditions.checkNotNull(objectVar);
-        subjName = subjectVar.getName();
-        predName = predicateVar.getName();
-        objName = objectVar.getName();
+        subjName = VarNameUtils.createSimpleConstVarName(subjectVar);
+        predName = VarNameUtils.createSimpleConstVarName(predicateVar);
+        objName = VarNameUtils.createSimpleConstVarName(objectVar);
         Preconditions.checkNotNull(subjName);
         Preconditions.checkNotNull(predName);
         Preconditions.checkNotNull(objName);
         this.subjVar = subjectVar;
         this.predVar = predicateVar;
         this.objVar = objectVar;
-        if((subjVar.isAnonymous() || subjName.startsWith("-anon-")) && subjectVar.getValue() == null) {
-            subjValue = Optional.of(new BNodeImpl(""));
+        if ((subjVar.isAnonymous() || VarNameUtils.isAnonymous(subjName)) && subjectVar.getValue() == null) {
+            subjValue = Optional.of(VF.createBNode(""));
         } else {
             subjValue = Optional.ofNullable(subjectVar.getValue());
         }
@@ -93,12 +97,12 @@
 
     /**
      * Returns a Var with info about the Value projected onto the RyaStatement
-     * subject. If the org.openrdf.query.algebra.Var returned by this method is
+     * subject. If the org.eclipse.rdf4j.query.algebra.Var returned by this method is
      * not constant (as indicated by {@link Var#isConstant()}, then
      * {@link Var#getName()} is the Binding name that gets projected. If the Var
      * is constant, then {@link Var#getValue()} is assigned to the subject
      * 
-     * @return {@link org.openrdf.query.algebra.Var} containing info about
+     * @return {@link org.eclipse.rdf4j.query.algebra.Var} containing info about
      *         Binding that gets projected onto the subject
      */
     public String getSubjectSourceName() {
@@ -107,12 +111,12 @@
 
     /**
      * Returns a Var with info about the Value projected onto the RyaStatement
-     * predicate. If the org.openrdf.query.algebra.Var returned by this method
+     * predicate. If the org.eclipse.rdf4j.query.algebra.Var returned by this method
      * is not constant (as indicated by {@link Var#isConstant()}, then
      * {@link Var#getName()} is the Binding name that gets projected. If the Var
      * is constant, then {@link Var#getValue()} is assigned to the predicate
      * 
-     * @return {@link org.openrdf.query.algebra.Var} containing info about
+     * @return {@link org.eclipse.rdf4j.query.algebra.Var} containing info about
      *         Binding that gets projected onto the predicate
      */
     public String getPredicateSourceName() {
@@ -121,12 +125,12 @@
 
     /**
      * Returns a Var with info about the Value projected onto the RyaStatement
-     * object. If the org.openrdf.query.algebra.Var returned by this method is
+     * object. If the org.eclipse.rdf4j.query.algebra.Var returned by this method is
      * not constant (as indicated by {@link Var#isConstant()}, then
      * {@link Var#getName()} is the Binding name that gets projected. If the Var
      * is constant, then {@link Var#getValue()} is assigned to the object
      * 
-     * @return {@link org.openrdf.query.algebra.Var} containing info about
+     * @return {@link org.eclipse.rdf4j.query.algebra.Var} containing info about
      *         Binding that gets projected onto the object
      */
     public String getObjectSourceName() {
@@ -157,9 +161,9 @@
 
     /**
      * @return SubjectPattern representation of this ConstructProjection
-     *         containing the {@link ConstructProjection#subjectSourceVar},
-     *         {@link ConstructProjection#predicateSourceVar},
-     *         {@link ConstructProjection#objectSourceVar}
+     *         containing the {@link ConstructProjection#getSubjectSourceName},
+     *         {@link ConstructProjection#getPredicateSourceName},
+     *         {@link ConstructProjection#getObjectSourceName}
      */
     public StatementPattern getStatementPatternRepresentation() {
         return new StatementPattern(subjVar, predVar, objVar);
@@ -168,22 +172,22 @@
     /**
      * Projects a given BindingSet onto a RyaStatement. The subject, predicate,
      * and object are extracted from the input VisibilityBindingSet (if the
-     * subjectSourceVar, predicateSourceVar, objectSourceVar is resp.
-     * non-constant) and from the Var Value itself (if subjectSourceVar,
-     * predicateSource, objectSourceVar is resp. constant).
+     * getSubjectSourceName, getPredicateSourceName, getObjectSourceName is resp.
+     * non-constant) and from the Var Value itself (if getSubjectSourceName,
+     * predicateSource, getObjectSourceName is resp. constant).
      * 
      * 
      * @param vBs
      *            - Visibility BindingSet that gets projected onto an RDF
      *            Statement BindingSet with Binding names subject, predicate and
      *            object
-     * @param   bNodeMap - Optional Map used to pass {@link BNode}s for given variable names into
+     * @param   bNodes - Optional Map used to pass {@link BNode}s for given variable names into
      *          multiple {@link ConstructProjection}s.  This allows a ConstructGraph to create
      *          RyaStatements with the same BNode for a given variable name across multiple ConstructProjections.
      * @return - RyaStatement whose values are determined by
-     *         {@link ConstructProjection#getSubjectSourceVar()},
-     *         {@link ConstructProjection#getPredicateSourceVar()},
-     *         {@link ConstructProjection#getObjectSourceVar()}.
+     *         {@link ConstructProjection#getSubjectSourceName()},
+     *         {@link ConstructProjection#getPredicateSourceName()},
+     *         {@link ConstructProjection#getObjectSourceName()}.
      * 
      */
     public RyaStatement projectBindingSet(VisibilityBindingSet vBs, Map<String, BNode> bNodes) {
@@ -199,10 +203,10 @@
         Preconditions.checkNotNull(pred);
         Preconditions.checkNotNull(obj);
         Preconditions.checkArgument(subj instanceof Resource);
-        Preconditions.checkArgument(pred instanceof URI);
+        Preconditions.checkArgument(pred instanceof IRI);
 
         RyaURI subjType = RdfToRyaConversions.convertResource((Resource) subj);
-        RyaURI predType = RdfToRyaConversions.convertURI((URI) pred);
+        RyaURI predType = RdfToRyaConversions.convertURI((IRI) pred);
         RyaType objectType = RdfToRyaConversions.convertValue(obj);
 
         RyaStatement statement = new RyaStatement(subjType, predType, objectType);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
index 23d9fdf..d34b949 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FilterResultUpdater.java
@@ -28,28 +28,28 @@
 import org.apache.rya.indexing.pcj.fluo.app.util.FilterSerializer;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.evaluation.TripleSource;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStrategyImpl;
-import org.openrdf.query.algebra.evaluation.util.QueryEvaluationUtil;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategy;
+import org.eclipse.rdf4j.query.algebra.evaluation.util.QueryEvaluationUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * Updates the results of a Filter node when its child has added a new Binding
@@ -65,9 +65,9 @@
     /**
      * Is used to evaluate the conditions of a {@link Filter}.
      */
-    private static final EvaluationStrategyImpl evaluator = new EvaluationStrategyImpl(
+    private static final StrictEvaluationStrategy evaluator = new StrictEvaluationStrategy(
             new TripleSource() {
-                private final ValueFactory valueFactory = new ValueFactoryImpl();
+                private final ValueFactory valueFactory = SimpleValueFactory.getInstance();
 
                 @Override
                 public ValueFactory getValueFactory() {
@@ -77,12 +77,12 @@
                 @Override
                 public CloseableIteration<? extends Statement, QueryEvaluationException> getStatements(
                         final Resource arg0,
-                        final URI arg1,
+                        final IRI arg1,
                         final Value arg2,
                         final Resource... arg3) throws QueryEvaluationException {
                     throw new UnsupportedOperationException();
                 }
-            });
+            },null);
 
     /**
      * Updates the results of a Filter node when one of its child has added a
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverter.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverter.java
index 43a36de..ca98faf 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverter.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverter.java
@@ -23,38 +23,37 @@
 import static org.apache.rya.indexing.pcj.fluo.app.IncrementalUpdateConstants.TYPE_DELIM;
 import static org.apache.rya.indexing.pcj.fluo.app.IncrementalUpdateConstants.URI_TYPE;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
-import org.openrdf.model.BNode;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.BNodeImpl;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.apache.rya.api.domain.RyaSchema;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.VarNameUtils;
+import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 import com.google.common.base.Preconditions;
 
-import org.apache.rya.api.domain.RyaSchema;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.resolver.RdfToRyaConversions;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 
 /**
- * Contains method that convert between the Sesame representations of RDF
+ * Contains method that convert between the RDF4J representations of RDF
  * components and the Strings that are used by the Fluo PCJ application.
  */
 @DefaultAnnotation(NonNull.class)
 public class FluoStringConverter {
 
     /**
-     * Extract the {@link Binding} strings from a {@link BindingSet}'s string form.
+     * Extract the {@link BindingSet} strings from a {@link BindingSet}'s string form.
      *
      * @param bindingSetString - A {@link BindingSet} in its Fluo String form. (not null)
-     * @return The set's {@link Binding}s in Fluo String form. (not null)
+     * @return The set's {@link BindingSet}s in Fluo String form. (not null)
      */
     public static String[] toBindingStrings(final String bindingSetString) {
         checkNotNull(bindingSetString);
@@ -66,7 +65,7 @@
      * into the object version.
      *
      * @param patternString - The {@link StatementPattern} represented as a String. (not null)
-     * @return A {@link StatementPatter} built from the string.
+     * @return A {@link StatementPattern} built from the string.
      */
     public static StatementPattern toStatementPattern(final String patternString) {
         checkNotNull(patternString);
@@ -93,29 +92,30 @@
         checkNotNull(varString);
         final String[] varParts = varString.split(TYPE_DELIM);
         final String name = varParts[0];
-        
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+
         // The variable is a constant value.
         if(varParts.length > 1) {
             final String dataTypeString = varParts[1];
             if(dataTypeString.equals(URI_TYPE)) {
                 // Handle a URI object.
                 Preconditions.checkArgument(varParts.length == 2);
-                final String valueString = name.substring("-const-".length());
-                final Var var = new Var(name, new URIImpl(valueString));
+                final String valueString = VarNameUtils.removeConstant(name);
+                final Var var = new Var(name, vf.createIRI(valueString));
                 var.setConstant(true);
                 return var;
-            } else if(dataTypeString.equals(RyaSchema.BNODE_NAMESPACE)) { 
+            } else if(dataTypeString.equals(RyaSchema.BNODE_NAMESPACE)) {
                 // Handle a BNode object
                 Preconditions.checkArgument(varParts.length == 3);
-                Var var = new Var(name);
-                var.setValue(new BNodeImpl(varParts[2]));
+                final Var var = new Var(name);
+                var.setValue(vf.createBNode(varParts[2]));
                 return var;
             } else {
                 // Handle a Literal Value.
                 Preconditions.checkArgument(varParts.length == 2);
-                final String valueString = name.substring("-const-".length());
-                final URI dataType = new URIImpl(dataTypeString);
-                final Literal value = new LiteralImpl(valueString, dataType);
+                final String valueString = VarNameUtils.removeConstant(name);
+                final IRI dataType = vf.createIRI(dataTypeString);
+                final Literal value = vf.createLiteral(valueString, dataType);
                 final Var var = new Var(name, value);
                 var.setConstant(true);
                 return var;
@@ -141,24 +141,28 @@
         final Var subjVar = sp.getSubjectVar();
         String subj = subjVar.getName();
         if(subjVar.getValue() != null) {
-            Value subjValue = subjVar.getValue();
+            final Value subjValue = subjVar.getValue();
+            subj = VarNameUtils.createSimpleConstVarName(subjVar);
             if (subjValue instanceof BNode ) {
-                subj = subj + TYPE_DELIM + RyaSchema.BNODE_NAMESPACE + TYPE_DELIM + ((BNode) subjValue).getID(); 
+                subj = subj + TYPE_DELIM + RyaSchema.BNODE_NAMESPACE + TYPE_DELIM + ((BNode) subjValue).getID();
             } else {
                 subj = subj + TYPE_DELIM + URI_TYPE;
             }
-        } 
+        }
 
         final Var predVar = sp.getPredicateVar();
         String pred = predVar.getName();
         if(predVar.getValue() != null) {
+            pred = VarNameUtils.createSimpleConstVarName(predVar);
             pred = pred + TYPE_DELIM + URI_TYPE;
         }
 
         final Var objVar = sp.getObjectVar();
         String obj = objVar.getName();
         if (objVar.getValue() != null) {
-            final RyaType rt = RdfToRyaConversions.convertValue(objVar.getValue());
+            final Value objValue = objVar.getValue();
+            obj = VarNameUtils.createSimpleConstVarName(objVar);
+            final RyaType rt = RdfToRyaConversions.convertValue(objValue);
             obj =  obj + TYPE_DELIM + rt.getDataType().stringValue();
         }
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/PeriodicQueryUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/PeriodicQueryUpdater.java
index 5171eee..e487802 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/PeriodicQueryUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/PeriodicQueryUpdater.java
@@ -29,11 +29,11 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.PeriodicQueryMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 /**
  * This class adds the appropriate BinId Binding to each BindingSet that it processes.  The BinIds
@@ -44,7 +44,7 @@
 public class PeriodicQueryUpdater extends AbstractNodeUpdater {
 
     private static final Logger log = Logger.getLogger(PeriodicQueryUpdater.class);
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final VisibilityBindingSetSerDe BS_SERDE = new VisibilityBindingSetSerDe();
 
     /**
@@ -61,7 +61,7 @@
         for(Long id: binIds) {
             //create binding set value bytes
             QueryBindingSet binnedBs = new QueryBindingSet(bs);
-            binnedBs.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, vf.createLiteral(id));
+            binnedBs.addBinding(IncrementalUpdateConstants.PERIODIC_BIN_ID, VF.createLiteral(id));
             VisibilityBindingSet visibilityBindingSet = new VisibilityBindingSet(binnedBs, bs.getVisibility());
             Bytes periodicBsBytes = BS_SERDE.serialize(visibilityBindingSet);
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ProjectionResultUpdater.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ProjectionResultUpdater.java
index eacbf99..8f94e36 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ProjectionResultUpdater.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/ProjectionResultUpdater.java
@@ -29,7 +29,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.util.BindingSetUtil;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/batch/JoinBatchInformation.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/batch/JoinBatchInformation.java
index ace9e76..e57ec88 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/batch/JoinBatchInformation.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/batch/JoinBatchInformation.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.Objects;
 
 import org.apache.fluo.api.data.Column;
@@ -24,7 +25,7 @@
 import org.apache.rya.api.function.join.LazyJoiningIterator.Side;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata.JoinType;
-import org.openrdf.query.Binding;
+import org.eclipse.rdf4j.query.Binding;
 
 /**
  * This class updates join results based on parameters specified for the join's
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/kafka/KryoVisibilityBindingSetSerializer.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/kafka/KryoVisibilityBindingSetSerializer.java
index f4182e0..ee79e4a 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/kafka/KryoVisibilityBindingSetSerializer.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/export/kafka/KryoVisibilityBindingSetSerializer.java
@@ -28,15 +28,14 @@
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.ListBindingSet;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.ListBindingSet;
 
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
@@ -54,6 +53,7 @@
             return kryo;
         };
     };
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * Deserialize a VisibilityBindingSet using Kyro lib. Exporting results of queries.
@@ -111,13 +111,12 @@
         // Do nothing.
     }
 
-    private static Value makeValue(final String valueString, final URI typeURI) {
+    private static Value makeValue(final String valueString, final IRI typeURI) {
         // Convert the String Value into a Value.
-        final ValueFactory valueFactory = ValueFactoryImpl.getInstance();
         if (typeURI.equals(XMLSchema.ANYURI)) {
-            return valueFactory.createURI(valueString);
+            return VF.createIRI(valueString);
         } else {
-            return valueFactory.createLiteral(valueString, typeURI);
+            return VF.createLiteral(valueString, typeURI);
         }
     }
 
@@ -135,7 +134,7 @@
                 output.writeString(binding.getName());
                 final RyaType ryaValue = RdfToRyaConversions.convertValue(binding.getValue());
                 final String valueString = ryaValue.getData();
-                final URI type = ryaValue.getDataType();
+                final IRI type = ryaValue.getDataType();
                 output.writeString(valueString);
                 output.writeString(type.toString());
             }
@@ -150,7 +149,7 @@
             for (int i = bindingCount; i > 0; i--) {
                 namesList.add(input.readString());
                 final String valueString = input.readString();
-                final URI type = new URIImpl(input.readString());
+                final IRI type = VF.createIRI(input.readString());
                 valuesList.add(makeValue(valueString, type));
             }
             final BindingSet bindingSet = new ListBindingSet(namesList, valuesList);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/AggregationObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/AggregationObserver.java
index e806b15..0823b70 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/AggregationObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/AggregationObserver.java
@@ -30,7 +30,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.BindingSetRow;
 import org.apache.rya.indexing.pcj.fluo.app.query.AggregationMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
index e4c30e8..ee727ce 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/FilterObserver.java
@@ -28,7 +28,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.FilterMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Notified when the results of a Filter have been updated to include a new
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
index 4e5511f..63f3eb8 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/JoinObserver.java
@@ -28,7 +28,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Notified when the results of a Join have been updated to include a new
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
index 4db1840..d59d64b 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/StatementPatternObserver.java
@@ -28,7 +28,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.VisibilityBindingSetSerDe;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 /**
  * Notified when the results of a Statement Pattern have been updated to include
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
index a6ee325..751cc6e 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/observers/TripleObserver.java
@@ -28,6 +28,7 @@
 import org.apache.fluo.api.data.Column;
 import org.apache.fluo.api.observer.AbstractObserver;
 import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.fluo.app.IncUpdateDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
@@ -140,7 +141,7 @@
 
         // Extract the binding names and values.
         for(int i = 0; i < 3; i ++) {
-            if(patternArray[i].startsWith("-const-")) {
+            if(VarNameUtils.isConstant(patternArray[i])) {
                 // If a constant value does not match, then the triple does not match the pattern.
                 if(!patternArray[i].substring(7).equals(tripleArray[i])) {
                     return "";
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/ConstructQueryMetadata.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/ConstructQueryMetadata.java
index 6bf968e..ea0499b 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/ConstructQueryMetadata.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/ConstructQueryMetadata.java
@@ -1,5 +1,3 @@
-package org.apache.rya.indexing.pcj.fluo.app.query;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,10 +16,12 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.indexing.pcj.fluo.app.query;
+
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.rya.indexing.pcj.fluo.app.ConstructGraph;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryNode.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryNode.java
index f1ade59..61ebcc6 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryNode.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryNode.java
@@ -23,13 +23,13 @@
 
 import org.apache.commons.lang3.builder.EqualsBuilder;
 import org.apache.rya.indexing.pcj.fluo.app.util.PeriodicQueryUtil;
-import org.openrdf.query.algebra.QueryModelVisitor;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.QueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 
-import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 /**
  * This is a {@link UnaryTupleOperator} that gets placed in the parsed query
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/SparqlFluoQueryBuilder.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/SparqlFluoQueryBuilder.java
index 57ae9d2..e311846 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/SparqlFluoQueryBuilder.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/query/SparqlFluoQueryBuilder.java
@@ -31,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
@@ -42,6 +43,7 @@
 
 import org.apache.rya.api.client.CreatePCJ.ExportStrategy;
 import org.apache.rya.api.client.CreatePCJ.QueryType;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.function.aggregation.AggregationElement;
 import org.apache.rya.api.function.aggregation.AggregationType;
 import org.apache.rya.indexing.pcj.fluo.app.ConstructGraph;
@@ -56,33 +58,34 @@
 import org.apache.rya.indexing.pcj.fluo.app.util.PeriodicQueryUtil;
 import org.apache.rya.indexing.pcj.fluo.app.util.VariableOrderUpdateVisitor.UpdateAction;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.BNodeImpl;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.AggregateOperator;
-import org.openrdf.query.algebra.BNodeGenerator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Group;
-import org.openrdf.query.algebra.GroupElem;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.Reduced;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.AggregateOperator;
+import org.eclipse.rdf4j.query.algebra.BNodeGenerator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Group;
+import org.eclipse.rdf4j.query.algebra.GroupElem;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.Reduced;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
@@ -103,6 +106,7 @@
     private String queryId;
     private NodeIds nodeIds;
     private Optional<Integer> joinBatchSize = Optional.empty();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     //Default behavior is to export to Kafka - subject to change when user can
     //specify their own export strategy
@@ -283,7 +287,7 @@
      * the node to a {@link FluoQuery.Builder}. This information is used by the
      * application's observers to incrementally update a PCJ.
      */
-    public static class NewQueryVisitor extends QueryModelVisitorBase<RuntimeException> {
+    public static class NewQueryVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private final NodeIds nodeIds;
         private final FluoQuery.Builder fluoQueryBuilder;
@@ -291,8 +295,6 @@
         /**
          * Constructs an instance of {@link NewQueryVisitor}.
          *
-         * @param sparql - The SPARQL query whose structure will be represented
-         *   within a Fluo application. (not null)
          * @param fluoQueryBuilder - The builder that will be updated by this
          *   vistior to include metadata about each of the query nodes. (not null)
          * @param nodeIds - The NodeIds object is passed in so that other parts
@@ -341,7 +343,7 @@
                         final String resultBindingName = groupElem.getName();
 
                         final AtomicReference<String> aggregatedBindingName = new AtomicReference<>();
-                        groupElem.visitChildren(new QueryModelVisitorBase<RuntimeException>() {
+                        groupElem.visitChildren(new AbstractQueryModelVisitor<RuntimeException>() {
                             @Override
                             public void meet(final Var node) {
                                 aggregatedBindingName.set( node.getName() );
@@ -529,7 +531,8 @@
                 // update variable order of this node and all ancestors to
                 // include BIN_ID binding as
                 // first variable in the ordering
-                FluoQueryUtils.updateVarOrders(fluoQueryBuilder, UpdateAction.AddVariable, Arrays.asList(IncrementalUpdateConstants.PERIODIC_BIN_ID), periodicId);
+                FluoQueryUtils.updateVarOrders(fluoQueryBuilder, UpdateAction.AddVariable,
+                        Collections.singletonList(IncrementalUpdateConstants.PERIODIC_BIN_ID), periodicId);
                 // Walk to the next node.
                 node.getArg().visit(this);
             }
@@ -633,7 +636,7 @@
                     final Value value = ((ValueConstant) expr).getValue();
                     valueMap.put(name, value);
                 } else if(expr instanceof BNodeGenerator) {
-                    valueMap.put(name, new BNodeImpl(UUID.randomUUID().toString()));
+                    valueMap.put(name, VF.createBNode(UUID.randomUUID().toString()));
                 }
             }
 
@@ -683,7 +686,7 @@
             final Set<String> vars = Sets.newHashSet();
 
             for(final String bindingName : node.getBindingNames()) {
-                if(!bindingName.startsWith("-const-")) {
+                if (!VarNameUtils.isConstant(bindingName)) {
                     vars.add(bindingName);
                 }
             }
@@ -784,7 +787,7 @@
         builder.setQueryType(locator.getQueryType());
     }
 
-    public static class QueryMetadataLocator extends QueryModelVisitorBase<Exception> {
+    public static class QueryMetadataLocator extends AbstractQueryModelVisitor<Exception> {
 
         private VariableOrder varOrder;
         private QueryType queryType;
@@ -850,13 +853,13 @@
           return getConstructGraphVarOrder(projections);
       }
 
-    private static VariableOrder getConstructGraphVarOrder(final List<ProjectionElemList> projections) {
+    private static VariableOrder getConstructGraphVarOrder(List<ProjectionElemList> projections) {
         final Set<String> varOrders = new HashSet<>();
 
         for(final ProjectionElemList elems: projections) {
             for(final ProjectionElem elem: elems.getElements()) {
                 final String name = elem.getSourceName();
-                if(!name.startsWith("-const-") && !name.startsWith("-anon-")) {
+                if (!VarNameUtils.isConstant(name) && !VarNameUtils.isAnonymous(name)) {
                     varOrders.add(name);
                 }
             }
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunction.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunction.java
index e4485e0..1e3b250 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunction.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunction.java
@@ -30,7 +30,7 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Value;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingSetUtil.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingSetUtil.java
index 30f026c..9321c1e 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingSetUtil.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingSetUtil.java
@@ -21,9 +21,9 @@
 import static java.util.Objects.requireNonNull;
 
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 
 /**
  * A utility class that defines functions that make it easier to work with {@link BindingSet} objects.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializer.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializer.java
index 6c99809..2a59315 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializer.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializer.java
@@ -21,15 +21,15 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.SingletonSet;
-import org.openrdf.query.algebra.evaluation.function.Function;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.ParsedTupleQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.SingletonSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.ParsedTupleQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
 
 /**
  * Class for creating a String representation a given Filter, and for
@@ -85,7 +85,7 @@
         }
     }
     
-    public static class FilterVisitor extends QueryModelVisitorBase<RuntimeException> {
+    public static class FilterVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private Set<Filter> filters;
         
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/PeriodicQueryUtil.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/PeriodicQueryUtil.java
index 406ba4c..17fedf7 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/PeriodicQueryUtil.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/PeriodicQueryUtil.java
@@ -31,26 +31,26 @@
 import org.apache.rya.indexing.pcj.fluo.app.NodeType;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.PeriodicQueryNode;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.Group;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.Reduced;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.Group;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.Reduced;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Preconditions;
 
@@ -60,12 +60,12 @@
  */
 public class PeriodicQueryUtil {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     public static final String PeriodicQueryURI = "http://org.apache.rya/function#periodic";
     public static final String temporalNameSpace = "http://www.w3.org/2006/time#";
-    public static final URI DAYS = vf.createURI("http://www.w3.org/2006/time#days");
-    public static final URI HOURS = vf.createURI("http://www.w3.org/2006/time#hours");
-    public static final URI MINUTES = vf.createURI("http://www.w3.org/2006/time#minutes");
+    public static final IRI DAYS = VF.createIRI("http://www.w3.org/2006/time#days");
+    public static final IRI HOURS = VF.createIRI("http://www.w3.org/2006/time#hours");
+    public static final IRI MINUTES = VF.createIRI("http://www.w3.org/2006/time#minutes");
 
     /**
      * Returns a PeriodicQueryNode for all {@link FunctionCall}s that represent PeriodicQueryNodes, otherwise
@@ -105,7 +105,7 @@
      * Locates Filter containing FunctionCall with PeriodicQuery info and
      * replaces that Filter with a PeriodicQueryNode.
      */
-    public static class PeriodicQueryNodeVisitor extends QueryModelVisitorBase<RuntimeException> {
+    public static class PeriodicQueryNodeVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         private int count = 0;
         private PeriodicQueryNode periodicNode;
@@ -145,7 +145,7 @@
      * whose variable order needs to be changed when the PeriodicQueryMetadata
      * is added.
      */
-    public static class PeriodicQueryNodeRelocator extends QueryModelVisitorBase<RuntimeException> {
+    public static class PeriodicQueryNodeRelocator extends AbstractQueryModelVisitor<RuntimeException> {
 
         private UnaryTupleOperator relocationParent;
 
@@ -261,8 +261,8 @@
     }
 
     private static TimeUnit getTimeUnit(ValueConstant val) {
-        Preconditions.checkArgument(val.getValue() instanceof URI);
-        URI uri = (URI) val.getValue();
+        Preconditions.checkArgument(val.getValue() instanceof IRI);
+        IRI uri = (IRI) val.getValue();
         Preconditions.checkArgument(uri.getNamespace().equals(temporalNameSpace));
 
         switch (uri.getLocalName()) {
@@ -282,7 +282,7 @@
         Preconditions.checkArgument(val instanceof Literal);
         Literal literal = (Literal) val;
         String stringVal = literal.getLabel();
-        URI dataType = literal.getDatatype();
+        IRI dataType = literal.getDatatype();
         Preconditions.checkArgument(dataType.equals(XMLSchema.DECIMAL) || dataType.equals(XMLSchema.DOUBLE)
                 || dataType.equals(XMLSchema.FLOAT) || dataType.equals(XMLSchema.INTEGER) || dataType.equals(XMLSchema.INT));
         return Double.parseDouble(stringVal);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/RowKeyUtil.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/RowKeyUtil.java
index ffb2320..d7fa626 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/RowKeyUtil.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/main/java/org/apache/rya/indexing/pcj/fluo/app/util/RowKeyUtil.java
@@ -24,7 +24,7 @@
 import org.apache.rya.indexing.pcj.fluo.app.IncrementalUpdateConstants;
 import org.apache.rya.indexing.pcj.storage.accumulo.BindingSetStringConverter;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Charsets;
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTest.java
index bab8cde..c52a72a 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTest.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -28,21 +29,21 @@
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Sets;
 
 public class ConstructGraphTest {
 
-    private ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     
     @Test
     public void testConstructGraph() throws MalformedQueryException, UnsupportedEncodingException {
@@ -54,9 +55,9 @@
         ConstructGraph graph = new ConstructGraph(patterns);
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("x", vf.createURI("uri:Joe"));
-        bs.addBinding("y", vf.createURI("uri:Bob"));
-        bs.addBinding("z", vf.createURI("uri:BurgerShack"));
+        bs.addBinding("x", VF.createIRI("uri:Joe"));
+        bs.addBinding("y", VF.createIRI("uri:Bob"));
+        bs.addBinding("z", VF.createIRI("uri:BurgerShack"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs,"FOUO");
         Set<RyaStatement> statements = graph.createGraphFromBindingSet(vBs);
         
@@ -77,8 +78,8 @@
         ConstructGraph graph = new ConstructGraph(patterns);
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("x", vf.createURI("uri:Joe"));
-        bs.addBinding("z", vf.createURI("uri:BurgerShack"));
+        bs.addBinding("x", VF.createIRI("uri:Joe"));
+        bs.addBinding("z", VF.createIRI("uri:BurgerShack"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs, "FOUO");
         Set<RyaStatement> statements = graph.createGraphFromBindingSet(vBs);
         Set<RyaStatement> statements2 = graph.createGraphFromBindingSet(vBs);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTestUtils.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTestUtils.java
index a12b6de..d505b33 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTestUtils.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructGraphTestUtils.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -26,8 +27,8 @@
 import org.apache.rya.api.domain.RyaSubGraph;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
+import org.eclipse.rdf4j.model.Statement;
 import org.junit.Assert;
-import org.openrdf.model.Statement;
 
 import com.google.common.base.Objects;
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjectionTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjectionTest.java
index 975c527..f884b7b 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjectionTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/ConstructProjectionTest.java
@@ -1,4 +1,5 @@
 package org.apache.rya.indexing.pcj.fluo.app;
+
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,6 +18,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static org.junit.Assert.assertEquals;
 
 import java.io.UnsupportedEncodingException;
@@ -26,22 +28,23 @@
 
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.BNode;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class ConstructProjectionTest {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     
     @Test
     public void testConstructProjectionProjectSubj() throws MalformedQueryException, UnsupportedEncodingException {
@@ -53,7 +56,7 @@
         ConstructProjection projection = new ConstructProjection(patterns.get(0));
         
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("x", vf.createURI("uri:Joe"));
+        bs.addBinding("x", VF.createIRI("uri:Joe"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs, "FOUO");
         RyaStatement statement = projection.projectBindingSet(vBs, new HashMap<>());
         
@@ -74,7 +77,7 @@
         ConstructProjection projection = new ConstructProjection(patterns.get(0));
         
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("p", vf.createURI("uri:worksWith"));
+        bs.addBinding("p", VF.createIRI("uri:worksWith"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
         RyaStatement statement = projection.projectBindingSet(vBs, new HashMap<>());
         
@@ -95,11 +98,11 @@
         ConstructProjection projection = new ConstructProjection(patterns.get(0));
         
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("o", vf.createURI("uri:Bob"));
+        bs.addBinding("o", VF.createIRI("uri:Bob"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
-        BNode bNode = vf.createBNode();
+        BNode bNode = VF.createBNode();
         Map<String, BNode> bNodeMap = new HashMap<>();
-        bNodeMap.put("-anon-1", bNode);
+        bNodeMap.put(VarNameUtils.prependAnonymous("1"), bNode);
         RyaStatement statement = projection.projectBindingSet(vBs,bNodeMap);
         
         RyaStatement expected = new RyaStatement(RdfToRyaConversions.convertResource(bNode), new RyaURI("uri:talksTo"), new RyaURI("uri:Bob"));
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverterTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverterTest.java
index 60e1bc1..c49a06c 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverterTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/FluoStringConverterTest.java
@@ -18,28 +18,31 @@
  */
 package org.apache.rya.indexing.pcj.fluo.app;
 
+import static org.apache.rya.api.domain.VarNameUtils.prependConstant;
+import static org.apache.rya.indexing.pcj.fluo.app.IncrementalUpdateConstants.TYPE_DELIM;
 import static org.junit.Assert.assertEquals;
 
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Test;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
 
 /**
  * Tests the methods of {@link FluoStringConverterTest}.
  */
 public class FluoStringConverterTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	@Test
 	public void statementPatternToString() throws MalformedQueryException {
         // Setup a StatementPattern that represents "?x <http://worksAt> <http://Chipotle>."
         final Var subject = new Var("x");
-        final Var predicate = new Var("-const-http://worksAt", new URIImpl("http://worksAt"));
+        final Var predicate = new Var(prependConstant("http://worksAt"), VF.createIRI("http://worksAt"));
         predicate.setConstant(true);
-        final Var object = new Var("-const-http://Chipotle", new URIImpl("http://Chipotle"));
+        final Var object = new Var(prependConstant("http://Chipotle"), VF.createIRI("http://Chipotle"));
         object.setConstant(true);
         final StatementPattern pattern = new StatementPattern(subject, predicate, object);
 
@@ -48,8 +51,8 @@
 
         // Ensure it converted to the expected result.
         final String expected = "x:::" +
-                "-const-http://worksAt<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
-                "-const-http://Chipotle<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+                prependConstant("http://worksAt<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::") +
+                prependConstant("http://Chipotle<<~>>http://www.w3.org/2001/XMLSchema#anyURI");
 
         assertEquals(spString, expected);
 	}
@@ -58,17 +61,17 @@
     public void stringToStatementPattern() {
         // Setup the String representation of a statement pattern.
         final String patternString = "x:::" +
-                "-const-http://worksAt<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::" +
-                "-const-http://Chipotle<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+                prependConstant("http://worksAt<<~>>http://www.w3.org/2001/XMLSchema#anyURI:::") +
+                prependConstant("http://Chipotle<<~>>http://www.w3.org/2001/XMLSchema#anyURI");
 
         // Convert it to a StatementPattern.
         final StatementPattern statementPattern = FluoStringConverter.toStatementPattern(patternString);
 
         // Enusre it converted to the expected result.
         final Var subject = new Var("x");
-        final Var predicate = new Var("-const-http://worksAt", new URIImpl("http://worksAt"));
+        final Var predicate = new Var(prependConstant("http://worksAt"), VF.createIRI("http://worksAt"));
         predicate.setConstant(true);
-        final Var object = new Var("-const-http://Chipotle", new URIImpl("http://Chipotle"));
+        final Var object = new Var(prependConstant("http://Chipotle"), VF.createIRI("http://Chipotle"));
         object.setConstant(true);
         final StatementPattern expected = new StatementPattern(subject, predicate, object);
 
@@ -78,13 +81,13 @@
     @Test
     public void toVar_uri() {
         // Setup the string representation of the variable.
-        final String varString = "-const-http://Chipotle<<~>>http://www.w3.org/2001/XMLSchema#anyURI";
+        final String varString = String.format(prependConstant("http://Chipotle%s%s"),TYPE_DELIM,XMLSchema.ANYURI );
 
         // Convert it to a Var object.
         final Var var = FluoStringConverter.toVar(varString);
 
         // Ensure it converted to the expected result.
-        final Var expected = new Var("-const-http://Chipotle", new URIImpl("http://Chipotle"));
+        final Var expected = new Var(prependConstant("http://Chipotle"), VF.createIRI("http://Chipotle"));
         expected.setConstant(true);
 
         assertEquals(expected, var);
@@ -93,13 +96,13 @@
     @Test
     public void toVar_int() throws MalformedQueryException {
         // Setup the string representation of the variable.
-        final String varString = "-const-5<<~>>http://www.w3.org/2001/XMLSchema#integer";
+        final String varString = prependConstant("5<<~>>http://www.w3.org/2001/XMLSchema#integer");
 
         // Convert it to a Var object.
         final Var result = FluoStringConverter.toVar(varString);
 
         // Ensure it converted to the expected result.
-        final Var expected = new Var("-const-5", new LiteralImpl("5", XMLSchema.INTEGER));
+        final Var expected = new Var(prependConstant("5"), VF.createLiteral("5", XMLSchema.INTEGER));
         expected.setConstant(true);
 
         assertEquals(expected, result);
@@ -108,13 +111,13 @@
     @Test
     public void toVar_string() {
         // Setup the string representation of the variable.
-        final String varString = "-const-Chipotle<<~>>http://www.w3.org/2001/XMLSchema#string";
+        final String varString = prependConstant("Chipotle<<~>>http://www.w3.org/2001/XMLSchema#string");
 
         // Convert it to a Var object.
         final Var result = FluoStringConverter.toVar(varString);
 
         // Ensure it converted to the expected result.
-        final Var expected = new Var("-const-Chipotle", new LiteralImpl("Chipotle", XMLSchema.STRING));
+        final Var expected = new Var(prependConstant("Chipotle"), VF.createLiteral("Chipotle", XMLSchema.STRING));
         expected.setConstant(true);
 
         assertEquals(expected, result);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/RyaSubGraphKafkaSerDeTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/RyaSubGraphKafkaSerDeTest.java
index 8b9feaf..9a9feef 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/RyaSubGraphKafkaSerDeTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/RyaSubGraphKafkaSerDeTest.java
@@ -17,17 +17,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static org.junit.Assert.assertEquals;
 
 import java.util.UUID;
 
-import org.apache.rya.api.domain.RyaSubGraph;
 import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaSubGraph;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.indexing.pcj.fluo.app.export.kafka.RyaSubGraphKafkaSerDe;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 public class RyaSubGraphKafkaSerDeTest {
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/batch/serializer/BatchInformationSerializerTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/batch/serializer/BatchInformationSerializerTest.java
index 2c37462..cc9c825 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/batch/serializer/BatchInformationSerializerTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/batch/serializer/BatchInformationSerializerTest.java
@@ -32,11 +32,13 @@
 import org.apache.rya.indexing.pcj.fluo.app.batch.SpanBatchDeleteInformation;
 import org.apache.rya.indexing.pcj.fluo.app.query.FluoQueryColumns;
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata.JoinType;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 public class BatchInformationSerializerTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testSpanBatchInformationSerialization() {
@@ -54,8 +56,8 @@
     public void testJoinBatchInformationSerialization() {
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("a", new URIImpl("urn:123"));
-        bs.addBinding("b", new URIImpl("urn:456"));
+        bs.addBinding("a", VF.createIRI("urn:123"));
+        bs.addBinding("b", VF.createIRI("urn:456"));
         VisibilityBindingSet vBis = new VisibilityBindingSet(bs, "FOUO");
         
         JoinBatchInformation batch = JoinBatchInformation.builder().setBatchSize(1000).setTask(Task.Update)
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryUtilTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryUtilTest.java
index 55455a7..3482e0d 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryUtilTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/PeriodicQueryUtilTest.java
@@ -31,34 +31,34 @@
 import org.apache.rya.indexing.pcj.fluo.app.util.PeriodicQueryUtil.PeriodicQueryNodeRelocator;
 import org.apache.rya.indexing.pcj.fluo.app.util.PeriodicQueryUtil.PeriodicQueryNodeVisitor;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class PeriodicQueryUtilTest {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
    
     
     @Test
     public void periodicNodeNotPresentTest() throws Exception {
         
-        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(vf.createLiteral(12.0)), new ValueConstant(vf.createLiteral(6.0)), new ValueConstant(vf.createURI(PeriodicQueryUtil.temporalNameSpace + "hours")));
+        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(VF.createLiteral(12.0)), new ValueConstant(VF.createLiteral(6.0)), new ValueConstant(VF.createIRI(PeriodicQueryUtil.temporalNameSpace + "hours")));
         FunctionCall func = new FunctionCall("uri:func", values);
         Optional<PeriodicQueryNode> node1 = PeriodicQueryUtil.getPeriodicQueryNode(func, new Join());
         Assert.assertEquals(false, node1.isPresent());
@@ -69,7 +69,7 @@
     @Test
     public void periodicNodePresentTest() throws Exception {
         
-        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(vf.createLiteral(12.0)), new ValueConstant(vf.createLiteral(6.0)), new ValueConstant(vf.createURI(PeriodicQueryUtil.temporalNameSpace + "hours")));
+        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(VF.createLiteral(12.0)), new ValueConstant(VF.createLiteral(6.0)), new ValueConstant(VF.createIRI(PeriodicQueryUtil.temporalNameSpace + "hours")));
         FunctionCall func = new FunctionCall(PeriodicQueryUtil.PeriodicQueryURI, values);
         Optional<PeriodicQueryNode> node1 = PeriodicQueryUtil.getPeriodicQueryNode(func, new Join());
         Assert.assertEquals(true, node1.isPresent());
@@ -83,7 +83,7 @@
     @Test
     public void periodicNodeFractionalDurationTest() throws Exception {
         
-        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(vf.createLiteral(1)), new ValueConstant(vf.createLiteral(.5)), new ValueConstant(vf.createURI(PeriodicQueryUtil.temporalNameSpace + "hours")));
+        List<ValueExpr> values = Arrays.asList(new Var("time"), new ValueConstant(VF.createLiteral(1)), new ValueConstant(VF.createLiteral(.5)), new ValueConstant(VF.createIRI(PeriodicQueryUtil.temporalNameSpace + "hours")));
         FunctionCall func = new FunctionCall(PeriodicQueryUtil.PeriodicQueryURI, values);
         Optional<PeriodicQueryNode> node1 = PeriodicQueryUtil.getPeriodicQueryNode(func, new Join());
         Assert.assertEquals(true, node1.isPresent());
@@ -190,7 +190,7 @@
                 .append(node1.getTemporalVariable(), node2.getTemporalVariable()).append(node1.getUnit(), node2.getUnit()).build();
     }
     
-    private static class PeriodicNodeCollector extends QueryModelVisitorBase<RuntimeException>{
+    private static class PeriodicNodeCollector extends AbstractQueryModelVisitor<RuntimeException> {
         
         private PeriodicQueryNode periodicNode;
         int count = 0;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunctionTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunctionTest.java
index 2e09e4e..00f6433 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunctionTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/BindingHashShardingFunctionTest.java
@@ -25,22 +25,22 @@
 import org.apache.rya.indexing.pcj.fluo.app.BindingSetRow;
 import org.apache.rya.indexing.pcj.fluo.app.NodeType;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 public class BindingHashShardingFunctionTest {
 
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void shardAddAndRemoveTest() {
         String nodeId = NodeType.generateNewFluoIdForType(NodeType.STATEMENT_PATTERN);
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("entity", vf.createURI("urn:entity"));
-        bs.addBinding("location", vf.createLiteral("location_1"));
+        bs.addBinding("entity", VF.createIRI("urn:entity"));
+        bs.addBinding("location", VF.createLiteral("location_1"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
         VariableOrder varOrder = new VariableOrder("entity","location");
         Bytes row = RowKeyUtil.makeRowKey(nodeId, varOrder, vBs);
@@ -53,8 +53,8 @@
     public void bindingSetRowTest() {
         String nodeId = NodeType.generateNewFluoIdForType(NodeType.STATEMENT_PATTERN);
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("entity", vf.createURI("urn:entity"));
-        bs.addBinding("location", vf.createLiteral("location_1"));
+        bs.addBinding("entity", VF.createIRI("urn:entity"));
+        bs.addBinding("location", VF.createLiteral("location_1"));
         VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
         VariableOrder varOrder = new VariableOrder("entity","location");
         Bytes row = RowKeyUtil.makeRowKey(nodeId, varOrder, vBs);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializerTest.java b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializerTest.java
index b2efa96..561a7cd 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializerTest.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.app/src/test/java/org/apache/rya/indexing/pcj/fluo/app/util/FilterSerializerTest.java
@@ -20,11 +20,11 @@
 
 import static org.junit.Assert.assertEquals;
 
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class FilterSerializerTest {
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/pom.xml b/extras/rya.pcj.fluo/pcj.fluo.client/pom.xml
index 418c195..403b4eb 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/pom.xml
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/pom.xml
@@ -60,21 +60,21 @@
         </dependency>
         
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryrender</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryrender</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-turtle</artifactId>
-            <version>${openrdf.sesame.version}</version>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-turtle</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
         </dependency>
         
         <!-- Log4j 2 bridge, api, and core. -->        
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/PcjAdminClient.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/PcjAdminClient.java
index cc74f6b..99957bc 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/PcjAdminClient.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/PcjAdminClient.java
@@ -32,17 +32,19 @@
 import java.util.Properties;
 import java.util.Set;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Instance;
 import org.apache.accumulo.core.client.ZooKeeperInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
+import org.apache.fluo.api.client.FluoClient;
+import org.apache.fluo.api.client.FluoFactory;
+import org.apache.fluo.api.config.FluoConfiguration;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.indexing.pcj.fluo.app.query.UnsupportedQueryException;
 import org.apache.rya.indexing.pcj.fluo.client.PcjAdminClientCommand.ArgumentsException;
 import org.apache.rya.indexing.pcj.fluo.client.PcjAdminClientCommand.ExecutionException;
@@ -51,18 +53,15 @@
 import org.apache.rya.indexing.pcj.fluo.client.command.LoadTriplesCommand;
 import org.apache.rya.indexing.pcj.fluo.client.command.NewQueryCommand;
 import org.apache.rya.indexing.pcj.fluo.client.command.QueryReportCommand;
-import org.openrdf.repository.RepositoryException;
+import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 
-import org.apache.fluo.api.client.FluoClient;
-import org.apache.fluo.api.client.FluoFactory;
-import org.apache.fluo.api.config.FluoConfiguration;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.rya.rdftriplestore.RyaSailRepository;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 
 /**
  * An application that helps Rya PCJ administrators interact with the cluster.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/LoadTriplesCommand.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/LoadTriplesCommand.java
index 42ac427..8913039 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/LoadTriplesCommand.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/LoadTriplesCommand.java
@@ -32,9 +32,9 @@
 import org.apache.rya.indexing.pcj.fluo.client.PcjAdminClientCommand;
 import org.apache.rya.indexing.pcj.fluo.client.util.FluoLoader;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.Rio;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.Rio;
 
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.Parameter;
@@ -98,7 +98,7 @@
         final Path triplesPath = Paths.get( params.nTriplesFile );
 
         try {
-            final RDFParser parser = Rio.createParser(RDFFormat.forFileName(triplesPath.getFileName().toString()));
+            final RDFParser parser = Rio.createParser(RdfFormatUtils.forFileName(triplesPath.getFileName().toString()));
             final FluoLoader loader = new FluoLoader(fluo, new InsertTriples());
             parser.setRDFHandler(loader);
             parser.parse(Files.newInputStream(triplesPath), triplesPath.toUri().toString());
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/NewQueryCommand.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/NewQueryCommand.java
index 78515d9..806aa98 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/NewQueryCommand.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/command/NewQueryCommand.java
@@ -21,25 +21,15 @@
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
 
-import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
-import edu.umd.cs.findbugs.annotations.NonNull;
-
-import org.apache.accumulo.core.client.AccumuloException;
-import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.security.Authorizations;
 import org.apache.commons.io.IOUtils;
+import org.apache.fluo.api.client.FluoClient;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.query.AccumuloRyaQueryEngine;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.indexing.pcj.fluo.api.CreateFluoPcj;
 import org.apache.rya.indexing.pcj.fluo.app.query.UnsupportedQueryException;
@@ -48,16 +38,15 @@
 import org.apache.rya.indexing.pcj.storage.PcjException;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.sail.SailException;
+import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.Parameter;
 import com.beust.jcommander.ParameterException;
 
-import org.apache.fluo.api.client.FluoClient;
-import org.apache.rya.rdftriplestore.RyaSailRepository;
+import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
+import edu.umd.cs.findbugs.annotations.NonNull;
 
 /**
  * A command that creates a creates a new PCJ in the Fluo app and loads historic
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/FluoLoader.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/FluoLoader.java
index 206cf9d..4b55608 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/FluoLoader.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/FluoLoader.java
@@ -22,25 +22,24 @@
 
 import java.util.ArrayList;
 
+import org.apache.fluo.api.client.FluoClient;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
-import org.apache.rya.indexing.pcj.fluo.api.InsertTriples;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.helpers.RDFHandlerBase;
-
-import com.google.common.base.Optional;
-
-import org.apache.fluo.api.client.FluoClient;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.apache.rya.indexing.pcj.fluo.api.InsertTriples;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
+
+import com.google.common.base.Optional;
 
 /**
  * When used as the handler of an {@link RDFParser}, instances of this class
  * will batch load {@link Statement}s into the Fluo app 1000 statements at a time.
  */
-public class FluoLoader extends RDFHandlerBase {
+public class FluoLoader extends AbstractRDFHandler {
     private static final Logger log = LogManager.getLogger(FluoLoader.class);
 
     private static final int FLUSH_SIZE = 1000;
@@ -70,7 +69,7 @@
         // If the buffer is full, flush it to the Fluo table.
         if(buff.size() == FLUSH_SIZE) {
             log.trace("Flushing " + buff.size() + " Statements from the buffer to Fluo.");
-            insertTriples.insert(fluoClient, buff, Optional.<String>absent());
+            insertTriples.insert(fluoClient, buff, Optional.absent());
             buff.clear();
         }
 
@@ -85,7 +84,7 @@
 
         if(!buff.isEmpty()) {
             log.trace("Flushing the last " + buff.size() + " Statements from the buffer to Fluo.");
-            insertTriples.insert(fluoClient, buff, Optional.<String>absent());
+            insertTriples.insert(fluoClient, buff, Optional.absent());
             buff.clear();
         }
     }
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/PcjMetadataRenderer.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/PcjMetadataRenderer.java
index 93570ea..42169ad 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/PcjMetadataRenderer.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/PcjMetadataRenderer.java
@@ -28,9 +28,9 @@
 import org.apache.rya.indexing.pcj.fluo.client.util.Report.ReportItem;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
 
 /**
  * Pretty renders the state of a query's {@link PcjMetadata}.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/QueryReportRenderer.java b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/QueryReportRenderer.java
index d1b3e25..eaedd64 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/QueryReportRenderer.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.client/src/main/java/org/apache/rya/indexing/pcj/fluo/client/util/QueryReportRenderer.java
@@ -31,9 +31,9 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.QueryMetadata;
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternMetadata;
 import org.apache.rya.indexing.pcj.fluo.client.util.Report.ReportItem;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.demo/pom.xml b/extras/rya.pcj.fluo/pcj.fluo.demo/pom.xml
index 3019c37..98cbdf2 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.demo/pom.xml
+++ b/extras/rya.pcj.fluo/pcj.fluo.demo/pom.xml
@@ -47,8 +47,8 @@
         
         <!-- 3rd Party Runtime Dependencies. -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryrender</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryrender</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.fluo</groupId>
diff --git a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/Demo.java b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/Demo.java
index 1bc5f1b..dc0d90e 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/Demo.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/Demo.java
@@ -20,11 +20,10 @@
 
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
-import org.openrdf.repository.RepositoryConnection;
-
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.mini.MiniFluo;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
 
 /**
  * Represents a demonstration that uses Rya and Fluo on top of Accumulo.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/DemoDriver.java b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/DemoDriver.java
index 1ae02dd..e194407 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/DemoDriver.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/DemoDriver.java
@@ -23,7 +23,6 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.List;
 
@@ -34,6 +33,7 @@
 import org.apache.accumulo.core.client.ZooKeeperInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.accumulo.minicluster.MiniAccumuloCluster;
+import org.apache.fluo.api.client.FluoAdmin.AlreadyInitializedException;
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.client.FluoFactory;
 import org.apache.fluo.api.config.FluoConfiguration;
@@ -56,7 +56,6 @@
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
 import org.apache.rya.api.instance.RyaDetailsRepository;
-import org.apache.rya.api.instance.RyaDetailsRepository.AlreadyInitializedException;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
 import org.apache.rya.indexing.pcj.fluo.app.export.rya.RyaExportParameters;
 import org.apache.rya.indexing.pcj.fluo.app.observers.FilterObserver;
@@ -67,8 +66,8 @@
 import org.apache.rya.indexing.pcj.fluo.demo.Demo.DemoExecutionException;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 import com.google.common.base.Optional;
 import com.google.common.io.Files;
@@ -277,8 +276,8 @@
                 .setPCJIndexDetails(
                         PCJIndexDetails.builder()
                             .setEnabled(true) )
-                .setJoinSelectivityDetails( new JoinSelectivityDetails( Optional.<Date>absent() ) )
-                .setProspectorDetails( new ProspectorDetails( Optional.<Date>absent() ))
+                .setJoinSelectivityDetails( new JoinSelectivityDetails( Optional.absent() ) )
+                .setProspectorDetails( new ProspectorDetails( Optional.absent() ))
                 .build();
 
         detailsRepo.initialize(details);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/FluoAndHistoricPcjsDemo.java b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/FluoAndHistoricPcjsDemo.java
index 181f322..8ef6db3 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/FluoAndHistoricPcjsDemo.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.demo/src/main/java/org/apache/rya/indexing/pcj/fluo/demo/FluoAndHistoricPcjsDemo.java
@@ -41,14 +41,14 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
-import org.openrdf.model.Statement;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -287,7 +287,7 @@
     private static void loadDataIntoFluo(final FluoClient fluoClient, final Set<RyaStatement> statements) {
         final InsertTriples insertTriples = new InsertTriples();
         for(final RyaStatement statement : statements) {
-            insertTriples.insert(fluoClient, statement, Optional.<String>absent());
+            insertTriples.insert(fluoClient, statement, Optional.absent());
         }
     }
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/ConstructGraphTestUtils.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/ConstructGraphTestUtils.java
index bbdcfec..ca00934 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/ConstructGraphTestUtils.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/ConstructGraphTestUtils.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
@@ -26,8 +27,8 @@
 import org.apache.rya.api.domain.RyaSubGraph;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
+import org.eclipse.rdf4j.model.Statement;
 import org.junit.Assert;
-import org.openrdf.model.Statement;
 
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadataIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadataIT.java
index 7676657..926af3e 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadataIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/api/GetPcjMetadataIT.java
@@ -40,11 +40,11 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.ShiftVarOrderFactory;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.SailException;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/FluoQueryMetadataDAOIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/FluoQueryMetadataDAOIT.java
index 384ec5d..551afa6 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/FluoQueryMetadataDAOIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/app/query/FluoQueryMetadataDAOIT.java
@@ -38,13 +38,13 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.JoinMetadata.JoinType;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.repository.RepositoryException;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.repository.RepositoryException;
 
 /**
  * Integration tests the methods of {@link FluoQueryMetadataDAO}.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/BatchIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/BatchIT.java
index 5c8a1be..555e002 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/BatchIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/BatchIT.java
@@ -60,11 +60,11 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
@@ -72,8 +72,8 @@
 public class BatchIT extends RyaExportITBase {
 
     private static final Logger log = Logger.getLogger(BatchIT.class);
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final FluoQueryMetadataDAO dao = new FluoQueryMetadataDAO();
-    private static final ValueFactory vf = new ValueFactoryImpl();
 
     @Test
     public void simpleScanDelete() throws Exception {
@@ -140,12 +140,12 @@
             String joinId = ids.get(2);
             String rightSp = ids.get(4);
             QueryBindingSet bs = new QueryBindingSet();
-            bs.addBinding("subject", vf.createURI("urn:subject_1"));
-            bs.addBinding("object1", vf.createURI("urn:object_0"));
+            bs.addBinding("subject", VF.createIRI("urn:subject_1"));
+            bs.addBinding("object1", VF.createIRI("urn:object_0"));
             VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
 
             //create sharded span for deletion
-            URI uri = vf.createURI("urn:subject_1");
+            IRI uri = VF.createIRI("urn:subject_1");
             Bytes prefixBytes = BindingHashShardingFunction.getShardedScanPrefix(rightSp, uri);
             Span span = Span.prefix(prefixBytes);
 
@@ -190,11 +190,11 @@
             String joinId = ids.get(2);
             String rightSp = ids.get(4);
             QueryBindingSet bs = new QueryBindingSet();
-            bs.addBinding("subject", vf.createURI("urn:subject_1"));
-            bs.addBinding("object1", vf.createURI("urn:object_0"));
+            bs.addBinding("subject", VF.createIRI("urn:subject_1"));
+            bs.addBinding("object1", VF.createIRI("urn:object_0"));
             VisibilityBindingSet vBs = new VisibilityBindingSet(bs);
 
-            URI uri = vf.createURI("urn:subject_1");
+            IRI uri = VF.createIRI("urn:subject_1");
             Bytes prefixBytes = BindingHashShardingFunction.getShardedScanPrefix(rightSp, uri);
             Span span = Span.prefix(prefixBytes);
 
@@ -368,7 +368,7 @@
             for (int i = 0; i < ids.size(); i++) {
                 String id = ids.get(i);
                 String bsPrefix = prefixes.get(i);
-                URI uri = vf.createURI(bsPrefix);
+                IRI uri = VF.createIRI(bsPrefix);
                 Bytes prefixBytes = BindingHashShardingFunction.getShardedScanPrefix(id, uri);
                 NodeType type = NodeType.fromNodeId(id).get();
                 Column bsCol = type.getResultColumn();
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeleteIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeleteIT.java
index ef5ab34..933a698 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeleteIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeleteIT.java
@@ -37,11 +37,11 @@
 import org.apache.rya.api.client.accumulo.AccumuloRyaClientFactory;
 import org.apache.rya.indexing.pcj.fluo.api.DeleteFluoPcj;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.collect.Sets;
 
@@ -60,18 +60,18 @@
                 "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
 
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin")),
 
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadData(sparql, statements);
@@ -100,11 +100,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(0.99)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(0.99)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadData(sparql, statements);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeletePeriodicPCJ.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeletePeriodicPCJ.java
index eb21b34..46fa2c1 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeletePeriodicPCJ.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/CreateDeletePeriodicPCJ.java
@@ -60,10 +60,10 @@
 import org.apache.rya.periodic.notification.notification.CommandNotification.Command;
 import org.apache.rya.periodic.notification.registration.KafkaNotificationRegistrationClient;
 import org.apache.rya.periodic.notification.serialization.CommandNotificationSerializer;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 import com.google.common.collect.Sets;
 
@@ -79,7 +79,7 @@
                 + "?obs <uri:hasId> ?id }"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         ZonedDateTime time = ZonedDateTime.now();
 
@@ -96,18 +96,18 @@
         String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasId"), vf.createLiteral("id_4")));
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasId"), vf.createLiteral("id_4")));
 
         runTest(query, statements, 30);
 
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/InputIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/InputIT.java
index 866d32b..ff2dc28 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/InputIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/InputIT.java
@@ -35,13 +35,13 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -64,28 +64,28 @@
               "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
 
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin")),
 
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // The expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expected = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Bob"));
+        bs.addBinding("x", vf.createIRI("http://Bob"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Charlie"));
+        bs.addBinding("x", vf.createIRI("http://Charlie"));
         expected.add(bs);
 
         // Load the historic data into Rya.
@@ -144,15 +144,15 @@
                 new RyaStatement(new RyaURI("http://David"), new RyaURI("http://worksAt"), new RyaURI("http://Chipotle")));
 
         // The expected results of the SPARQL query once the PCJ has been computed.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<BindingSet> expected = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Bob"));
+        bs.addBinding("x", vf.createIRI("http://Bob"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Charlie"));
+        bs.addBinding("x", vf.createIRI("http://Charlie"));
         expected.add(bs);
 
         // Create the PCJ table.
@@ -172,7 +172,7 @@
             }
 
             // Stream the data into Fluo.
-            new InsertTriples().insert(fluoClient, streamedTriples, Optional.<String>absent());
+            new InsertTriples().insert(fluoClient, streamedTriples, Optional.absent());
 
             // Verify the end results of the query match the expected results.
             super.getMiniFluo().waitForObservers();
@@ -204,10 +204,10 @@
               "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Triples that will be streamed into Fluo after the PCJ has been created.
         final Set<RyaStatement> streamedTriples = Sets.newHashSet(
@@ -236,7 +236,7 @@
             final Set<BindingSet> expected = new HashSet<>();
 
             MapBindingSet bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Alice"));
+            bs.addBinding("x", vf.createIRI("http://Alice"));
             expected.add(bs);
 
             Set<BindingSet> results = new HashSet<>();
@@ -249,13 +249,13 @@
             assertEquals(expected, results);
 
             // Stream the data into Fluo.
-            new InsertTriples().insert(fluoClient, streamedTriples, Optional.<String>absent());
+            new InsertTriples().insert(fluoClient, streamedTriples, Optional.absent());
 
             // Verify the end results of the query also include Frank.
             super.getMiniFluo().waitForObservers();
 
             bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Frank"));
+            bs.addBinding("x", vf.createIRI("http://Frank"));
             expected.add(bs);
 
             results = new HashSet<>();
@@ -286,10 +286,10 @@
               "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Triples that will be streamed into Fluo after the PCJ has been created.
         final Set<RyaStatement> streamedTriples = Sets.newHashSet(
@@ -300,7 +300,7 @@
         final Set<BindingSet> expected = new HashSet<>();
 
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Alice"));
+        bs.addBinding("x", vf.createIRI("http://Alice"));
         expected.add(bs);
 
         // Load the historic data into Rya.
@@ -331,7 +331,7 @@
             assertEquals(expected, results);
 
             // Stream the same Alice triple into Fluo.
-            new InsertTriples().insert(fluoClient, streamedTriples, Optional.<String>absent());
+            new InsertTriples().insert(fluoClient, streamedTriples, Optional.absent());
 
             // Verify the end results of the query is stiill only Alice.
             super.getMiniFluo().waitForObservers();
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaExportIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaExportIT.java
index dd79c37..03a9b02 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaExportIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaExportIT.java
@@ -35,13 +35,13 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.pcj.fluo.test.base.KafkaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Sets;
 
@@ -67,24 +67,24 @@
                 "}";
 
         // Triples that will be streamed into Fluo after the PCJ has been created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements =
                 Sets.newHashSet(
-                        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Bob")),
-                        vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                        vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Charlie")),
-                        vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                        vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://David")),
-                        vf.createStatement(vf.createURI("http://David"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                        vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                        vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://livesIn"), vf.createURI("http://Leeds")),
-                        vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                        vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                        vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                        vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Bob")),
+                        vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                        vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Charlie")),
+                        vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                        vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://David")),
+                        vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                        vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                        vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://livesIn"), vf.createIRI("http://Leeds")),
+                        vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                        vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                        vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                        vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -93,21 +93,21 @@
         final Set<BindingSet> expectedResult = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Bob"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Bob"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResult.add( new VisibilityBindingSet(bs) );
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Charlie"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Charlie"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResult.add( new VisibilityBindingSet(bs) );
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://David"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://David"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResult.add( new VisibilityBindingSet(bs) );
 
         // Ensure the last result matches the expected result.
@@ -124,11 +124,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(0.99)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(0.99)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -151,11 +151,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(0.99)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(0.99)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -178,15 +178,15 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
                 // Three that are part of the count.
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:id"), vf.createLiteral(UUID.randomUUID().toString())),
 
                 // One that is not.
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(3.99)));
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(3.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -209,11 +209,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:count"), vf.createLiteral(5)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:count"), vf.createLiteral(7)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:count"), vf.createLiteral(2)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:count"), vf.createLiteral(5)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:count"), vf.createLiteral(7)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:count"), vf.createLiteral(2)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -236,11 +236,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(3)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(4)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(8)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(3)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(4)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(8)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -264,11 +264,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(0.99)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(0.99)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -291,11 +291,11 @@
                 "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(5.25)),
-                vf.createStatement(vf.createURI("urn:gum"), vf.createURI("urn:price"), vf.createLiteral(7)),
-                vf.createStatement(vf.createURI("urn:sandwich"), vf.createURI("urn:price"), vf.createLiteral(2.75)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(5.25)),
+                vf.createStatement(vf.createIRI("urn:gum"), vf.createIRI("urn:price"), vf.createLiteral(7)),
+                vf.createStatement(vf.createIRI("urn:sandwich"), vf.createIRI("urn:price"), vf.createLiteral(2.75)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -320,13 +320,13 @@
                 "GROUP BY ?item";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(5.25)),
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(7)),
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:price"), vf.createLiteral(2.75)),
-                vf.createStatement(vf.createURI("urn:banana"), vf.createURI("urn:price"), vf.createLiteral(2.75)),
-                vf.createStatement(vf.createURI("urn:banana"), vf.createURI("urn:price"), vf.createLiteral(1.99)));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(5.25)),
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(7)),
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:price"), vf.createLiteral(2.75)),
+                vf.createStatement(vf.createIRI("urn:banana"), vf.createIRI("urn:price"), vf.createLiteral(2.75)),
+                vf.createStatement(vf.createIRI("urn:banana"), vf.createIRI("urn:price"), vf.createLiteral(1.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -335,12 +335,12 @@
         final Set<VisibilityBindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("item", vf.createURI("urn:apple"));
+        bs.addBinding("item", vf.createIRI("urn:apple"));
         bs.addBinding("averagePrice", vf.createLiteral("5.0", XMLSchema.DECIMAL));
         expectedResults.add( new VisibilityBindingSet(bs) );
 
         bs = new MapBindingSet();
-        bs.addBinding("item", vf.createURI("urn:banana"));
+        bs.addBinding("item", vf.createIRI("urn:banana"));
         bs.addBinding("averagePrice", vf.createLiteral("2.37", XMLSchema.DECIMAL));
         expectedResults.add( new VisibilityBindingSet(bs) );
 
@@ -361,33 +361,33 @@
                 "GROUP BY ?type ?location";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
                 // American items that will be averaged.
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:type"), vf.createLiteral("apple")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:type"), vf.createLiteral("apple")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
 
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:price"), vf.createLiteral(.99)),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:price"), vf.createLiteral(.99)),
 
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:price"), vf.createLiteral(5.25)),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:price"), vf.createLiteral(5.25)),
 
                 // French items that will be averaged.
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:price"), vf.createLiteral(8.5)),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:price"), vf.createLiteral(8.5)),
 
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:type"), vf.createLiteral("cigarettes")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:price"), vf.createLiteral(3.99)),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:type"), vf.createLiteral("cigarettes")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:price"), vf.createLiteral(3.99)),
 
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:type"), vf.createLiteral("cigarettes")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:type"), vf.createLiteral("cigarettes")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -439,33 +439,33 @@
                 "GROUP BY ?type ?location }}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
                 // American items that will be averaged.
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:type"), vf.createLiteral("apple")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:price"), vf.createLiteral(2.50)),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:type"), vf.createLiteral("apple")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:price"), vf.createLiteral(2.50)),
 
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:price"), vf.createLiteral(4.25)),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:price"), vf.createLiteral(4.25)),
 
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:price"), vf.createLiteral(5.25)),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:price"), vf.createLiteral(5.25)),
 
                 // French items that will be averaged.
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:type"), vf.createLiteral("cheese")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:price"), vf.createLiteral(8.5)),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:type"), vf.createLiteral("cheese")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:price"), vf.createLiteral(8.5)),
 
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:type"), vf.createLiteral("cigarettes")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:price"), vf.createLiteral(3.99)),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:type"), vf.createLiteral("cigarettes")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:price"), vf.createLiteral(3.99)),
 
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:type"), vf.createLiteral("cigarettes")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:type"), vf.createLiteral("cigarettes")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -513,36 +513,36 @@
                 "GROUP BY ?type ?location }}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
 
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:type"), vf.createURI("urn:blue")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:1"), vf.createURI("urn:price"), vf.createLiteral(8.5)),
-                vf.createStatement(vf.createURI("urn:blue"), vf.createURI("urn:hasMilkType"), vf.createLiteral("cow", XMLSchema.STRING)),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:type"), vf.createIRI("urn:blue")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:1"), vf.createIRI("urn:price"), vf.createLiteral(8.5)),
+                vf.createStatement(vf.createIRI("urn:blue"), vf.createIRI("urn:hasMilkType"), vf.createLiteral("cow", XMLSchema.STRING)),
 
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:type"), vf.createURI("urn:american")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:2"), vf.createURI("urn:price"), vf.createLiteral(.99)),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:type"), vf.createIRI("urn:american")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:2"), vf.createIRI("urn:price"), vf.createLiteral(.99)),
 
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:type"), vf.createURI("urn:cheddar")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:location"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("urn:3"), vf.createURI("urn:price"), vf.createLiteral(5.25)),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:type"), vf.createIRI("urn:cheddar")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:location"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("urn:3"), vf.createIRI("urn:price"), vf.createLiteral(5.25)),
 
                 // French items that will be averaged.
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:type"), vf.createURI("urn:goat")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:location"), vf.createLiteral("France")),
-                vf.createStatement(vf.createURI("urn:4"), vf.createURI("urn:price"), vf.createLiteral(6.5)),
-                vf.createStatement(vf.createURI("urn:goat"), vf.createURI("urn:hasMilkType"), vf.createLiteral("goat", XMLSchema.STRING)),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:type"), vf.createIRI("urn:goat")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:location"), vf.createLiteral("France")),
+                vf.createStatement(vf.createIRI("urn:4"), vf.createIRI("urn:price"), vf.createLiteral(6.5)),
+                vf.createStatement(vf.createIRI("urn:goat"), vf.createIRI("urn:hasMilkType"), vf.createLiteral("goat", XMLSchema.STRING)),
 
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:type"), vf.createURI("urn:fontina")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:location"), vf.createLiteral("Italy")),
-                vf.createStatement(vf.createURI("urn:5"), vf.createURI("urn:price"), vf.createLiteral(3.99)),
-                vf.createStatement(vf.createURI("urn:fontina"), vf.createURI("urn:hasMilkType"), vf.createLiteral("cow", XMLSchema.STRING)),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:type"), vf.createIRI("urn:fontina")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:location"), vf.createLiteral("Italy")),
+                vf.createStatement(vf.createIRI("urn:5"), vf.createIRI("urn:price"), vf.createLiteral(3.99)),
+                vf.createStatement(vf.createIRI("urn:fontina"), vf.createIRI("urn:hasMilkType"), vf.createLiteral("cow", XMLSchema.STRING)),
 
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:type"), vf.createURI("urn:fontina")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:location"), vf.createLiteral("Italy")),
-                vf.createStatement(vf.createURI("urn:6"), vf.createURI("urn:price"), vf.createLiteral(4.99)));
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:type"), vf.createIRI("urn:fontina")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:location"), vf.createLiteral("Italy")),
+                vf.createStatement(vf.createIRI("urn:6"), vf.createIRI("urn:price"), vf.createLiteral(4.99)));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadDataAndCreateQuery(sparql, statements);
@@ -551,21 +551,21 @@
         final Set<VisibilityBindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("type", vf.createURI("urn:blue"));
+        bs.addBinding("type", vf.createIRI("urn:blue"));
         bs.addBinding("location", vf.createLiteral("France", XMLSchema.STRING));
         bs.addBinding("averagePrice", vf.createLiteral("8.5", XMLSchema.DECIMAL));
         bs.addBinding("milkType", vf.createLiteral("cow", XMLSchema.STRING));
         expectedResults.add( new VisibilityBindingSet(bs));
 
         bs = new MapBindingSet();
-        bs.addBinding("type", vf.createURI("urn:goat"));
+        bs.addBinding("type", vf.createIRI("urn:goat"));
         bs.addBinding("location", vf.createLiteral("France", XMLSchema.STRING));
         bs.addBinding("averagePrice", vf.createLiteral("6.5", XMLSchema.DECIMAL));
         bs.addBinding("milkType", vf.createLiteral("goat", XMLSchema.STRING));
         expectedResults.add( new VisibilityBindingSet(bs) );
 
         bs = new MapBindingSet();
-        bs.addBinding("type", vf.createURI("urn:fontina"));
+        bs.addBinding("type", vf.createIRI("urn:fontina"));
         bs.addBinding("location", vf.createLiteral("Italy", XMLSchema.STRING));
         bs.addBinding("averagePrice", vf.createLiteral("4.49", XMLSchema.DECIMAL));
         bs.addBinding("milkType", vf.createLiteral("cow", XMLSchema.STRING));
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaRyaSubGraphExportIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaRyaSubGraphExportIT.java
index b2944ca..309d1ca 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaRyaSubGraphExportIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/KafkaRyaSubGraphExportIT.java
@@ -17,6 +17,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+
 import static java.util.Objects.requireNonNull;
 
 import java.util.ArrayList;
@@ -33,7 +34,6 @@
 import org.apache.fluo.api.client.FluoClient;
 import org.apache.fluo.api.config.ObserverSpecification;
 import org.apache.fluo.core.client.FluoClientImpl;
-import org.apache.fluo.recipes.test.FluoITHelper;
 import org.apache.kafka.clients.consumer.ConsumerConfig;
 import org.apache.kafka.clients.consumer.ConsumerRecord;
 import org.apache.kafka.clients.consumer.ConsumerRecords;
@@ -58,13 +58,13 @@
 import org.apache.rya.indexing.pcj.fluo.app.observers.StatementPatternObserver;
 import org.apache.rya.indexing.pcj.fluo.app.observers.TripleObserver;
 import org.apache.rya.pcj.fluo.test.base.KafkaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.Sets;
 
@@ -114,11 +114,11 @@
                 + "?customer <urn:talksTo> ?worker. " + "?worker <urn:livesIn> ?city. " + "?worker <urn:worksAt> <urn:burgerShack>. " + "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:Joe"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")),
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:livesIn"), vf.createURI("urn:London")),
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:burgerShack")));
+                vf.createStatement(vf.createIRI("urn:Joe"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")),
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:livesIn"), vf.createIRI("urn:London")),
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:burgerShack")));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadStatements(sparql, statements);
@@ -306,24 +306,24 @@
                 + "}GROUP BY ?location }}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs1"), vf.createURI("urn:hasVelocity"), vf.createLiteral(77)),
-                vf.createStatement(vf.createURI("urn:obs1"), vf.createURI("urn:hasLocation"), vf.createLiteral("OldTown")),
-                vf.createStatement(vf.createURI("urn:obs2"), vf.createURI("urn:hasVelocity"), vf.createLiteral(81)),
-                vf.createStatement(vf.createURI("urn:obs2"), vf.createURI("urn:hasLocation"), vf.createLiteral("OldTown")),
-                vf.createStatement(vf.createURI("urn:obs3"), vf.createURI("urn:hasVelocity"), vf.createLiteral(70)),
-                vf.createStatement(vf.createURI("urn:obs3"), vf.createURI("urn:hasLocation"), vf.createLiteral("OldTown")),
-                vf.createStatement(vf.createURI("urn:obs5"), vf.createURI("urn:hasVelocity"), vf.createLiteral(87)),
-                vf.createStatement(vf.createURI("urn:obs5"), vf.createURI("urn:hasLocation"), vf.createLiteral("Rosslyn")),
-                vf.createStatement(vf.createURI("urn:obs6"), vf.createURI("urn:hasVelocity"), vf.createLiteral(81)),
-                vf.createStatement(vf.createURI("urn:obs6"), vf.createURI("urn:hasLocation"), vf.createLiteral("Rosslyn")),
-                vf.createStatement(vf.createURI("urn:obs7"), vf.createURI("urn:hasVelocity"), vf.createLiteral(67)),
-                vf.createStatement(vf.createURI("urn:obs7"), vf.createURI("urn:hasLocation"), vf.createLiteral("Clarendon")),
-                vf.createStatement(vf.createURI("urn:obs8"), vf.createURI("urn:hasVelocity"), vf.createLiteral(77)),
-                vf.createStatement(vf.createURI("urn:obs8"), vf.createURI("urn:hasLocation"), vf.createLiteral("Ballston")),
-                vf.createStatement(vf.createURI("urn:obs9"), vf.createURI("urn:hasVelocity"), vf.createLiteral(87)),
-                vf.createStatement(vf.createURI("urn:obs9"), vf.createURI("urn:hasLocation"), vf.createLiteral("FallsChurch")));
+                vf.createStatement(vf.createIRI("urn:obs1"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(77)),
+                vf.createStatement(vf.createIRI("urn:obs1"), vf.createIRI("urn:hasLocation"), vf.createLiteral("OldTown")),
+                vf.createStatement(vf.createIRI("urn:obs2"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(81)),
+                vf.createStatement(vf.createIRI("urn:obs2"), vf.createIRI("urn:hasLocation"), vf.createLiteral("OldTown")),
+                vf.createStatement(vf.createIRI("urn:obs3"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(70)),
+                vf.createStatement(vf.createIRI("urn:obs3"), vf.createIRI("urn:hasLocation"), vf.createLiteral("OldTown")),
+                vf.createStatement(vf.createIRI("urn:obs5"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(87)),
+                vf.createStatement(vf.createIRI("urn:obs5"), vf.createIRI("urn:hasLocation"), vf.createLiteral("Rosslyn")),
+                vf.createStatement(vf.createIRI("urn:obs6"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(81)),
+                vf.createStatement(vf.createIRI("urn:obs6"), vf.createIRI("urn:hasLocation"), vf.createLiteral("Rosslyn")),
+                vf.createStatement(vf.createIRI("urn:obs7"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(67)),
+                vf.createStatement(vf.createIRI("urn:obs7"), vf.createIRI("urn:hasLocation"), vf.createLiteral("Clarendon")),
+                vf.createStatement(vf.createIRI("urn:obs8"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(77)),
+                vf.createStatement(vf.createIRI("urn:obs8"), vf.createIRI("urn:hasLocation"), vf.createLiteral("Ballston")),
+                vf.createStatement(vf.createIRI("urn:obs9"), vf.createIRI("urn:hasVelocity"), vf.createLiteral(87)),
+                vf.createStatement(vf.createIRI("urn:obs9"), vf.createIRI("urn:hasLocation"), vf.createLiteral("FallsChurch")));
 
         // Create the PCJ in Fluo and load the statements into Rya.
         final String pcjId = loadStatements(sparql, statements);
@@ -353,7 +353,7 @@
         expectedResults.add(subGraph2);
         
         Assert.assertEquals(expectedResults.size(), results.size());
-        ConstructGraphTestUtils.subGraphsEqualIgnoresBlankNode(expectedResults, results);;
+        ConstructGraphTestUtils.subGraphsEqualIgnoresBlankNode(expectedResults, results);
     }
     
     
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/QueryIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/QueryIT.java
index 11415eb..706dc48 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/QueryIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/QueryIT.java
@@ -22,6 +22,7 @@
 import static org.junit.Assert.assertEquals;
 
 import java.math.BigDecimal;
+import java.math.BigInteger;
 import java.time.ZonedDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Collection;
@@ -47,24 +48,24 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPeriodicQueryResultStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.datatypes.XMLDatatypeUtil;
+import org.eclipse.rdf4j.model.impl.BooleanLiteral;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.FN;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.datatypes.XMLDatatypeUtil;
-import org.openrdf.model.impl.BooleanLiteralImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.FN;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.collect.Sets;
 
@@ -82,32 +83,32 @@
                 + "OPTIONAL {?person <http://passedExam> ?exam } . " + "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://hasDegreeIn"),
-                        vf.createURI("http://Computer Science")),
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://passedExam"),
-                        vf.createURI("http://Certified Ethical Hacker")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://hasDegreeIn"), vf.createURI("http://Law")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://passedExam"), vf.createURI("http://MBE")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://passedExam"), vf.createURI("http://BAR-Kansas")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://hasDegreeIn"), vf.createURI("http://Law")));
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://hasDegreeIn"),
+                        vf.createIRI("http://Computer Science")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://passedExam"),
+                        vf.createIRI("http://Certified Ethical Hacker")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://hasDegreeIn"), vf.createIRI("http://Law")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://passedExam"), vf.createIRI("http://MBE")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://passedExam"), vf.createIRI("http://BAR-Kansas")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://hasDegreeIn"), vf.createIRI("http://Law")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("http://Bob"));
-        bs.addBinding("exam", vf.createURI("http://MBE"));
+        bs.addBinding("person", vf.createIRI("http://Bob"));
+        bs.addBinding("exam", vf.createIRI("http://MBE"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("http://Bob"));
-        bs.addBinding("exam", vf.createURI("http://BAR-Kansas"));
+        bs.addBinding("person", vf.createIRI("http://Bob"));
+        bs.addBinding("exam", vf.createIRI("http://BAR-Kansas"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("http://Charlie"));
+        bs.addBinding("person", vf.createIRI("http://Charlie"));
         expectedResults.add(bs);
 
         // Verify the end results of the query match the expected results.
@@ -127,61 +128,61 @@
                 + "?candidate <http://talksTo> ?leader." + "?leader <http://leaderOf> <http://GeekSquad>. }";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
                 // Leaders
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://leaderOf"), vf.createURI("http://GeekSquad")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://leaderOf"), vf.createURI("http://GeekSquad")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://leaderOf"), vf.createIRI("http://GeekSquad")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://leaderOf"), vf.createIRI("http://GeekSquad")),
 
         // Recruiters
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://recruiterFor"), vf.createURI("http://GeekSquad")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://recruiterFor"), vf.createURI("http://GeekSquad")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://recruiterFor"), vf.createIRI("http://GeekSquad")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://recruiterFor"), vf.createIRI("http://GeekSquad")),
 
         // Candidates
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://skilledWith"), vf.createURI("http://Computers")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://livesIn"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://skilledWith"), vf.createURI("http://Computers")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://livesIn"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("http://George"), vf.createURI("http://skilledWith"), vf.createURI("http://Computers")),
-                vf.createStatement(vf.createURI("http://George"), vf.createURI("http://livesIn"), vf.createLiteral("Germany")),
-                vf.createStatement(vf.createURI("http://Harry"), vf.createURI("http://skilledWith"), vf.createURI("http://Negotiating")),
-                vf.createStatement(vf.createURI("http://Harry"), vf.createURI("http://livesIn"), vf.createLiteral("USA")),
-                vf.createStatement(vf.createURI("http://Ivan"), vf.createURI("http://skilledWith"), vf.createURI("http://Computers")),
-                vf.createStatement(vf.createURI("http://Ivan"), vf.createURI("http://livesIn"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://skilledWith"), vf.createIRI("http://Computers")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://livesIn"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://skilledWith"), vf.createIRI("http://Computers")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://livesIn"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("http://George"), vf.createIRI("http://skilledWith"), vf.createIRI("http://Computers")),
+                vf.createStatement(vf.createIRI("http://George"), vf.createIRI("http://livesIn"), vf.createLiteral("Germany")),
+                vf.createStatement(vf.createIRI("http://Harry"), vf.createIRI("http://skilledWith"), vf.createIRI("http://Negotiating")),
+                vf.createStatement(vf.createIRI("http://Harry"), vf.createIRI("http://livesIn"), vf.createLiteral("USA")),
+                vf.createStatement(vf.createIRI("http://Ivan"), vf.createIRI("http://skilledWith"), vf.createIRI("http://Computers")),
+                vf.createStatement(vf.createIRI("http://Ivan"), vf.createIRI("http://livesIn"), vf.createLiteral("USA")),
 
         // Candidates the recruiters talk to.
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://George")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Harry")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://talksTo"), vf.createURI("http://Frank")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://talksTo"), vf.createURI("http://Ivan")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://George")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Harry")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://talksTo"), vf.createIRI("http://Frank")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://talksTo"), vf.createIRI("http://Ivan")),
 
         // Recruits that talk to leaders.
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                vf.createStatement(vf.createURI("http://George"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                vf.createStatement(vf.createURI("http://Harry"), vf.createURI("http://talksTo"), vf.createURI("http://Bob")),
-                vf.createStatement(vf.createURI("http://Ivan"), vf.createURI("http://talksTo"), vf.createURI("http://Bob")));
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                vf.createStatement(vf.createIRI("http://George"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                vf.createStatement(vf.createIRI("http://Harry"), vf.createIRI("http://talksTo"), vf.createIRI("http://Bob")),
+                vf.createStatement(vf.createIRI("http://Ivan"), vf.createIRI("http://talksTo"), vf.createIRI("http://Bob")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("recruiter", vf.createURI("http://Charlie"));
-        bs.addBinding("candidate", vf.createURI("http://Eve"));
-        bs.addBinding("leader", vf.createURI("http://Alice"));
+        bs.addBinding("recruiter", vf.createIRI("http://Charlie"));
+        bs.addBinding("candidate", vf.createIRI("http://Eve"));
+        bs.addBinding("leader", vf.createIRI("http://Alice"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("recruiter", vf.createURI("http://David"));
-        bs.addBinding("candidate", vf.createURI("http://Eve"));
-        bs.addBinding("leader", vf.createURI("http://Alice"));
+        bs.addBinding("recruiter", vf.createIRI("http://David"));
+        bs.addBinding("candidate", vf.createIRI("http://Eve"));
+        bs.addBinding("leader", vf.createIRI("http://Alice"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("recruiter", vf.createURI("http://David"));
-        bs.addBinding("candidate", vf.createURI("http://Ivan"));
-        bs.addBinding("leader", vf.createURI("http://Bob"));
+        bs.addBinding("recruiter", vf.createIRI("http://David"));
+        bs.addBinding("candidate", vf.createIRI("http://Ivan"));
+        bs.addBinding("leader", vf.createIRI("http://Bob"));
         expectedResults.add(bs);
 
         // Verify the end results of the query match the expected results.
@@ -195,47 +196,47 @@
                 + "?worker <http://worksAt> <http://Chipotle>. " + "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Bob")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Bob")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
 
-        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Charlie")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
+        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Charlie")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
 
-        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://David")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
+        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://David")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
 
-        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://livesIn"), vf.createURI("http://Leeds")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
+        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://livesIn"), vf.createIRI("http://Leeds")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
 
-        vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://livesIn"), vf.createURI("http://London")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+        vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://livesIn"), vf.createIRI("http://London")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Bob"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Bob"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Charlie"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Charlie"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://David"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://David"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expectedResults.add(bs);
 
         // Verify the end results of the query match the expected results.
@@ -248,30 +249,30 @@
                 + "?name <http://playsSport> \"Soccer\" " + "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://hasAge"), vf.createLiteral(18)),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://hasAge"), vf.createLiteral(30)),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://hasAge"), vf.createLiteral(14)),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://hasAge"), vf.createLiteral(16)),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://hasAge"), vf.createLiteral(35)),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(18))),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(30))),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(14))),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(16))),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(35))),
 
-        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://playsSport"), vf.createLiteral("Basketball")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://playsSport"), vf.createLiteral("Basketball")));
+        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://playsSport"), vf.createLiteral("Basketball")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://playsSport"), vf.createLiteral("Basketball")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("name", vf.createURI("http://Alice"));
+        bs.addBinding("name", vf.createIRI("http://Alice"));
         bs.addBinding("age", vf.createLiteral("18", XMLSchema.INTEGER));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", vf.createURI("http://Charlie"));
+        bs.addBinding("name", vf.createIRI("http://Charlie"));
         bs.addBinding("age", vf.createLiteral("14", XMLSchema.INTEGER));
         expectedResults.add(bs);
 
@@ -301,16 +302,16 @@
 
                 if (args[0] instanceof Literal) {
                     final Literal literal = (Literal) args[0];
-                    final URI datatype = literal.getDatatype();
+                    final IRI datatype = literal.getDatatype();
 
                     // ABS function accepts only numeric literals
                     if (datatype != null && XMLDatatypeUtil.isNumericDatatype(datatype)) {
                         if (XMLDatatypeUtil.isDecimalDatatype(datatype)) {
                             final BigDecimal bigValue = literal.decimalValue();
-                            return BooleanLiteralImpl.valueOf(bigValue.compareTo(new BigDecimal(TEEN_THRESHOLD)) < 0);
+                            return BooleanLiteral.valueOf(bigValue.compareTo(new BigDecimal(TEEN_THRESHOLD)) < 0);
                         } else if (XMLDatatypeUtil.isFloatingPointDatatype(datatype)) {
                             final double doubleValue = literal.doubleValue();
-                            return BooleanLiteralImpl.valueOf(doubleValue < TEEN_THRESHOLD);
+                            return BooleanLiteral.valueOf(doubleValue < TEEN_THRESHOLD);
                         } else {
                             throw new ValueExprEvaluationException(
                                     "unexpected datatype (expect decimal/int or floating) for function operand: " + args[0]);
@@ -329,30 +330,30 @@
         FunctionRegistry.getInstance().add(fooFunction);
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://hasAge"), vf.createLiteral(18)),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://hasAge"), vf.createLiteral(30)),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://hasAge"), vf.createLiteral(14)),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://hasAge"), vf.createLiteral(16)),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://hasAge"), vf.createLiteral(35)),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(18))),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(30))),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(14))),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(16))),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://hasAge"), vf.createLiteral(BigInteger.valueOf(35))),
 
-        vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://playsSport"), vf.createLiteral("Basketball")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://playsSport"), vf.createLiteral("Soccer")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://playsSport"), vf.createLiteral("Basketball")));
+        vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://playsSport"), vf.createLiteral("Basketball")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://playsSport"), vf.createLiteral("Soccer")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://playsSport"), vf.createLiteral("Basketball")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("name", vf.createURI("http://Alice"));
+        bs.addBinding("name", vf.createIRI("http://Alice"));
         bs.addBinding("age", vf.createLiteral("18", XMLSchema.INTEGER));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("name", vf.createURI("http://Charlie"));
+        bs.addBinding("name", vf.createIRI("http://Charlie"));
         bs.addBinding("age", vf.createLiteral("14", XMLSchema.INTEGER));
         expectedResults.add(bs);
 
@@ -371,53 +372,53 @@
                 + "FILTER(?time > '2001-01-01T01:01:03-08:00'^^xml:dateTime) " + "}";
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
-                        vf.createURI("http://www.w3.org/2006/time#Instant")),
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"),
+                        vf.createIRI("http://www.w3.org/2006/time#Instant")),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T01:01:01-08:00"))), // 1 second
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T04:01:02.000-05:00"))), // 2 second
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T01:01:03-08:00"))), // 3 seconds
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T01:01:04-08:00"))), // 4 seconds
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T09:01:05Z"))), // 5 seconds
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2006-01-01T05:00:00.000Z"))),
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2007-01-01T05:00:00.000Z"))),
-                vf.createStatement(vf.createURI("http://eventz"), vf.createURI(dtPredUri),
+                vf.createStatement(vf.createIRI("http://eventz"), vf.createIRI(dtPredUri),
                         vf.createLiteral(dtf.newXMLGregorianCalendar("2008-01-01T05:00:00.000Z"))));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("http://eventz"));
+        bs.addBinding("event", vf.createIRI("http://eventz"));
         bs.addBinding("time", vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T09:01:04.000Z")));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("http://eventz"));
+        bs.addBinding("event", vf.createIRI("http://eventz"));
         bs.addBinding("time", vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T09:01:05.000Z")));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("http://eventz"));
+        bs.addBinding("event", vf.createIRI("http://eventz"));
         bs.addBinding("time", vf.createLiteral(dtf.newXMLGregorianCalendar("2006-01-01T05:00:00.000Z")));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("http://eventz"));
+        bs.addBinding("event", vf.createIRI("http://eventz"));
         bs.addBinding("time", vf.createLiteral(dtf.newXMLGregorianCalendar("2007-01-01T05:00:00.000Z")));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("http://eventz"));
+        bs.addBinding("event", vf.createIRI("http://eventz"));
         bs.addBinding("time", vf.createLiteral(dtf.newXMLGregorianCalendar("2008-01-01T05:00:00.000Z")));
         expectedResults.add(bs);
 
@@ -429,7 +430,7 @@
     @Test
     public void dateTimeWithin() throws Exception {
 
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         FunctionRegistry.getInstance().add(new DateTimeWithinPeriod());
 
@@ -452,17 +453,17 @@
 
         // Create the Statements that will be loaded into Rya.
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("uri:event1"), vf.createURI("uri:startTime"), lit),
-                vf.createStatement(vf.createURI("uri:event1"), vf.createURI("uri:endTime"), lit1),
-                vf.createStatement(vf.createURI("uri:event2"), vf.createURI("uri:startTime"), lit),
-                vf.createStatement(vf.createURI("uri:event2"), vf.createURI("uri:endTime"), lit2)
+                vf.createStatement(vf.createIRI("uri:event1"), vf.createIRI("uri:startTime"), lit),
+                vf.createStatement(vf.createIRI("uri:event1"), vf.createIRI("uri:endTime"), lit1),
+                vf.createStatement(vf.createIRI("uri:event2"), vf.createIRI("uri:startTime"), lit),
+                vf.createStatement(vf.createIRI("uri:event2"), vf.createIRI("uri:endTime"), lit2)
                );
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("uri:event1"));
+        bs.addBinding("event", vf.createIRI("uri:event1"));
         bs.addBinding("startTime", lit);
         bs.addBinding("endTime", lit1);
         expectedResults.add(bs);
@@ -474,7 +475,7 @@
     @Test
     public void dateTimeWithinNow() throws Exception {
 
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         FunctionRegistry.getInstance().add(new DateTimeWithinPeriod());
 
@@ -493,15 +494,15 @@
 
         // Create the Statements that will be loaded into Rya.
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("uri:event1"), vf.createURI("uri:startTime"), lit),
-                vf.createStatement(vf.createURI("uri:event2"), vf.createURI("uri:startTime"), lit1)
+                vf.createStatement(vf.createIRI("uri:event1"), vf.createIRI("uri:startTime"), lit),
+                vf.createStatement(vf.createIRI("uri:event2"), vf.createIRI("uri:startTime"), lit1)
                );
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("event", vf.createURI("uri:event1"));
+        bs.addBinding("event", vf.createIRI("uri:event1"));
         bs.addBinding("startTime", lit);
         expectedResults.add(bs);
 
@@ -521,7 +522,7 @@
                 + "?obs <uri:hasId> ?id }"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final ZonedDateTime time = ZonedDateTime.now();
         final long currentTime = time.toInstant().toEpochMilli();
@@ -539,18 +540,18 @@
         final String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasId"), vf.createLiteral("id_4")));
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasId"), vf.createLiteral("id_4")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
@@ -622,7 +623,7 @@
                 + "?obs <uri:hasId> ?id }"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final ZonedDateTime time = ZonedDateTime.now();
         final long currentTime = time.toInstant().toEpochMilli();
@@ -640,18 +641,18 @@
         final String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasId"), vf.createLiteral("id_4")));
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasId"), vf.createLiteral("id_4")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
@@ -693,7 +694,7 @@
                 + "?obs <uri:hasId> ?id } group by ?id"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final ZonedDateTime time = ZonedDateTime.now();
         final long currentTime = time.toInstant().toEpochMilli();
@@ -711,24 +712,24 @@
         final String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasId"), vf.createLiteral("id_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasId"), vf.createLiteral("id_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasId"), vf.createLiteral("id_4")),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasId"), vf.createLiteral("id_4")),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasId"), vf.createLiteral("id_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasId"), vf.createLiteral("id_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasId"), vf.createLiteral("id_2")));
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasId"), vf.createLiteral("id_2")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
@@ -813,7 +814,7 @@
                 + "?obs <uri:hasLoc> ?location } group by ?location }}"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final ZonedDateTime time = ZonedDateTime.now();
         final long currentTime = time.toInstant().toEpochMilli();
@@ -831,24 +832,24 @@
         final String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_1")),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_1")),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_4")),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_4")),
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_1")),
-                vf.createStatement(vf.createURI("urn:obs_6"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_1")),
+                vf.createStatement(vf.createIRI("urn:obs_6"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_6"), vf.createURI("uri:hasLoc"), vf.createLiteral("loc_2")));
+                vf.createStatement(vf.createIRI("urn:obs_6"), vf.createIRI("uri:hasLoc"), vf.createLiteral("loc_2")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
@@ -892,7 +893,7 @@
                 + "?obs <uri:hasLoc> ?location } group by ?location }}"; // n
 
         // Create the Statements that will be loaded into Rya.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
         final ZonedDateTime time = ZonedDateTime.now();
         final long currentTime = time.toInstant().toEpochMilli();
@@ -910,26 +911,26 @@
         final String time4 = zTime4.format(DateTimeFormatter.ISO_INSTANT);
 
         final Collection<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time1))),
-                vf.createStatement(vf.createURI("urn:obs_1"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_1")),
-                vf.createStatement(vf.createURI("uri:loc_1"), vf.createURI("uri:hasPopulation"), vf.createLiteral(3500)),
-                vf.createStatement(vf.createURI("uri:loc_2"), vf.createURI("uri:hasPopulation"), vf.createLiteral(8000)),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_1"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_1")),
+                vf.createStatement(vf.createIRI("uri:loc_1"), vf.createIRI("uri:hasPopulation"), vf.createLiteral(3500)),
+                vf.createStatement(vf.createIRI("uri:loc_2"), vf.createIRI("uri:hasPopulation"), vf.createLiteral(8000)),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time2))),
-                vf.createStatement(vf.createURI("urn:obs_2"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_2")),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_2"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_2")),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_3"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_3")),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_3"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_3")),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_4"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_4")),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_4"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_4")),
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time4))),
-                vf.createStatement(vf.createURI("urn:obs_5"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_1")),
-                vf.createStatement(vf.createURI("urn:obs_6"), vf.createURI("uri:hasTime"),
+                vf.createStatement(vf.createIRI("urn:obs_5"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_1")),
+                vf.createStatement(vf.createIRI("urn:obs_6"), vf.createIRI("uri:hasTime"),
                         vf.createLiteral(dtf.newXMLGregorianCalendar(time3))),
-                vf.createStatement(vf.createURI("urn:obs_6"), vf.createURI("uri:hasLoc"), vf.createURI("uri:loc_2")));
+                vf.createStatement(vf.createIRI("urn:obs_6"), vf.createIRI("uri:hasLoc"), vf.createIRI("uri:loc_2")));
 
         // Create the expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
@@ -939,14 +940,14 @@
 
         MapBindingSet bs = new MapBindingSet();
         bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("location", vf.createURI("uri:loc_1"));
+        bs.addBinding("location", vf.createIRI("uri:loc_1"));
         bs.addBinding("population", vf.createLiteral("3500", XMLSchema.INTEGER));
         bs.addBinding("periodicBinId", vf.createLiteral(binId));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
         bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("location", vf.createURI("uri:loc_2"));
+        bs.addBinding("location", vf.createIRI("uri:loc_2"));
         bs.addBinding("population", vf.createLiteral("8000", XMLSchema.INTEGER));
         bs.addBinding("periodicBinId", vf.createLiteral(binId));
         expectedResults.add(bs);
@@ -954,7 +955,7 @@
 
         bs = new MapBindingSet();
         bs.addBinding("total", vf.createLiteral("2", XMLSchema.INTEGER));
-        bs.addBinding("location", vf.createURI("uri:loc_2"));
+        bs.addBinding("location", vf.createIRI("uri:loc_2"));
         bs.addBinding("population", vf.createLiteral("8000", XMLSchema.INTEGER));
         bs.addBinding("periodicBinId", vf.createLiteral(binId + period));
         expectedResults.add(bs);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaExportIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaExportIT.java
index 15ff1b4..eabcd57 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaExportIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaExportIT.java
@@ -33,11 +33,11 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -60,7 +60,7 @@
                 "}";
 
         // Triples that will be streamed into Fluo after the PCJ has been created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<RyaStatement> streamedTriples = Sets.newHashSet(
                 new RyaStatement(new RyaURI("http://Alice"), new RyaURI("http://talksTo"), new RyaURI("http://Bob")),
                 new RyaStatement(new RyaURI("http://Bob"), new RyaURI("http://livesIn"), new RyaURI("http://London")),
@@ -86,21 +86,21 @@
         final Set<BindingSet> expected = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Bob"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Bob"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://Charlie"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://Charlie"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", vf.createURI("http://Alice"));
-        bs.addBinding("worker", vf.createURI("http://David"));
-        bs.addBinding("city", vf.createURI("http://London"));
+        bs.addBinding("customer", vf.createIRI("http://Alice"));
+        bs.addBinding("worker", vf.createIRI("http://David"));
+        bs.addBinding("city", vf.createIRI("http://London"));
         expected.add(bs);
 
         // Create the PCJ table.
@@ -113,7 +113,7 @@
             new CreateFluoPcj().withRyaIntegration(pcjId, pcjStorage, fluoClient, accumuloConn, getRyaInstanceName());
 
             // Stream the data into Fluo.
-            new InsertTriples().insert(fluoClient, streamedTriples, Optional.<String>absent());
+            new InsertTriples().insert(fluoClient, streamedTriples, Optional.absent());
 
             // Fetch the exported results from Accumulo once the observers finish working.
             super.getMiniFluo().waitForObservers();
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaInputIncrementalUpdateIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaInputIncrementalUpdateIT.java
index 65083e8..f6b88fe 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaInputIncrementalUpdateIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/RyaInputIncrementalUpdateIT.java
@@ -34,14 +34,14 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.indexing.pcj.update.PrecomputedJoinUpdater;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.collect.Sets;
 
@@ -67,29 +67,29 @@
                 "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
 
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin")),
 
-                vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // The expected results of the SPARQL query once the PCJ has been
         // computed.
         final Set<BindingSet> expected = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Bob"));
+        bs.addBinding("x", vf.createIRI("http://Bob"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Charlie"));
+        bs.addBinding("x", vf.createIRI("http://Charlie"));
         expected.add(bs);
 
         // Create the PCJ table.
@@ -140,17 +140,17 @@
                 "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Joe"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Joe"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Triples that will be streamed into Fluo after the PCJ has been
         final Set<Statement> streamedTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Joe"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Joe"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Load the historic data into Rya.
         final SailRepositoryConnection ryaConn = super.getRyaSailRepository().getConnection();
@@ -179,15 +179,15 @@
 
             final Set<BindingSet> expected = new HashSet<>();
             MapBindingSet bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Alice"));
+            bs.addBinding("x", vf.createIRI("http://Alice"));
             expected.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Frank"));
+            bs.addBinding("x", vf.createIRI("http://Frank"));
             expected.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Joe"));
+            bs.addBinding("x", vf.createIRI("http://Joe"));
             expected.add(bs);
 
             final Set<BindingSet> results = new HashSet<>();
@@ -211,17 +211,17 @@
                  "}";
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> historicTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),
-                vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")),
-                vf.createStatement(vf.createURI("http://Joe"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),
+                vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")),
+                vf.createStatement(vf.createIRI("http://Joe"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Triples that will be streamed into Fluo after the PCJ has been
         final Set<Statement> streamedTriples = Sets.newHashSet(
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://talksTo"), vf.createURI("http://Betty")),
-                vf.createStatement(vf.createURI("http://Joe"), vf.createURI("http://talksTo"), vf.createURI("http://Alice")),
-                vf.createStatement(vf.createURI("http://Frank"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")));
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://talksTo"), vf.createIRI("http://Betty")),
+                vf.createStatement(vf.createIRI("http://Joe"), vf.createIRI("http://talksTo"), vf.createIRI("http://Alice")),
+                vf.createStatement(vf.createIRI("http://Frank"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")));
 
         // Load the historic data into Rya.
         final SailRepositoryConnection ryaConn = super.getRyaSailRepository().getConnection();
@@ -251,18 +251,18 @@
             final Set<BindingSet> expected = new HashSet<>();
 
             MapBindingSet bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Alice"));
-            bs.addBinding("y", vf.createURI("http://Eve"));
+            bs.addBinding("x", vf.createIRI("http://Alice"));
+            bs.addBinding("y", vf.createIRI("http://Eve"));
             expected.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Frank"));
-            bs.addBinding("y", vf.createURI("http://Betty"));
+            bs.addBinding("x", vf.createIRI("http://Frank"));
+            bs.addBinding("y", vf.createIRI("http://Betty"));
             expected.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("x", vf.createURI("http://Joe"));
-            bs.addBinding("y", vf.createURI("http://Alice"));
+            bs.addBinding("x", vf.createIRI("http://Joe"));
+            bs.addBinding("y", vf.createIRI("http://Alice"));
             expected.add(bs);
 
             final Set<BindingSet> results = new HashSet<>();
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/StreamingTestIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/StreamingTestIT.java
index 6135920..776b69f 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/StreamingTestIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/integration/StreamingTestIT.java
@@ -33,17 +33,16 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
 
 public class StreamingTestIT extends RyaExportITBase {
 
 	private static final Logger log = Logger.getLogger(StreamingTestIT.class);
+	private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
 	@Test
 	public void testRandomStreamingIngest() throws Exception {
@@ -85,13 +84,13 @@
 		final Set<Statement> statementPairs = new HashSet<>();
 		for (int i = 0; i < numPairs; i++) {
 			final String uri = "http://uuid_" + UUID.randomUUID().toString();
-			final Statement statement1 = new StatementImpl(new URIImpl(uri), new URIImpl("http://pred1"),
-					new LiteralImpl("number_" + (i + 1)));
-			final Statement statement2 = new StatementImpl(new URIImpl(uri), new URIImpl("http://pred2"), new LiteralImpl("literal"));
+			final Statement statement1 = VF.createStatement(VF.createIRI(uri), VF.createIRI("http://pred1"),
+					VF.createLiteral("number_" + (i + 1)));
+			final Statement statement2 = VF.createStatement(VF.createIRI(uri), VF.createIRI("http://pred2"), VF.createLiteral("literal"));
 			statementPairs.add(statement1);
 			statementPairs.add(statement2);
 		}
-		super.getRyaSailRepository().getConnection().add(statementPairs, new Resource[0]);
+		super.getRyaSailRepository().getConnection().add(statementPairs);
 		super.getMiniFluo().waitForObservers();
 	}
 }
\ No newline at end of file
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/HistoricStreamingVisibilityIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/HistoricStreamingVisibilityIT.java
index eab99b8..33c2761 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/HistoricStreamingVisibilityIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/HistoricStreamingVisibilityIT.java
@@ -36,13 +36,13 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Sets;
 
@@ -74,19 +74,19 @@
         dao.init();
 
         // Triples that are loaded into Rya before the PCJ is created.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final Set<RyaStatement> historicTriples = Sets.newHashSet(
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Alice"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),"U"),
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),"V"),
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://talksTo"), vf.createURI("http://Eve")),"W"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Alice"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),"U"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),"V"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://talksTo"), vf.createIRI("http://Eve")),"W"),
 
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://helps"), vf.createURI("http://Kevin")), "U"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://helps"), vf.createIRI("http://Kevin")), "U"),
 
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Bob"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")), "W"),
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Charlie"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")), "V"),
-                makeRyaStatement(vf.createStatement(vf.createURI("http://Eve"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")), "U"),
-                makeRyaStatement(vf.createStatement(vf.createURI("http://David"), vf.createURI("http://worksAt"), vf.createURI("http://Chipotle")), "V"));
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Bob"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")), "W"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Charlie"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")), "V"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://Eve"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")), "U"),
+                makeRyaStatement(vf.createStatement(vf.createIRI("http://David"), vf.createIRI("http://worksAt"), vf.createIRI("http://Chipotle")), "V"));
 
         dao.add(historicTriples.iterator());
         dao.flush();
@@ -95,11 +95,11 @@
         final Set<BindingSet> expected = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Bob"));
+        bs.addBinding("x", vf.createIRI("http://Bob"));
         expected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("x", vf.createURI("http://Charlie"));
+        bs.addBinding("x", vf.createIRI("http://Charlie"));
         expected.add(bs);
 
         // Create the PCJ table.
diff --git a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/PcjVisibilityIT.java b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/PcjVisibilityIT.java
index 45be971..60df148 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/PcjVisibilityIT.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.integration/src/test/java/org/apache/rya/indexing/pcj/fluo/visibility/PcjVisibilityIT.java
@@ -58,14 +58,14 @@
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.google.common.base.Optional;
 import com.google.common.collect.Sets;
@@ -76,16 +76,16 @@
  */
 public class PcjVisibilityIT extends RyaExportITBase {
 
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     // Constants used within the test.
-    private static final URI ALICE = VF.createURI("urn:Alice");
-    private static final URI BOB = VF.createURI("urn:Bob");
-    private static final URI TALKS_TO = VF.createURI("urn:talksTo");
-    private static final URI LIVES_IN = VF.createURI("urn:livesIn");
-    private static final URI WORKS_AT = VF.createURI("urn:worksAt");
-    private static final URI HAPPYVILLE = VF.createURI("urn:Happyville");
-    private static final URI BURGER_JOINT = VF.createURI("urn:BurgerJoint");
+    private static final IRI ALICE = VF.createIRI("urn:Alice");
+    private static final IRI BOB = VF.createIRI("urn:Bob");
+    private static final IRI TALKS_TO = VF.createIRI("urn:talksTo");
+    private static final IRI LIVES_IN = VF.createIRI("urn:livesIn");
+    private static final IRI WORKS_AT = VF.createIRI("urn:worksAt");
+    private static final IRI HAPPYVILLE = VF.createIRI("urn:Happyville");
+    private static final IRI BURGER_JOINT = VF.createIRI("urn:BurgerJoint");
 
     @Test
     public void visibilitySimplified() throws Exception {
@@ -239,27 +239,27 @@
 
         final Set<BindingSet> rootExpected = Sets.newHashSet();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("customer", VF.createURI("http://Alice"));
-        bs.addBinding("worker", VF.createURI("http://Bob"));
-        bs.addBinding("city", VF.createURI("http://London"));
+        bs.addBinding("customer", VF.createIRI("http://Alice"));
+        bs.addBinding("worker", VF.createIRI("http://Bob"));
+        bs.addBinding("city", VF.createIRI("http://London"));
         rootExpected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", VF.createURI("http://Alice"));
-        bs.addBinding("worker", VF.createURI("http://Charlie"));
-        bs.addBinding("city", VF.createURI("http://London"));
+        bs.addBinding("customer", VF.createIRI("http://Alice"));
+        bs.addBinding("worker", VF.createIRI("http://Charlie"));
+        bs.addBinding("city", VF.createIRI("http://London"));
         rootExpected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", VF.createURI("http://Alice"));
-        bs.addBinding("worker", VF.createURI("http://Eve"));
-        bs.addBinding("city", VF.createURI("http://Leeds"));
+        bs.addBinding("customer", VF.createIRI("http://Alice"));
+        bs.addBinding("worker", VF.createIRI("http://Eve"));
+        bs.addBinding("city", VF.createIRI("http://Leeds"));
         rootExpected.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("customer", VF.createURI("http://Alice"));
-        bs.addBinding("worker", VF.createURI("http://David"));
-        bs.addBinding("city", VF.createURI("http://London"));
+        bs.addBinding("customer", VF.createIRI("http://Alice"));
+        bs.addBinding("worker", VF.createIRI("http://David"));
+        bs.addBinding("city", VF.createIRI("http://London"));
         rootExpected.add(bs);
 
         assertEquals(rootExpected, rootResults);
@@ -273,9 +273,9 @@
 
             final Set<BindingSet> abExpected = Sets.newHashSet();
             bs = new MapBindingSet();
-            bs.addBinding("customer", VF.createURI("http://Alice"));
-            bs.addBinding("worker", VF.createURI("http://Bob"));
-            bs.addBinding("city", VF.createURI("http://London"));
+            bs.addBinding("customer", VF.createIRI("http://Alice"));
+            bs.addBinding("worker", VF.createIRI("http://Bob"));
+            bs.addBinding("city", VF.createIRI("http://London"));
             abExpected.add(bs);
 
             assertEquals(abExpected, abResults);
@@ -288,15 +288,15 @@
 
             final Set<BindingSet> abcExpected = Sets.newHashSet();
             bs = new MapBindingSet();
-            bs.addBinding("customer", VF.createURI("http://Alice"));
-            bs.addBinding("worker", VF.createURI("http://Bob"));
-            bs.addBinding("city", VF.createURI("http://London"));
+            bs.addBinding("customer", VF.createIRI("http://Alice"));
+            bs.addBinding("worker", VF.createIRI("http://Bob"));
+            bs.addBinding("city", VF.createIRI("http://London"));
             abcExpected.add(bs);
 
             bs = new MapBindingSet();
-            bs.addBinding("customer", VF.createURI("http://Alice"));
-            bs.addBinding("worker", VF.createURI("http://Charlie"));
-            bs.addBinding("city", VF.createURI("http://London"));
+            bs.addBinding("customer", VF.createIRI("http://Alice"));
+            bs.addBinding("worker", VF.createIRI("http://Charlie"));
+            bs.addBinding("city", VF.createIRI("http://London"));
             abcExpected.add(bs);
 
             assertEquals(abcExpected, abcResults);
@@ -309,9 +309,9 @@
 
             final Set<BindingSet> adeExpected = Sets.newHashSet();
             bs = new MapBindingSet();
-            bs.addBinding("customer", VF.createURI("http://Alice"));
-            bs.addBinding("worker", VF.createURI("http://Eve"));
-            bs.addBinding("city", VF.createURI("http://Leeds"));
+            bs.addBinding("customer", VF.createIRI("http://Alice"));
+            bs.addBinding("worker", VF.createIRI("http://Eve"));
+            bs.addBinding("city", VF.createIRI("http://Leeds"));
             adeExpected.add(bs);
 
             assertEquals(adeExpected, adeResults);
diff --git a/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/FluoITBase.java b/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/FluoITBase.java
index 48334d0..18fc1c6 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/FluoITBase.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/FluoITBase.java
@@ -7,26 +7,6 @@
  * "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.
- */
-package org.apache.rya.pcj.fluo.test.base;
-
-/**
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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,
@@ -36,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.pcj.fluo.test.base;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -76,14 +57,14 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.apache.zookeeper.ClientCnxn;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.junit.Rule;
 
 /**
  * Integration tests that ensure the Fluo application processes PCJs results
diff --git a/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/KafkaExportITBase.java b/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/KafkaExportITBase.java
index 465e089..b60b56f 100644
--- a/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/KafkaExportITBase.java
+++ b/extras/rya.pcj.fluo/pcj.fluo.test.base/src/main/java/org/apache/rya/pcj/fluo/test/base/KafkaExportITBase.java
@@ -70,12 +70,12 @@
 import org.apache.rya.indexing.pcj.fluo.app.query.StatementPatternIdCacheSupplier;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
 
 import com.google.common.collect.Sets;
 
diff --git a/extras/rya.pcj.fluo/rya.pcj.functions.geo/pom.xml b/extras/rya.pcj.fluo/rya.pcj.functions.geo/pom.xml
index dc80206..8b04c61 100644
--- a/extras/rya.pcj.fluo/rya.pcj.functions.geo/pom.xml
+++ b/extras/rya.pcj.fluo/rya.pcj.functions.geo/pom.xml
@@ -47,12 +47,11 @@
         <dependency>
             <groupId>org.eclipse.rdf4j</groupId>
             <artifactId>rdf4j-queryalgebra-geosparql</artifactId>
-            <version>2.2</version>
+            <version>${org.eclipse.rdf4j.version}</version>
         </dependency>
         <dependency>
             <groupId>org.eclipse.rdf4j</groupId>
             <artifactId>rdf4j-queryalgebra-evaluation</artifactId>
-            <version>2.1.6</version>
         </dependency>
         <!-- Testing dependencies. -->
         <dependency>
@@ -91,7 +90,7 @@
                     <configuration>
                     <excludes>
                         <!--  Trivial listing of classes to be loaded via SPI -->
-                        <exclude>src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function</exclude>
+                        <exclude>src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function</exclude>
                     </excludes>
                     </configuration>
                 </plugin>
diff --git a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/java/org/apache/rya/indexing/pcj/functions/geo/FunctionAdapter.java b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/java/org/apache/rya/indexing/pcj/functions/geo/FunctionAdapter.java
index 2fbe334..8c765e2 100644
--- a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/java/org/apache/rya/indexing/pcj/functions/geo/FunctionAdapter.java
+++ b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/java/org/apache/rya/indexing/pcj/functions/geo/FunctionAdapter.java
@@ -19,13 +19,13 @@
 package org.apache.rya.indexing.pcj.functions.geo;
 
 import org.eclipse.rdf4j.model.IRI;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.BooleanLiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.BooleanLiteralImpl;
+import org.eclipse.rdf4j.model.impl.URIImpl;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
 
 /**
  * Make a RDF4J Function look like an openRDF Function.
@@ -58,8 +58,8 @@
             return valueFactory.createLiteral(((org.eclipse.rdf4j.model.impl.BooleanLiteral) v).booleanValue());
         else if (v instanceof org.eclipse.rdf4j.model.Literal) {
             org.eclipse.rdf4j.model.Literal vLiteral = (org.eclipse.rdf4j.model.Literal) v;
-            org.openrdf.model.URI vType = valueFactory.createURI(vLiteral.getDatatype().stringValue());
-            org.openrdf.model.Literal theReturnValue = valueFactory.createLiteral(vLiteral.getLabel(), vType);
+            org.eclipse.rdf4j.model.URI vType = valueFactory.createIRI(vLiteral.getDatatype().stringValue());
+            org.eclipse.rdf4j.model.Literal theReturnValue = valueFactory.createLiteral(vLiteral.getLabel(), vType);
             return theReturnValue;
         }
         //
diff --git a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
similarity index 100%
rename from extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function
rename to extras/rya.pcj.fluo/rya.pcj.functions.geo/src/main/resources/META-INF/services/org.eclipse.rdf4j.query.algebra.evaluation.function.Function
diff --git a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsIT.java b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsIT.java
index f540a2e..2ac9f45 100644
--- a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsIT.java
+++ b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsIT.java
@@ -37,18 +37,18 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.accumulo.AccumuloPcjStorage;
 import org.apache.rya.pcj.fluo.test.base.RyaExportITBase;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.ValueExprEvaluationException;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.function.Function;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.collect.Sets;
 
@@ -87,12 +87,12 @@
                     " FILTER(ryageo:ehContains(?wkt, \"POLYGON((-77 39, -76 39, -76 38, -77 38, -77 39))\"^^geo:wktLiteral)) " +
                 "}";
 
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#feature"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("http://www.opengis.net/ont/geosparql#Feature")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#feature"), vf.createURI("http://www.opengis.net/ont/geosparql#hasGeometry"), vf.createURI("tag:rya.apache.org,2017:ex#test_point")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#test_point"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("http://www.opengis.net/ont/geosparql#Point")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#test_point"), vf.createURI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-77.03524 38.889468)", vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral"))));
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#feature"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("http://www.opengis.net/ont/geosparql#Feature")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#feature"), vf.createIRI("http://www.opengis.net/ont/geosparql#hasGeometry"), vf.createIRI("tag:rya.apache.org,2017:ex#test_point")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#test_point"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("http://www.opengis.net/ont/geosparql#Point")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#test_point"), vf.createIRI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-77.03524 38.889468)", vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral"))));
 
         // Create a Geo function.
         final Function geoFunction = new Function() {
@@ -116,9 +116,9 @@
         // The expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("wkt", vf.createLiteral("Point(-77.03524 38.889468)", vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral")));
-        bs.addBinding("feature", vf.createURI("tag:rya.apache.org,2017:ex#feature"));
-        bs.addBinding("point", vf.createURI("tag:rya.apache.org,2017:ex#test_point"));
+        bs.addBinding("wkt", vf.createLiteral("Point(-77.03524 38.889468)", vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral")));
+        bs.addBinding("feature", vf.createIRI("tag:rya.apache.org,2017:ex#feature"));
+        bs.addBinding("point", vf.createIRI("tag:rya.apache.org,2017:ex#test_point"));
         expectedResults.add(bs);
 
         runTest(sparql, statements, expectedResults);
@@ -141,41 +141,41 @@
                     " FILTER ( !sameTerm (?cityA, ?cityB) ) " +
                 "}";
 
-        final ValueFactory vf = new ValueFactoryImpl();
-        final URI wktTypeUri = vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral");
-        final URI asWKT = vf.createURI("http://www.opengis.net/ont/geosparql#asWKT");
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final IRI wktTypeUri = vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral");
+        final IRI asWKT = vf.createIRI("http://www.opengis.net/ont/geosparql#asWKT");
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#dakar"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#dakar2"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#canberra"), asWKT, vf.createLiteral("Point(149.12 -35.31)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#brussels"), asWKT, vf.createLiteral("Point(4.35 50.85)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"), vf.createURI("urn:containedIn"), vf.createLiteral("Europe")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#dakar"), vf.createURI("urn:containedIn"), vf.createLiteral("Africa")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#dakar2"), vf.createURI("urn:containedIn"), vf.createLiteral("Africa")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#brussels"), vf.createURI("urn:containedIn"), vf.createLiteral("Europe")));
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#dakar"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#dakar2"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#canberra"), asWKT, vf.createLiteral("Point(149.12 -35.31)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#brussels"), asWKT, vf.createLiteral("Point(4.35 50.85)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"), vf.createIRI("urn:containedIn"), vf.createLiteral("Europe")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#dakar"), vf.createIRI("urn:containedIn"), vf.createLiteral("Africa")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#dakar2"), vf.createIRI("urn:containedIn"), vf.createLiteral("Africa")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#brussels"), vf.createIRI("urn:containedIn"), vf.createLiteral("Europe")));
 
-        // The expected results of the SPARQL query once the PCJ has been computed.l
+        // The expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#dakar"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#dakar2"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#dakar"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#dakar2"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#dakar2"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#dakar"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#dakar2"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#dakar"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#brussels"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#brussels"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#brussels"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#brussels"));
         expectedResults.add(bs);
 
         runTest(sparql, statements, expectedResults);
@@ -209,22 +209,22 @@
                     "FILTER(geof:sfWithin(?wkt, \"POLYGON((-78 39, -76 39, -76 38, -78 38, -78 39))\"^^geo:wktLiteral)) " +
                 "}";
 
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#feature"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("http://www.opengis.net/ont/geosparql#Feature")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#feature"), vf.createURI("http://www.opengis.net/ont/geosparql#hasGeometry"), vf.createURI("tag:rya.apache.org,2017:ex#test_point")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#test_point"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("http://www.opengis.net/ont/geosparql#Point")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#test_point"), vf.createURI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-77.03524 38.889468)", vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral"))),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#skip_point"), vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("http://www.opengis.net/ont/geosparql#Point")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#skip_point"), vf.createURI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-10 10)", vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral"))));
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#feature"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("http://www.opengis.net/ont/geosparql#Feature")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#feature"), vf.createIRI("http://www.opengis.net/ont/geosparql#hasGeometry"), vf.createIRI("tag:rya.apache.org,2017:ex#test_point")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#test_point"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("http://www.opengis.net/ont/geosparql#Point")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#test_point"), vf.createIRI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-77.03524 38.889468)", vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral"))),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#skip_point"), vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("http://www.opengis.net/ont/geosparql#Point")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#skip_point"), vf.createIRI("http://www.opengis.net/ont/geosparql#asWKT"), vf.createLiteral("Point(-10 10)", vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral"))));
 
         // Register geo functions from RDF4J is done automatically via SPI.
         // The expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("wkt", vf.createLiteral("Point(-77.03524 38.889468)", vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral")));
-        bs.addBinding("feature", vf.createURI("tag:rya.apache.org,2017:ex#feature"));
-        bs.addBinding("point", vf.createURI("tag:rya.apache.org,2017:ex#test_point"));
+        bs.addBinding("wkt", vf.createLiteral("Point(-77.03524 38.889468)", vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral")));
+        bs.addBinding("feature", vf.createIRI("tag:rya.apache.org,2017:ex#feature"));
+        bs.addBinding("point", vf.createIRI("tag:rya.apache.org,2017:ex#test_point"));
         expectedResults.add(bs);
 
         runTest(sparql, statements, expectedResults);
@@ -248,29 +248,29 @@
                     " FILTER ( !sameTerm (?cityA, ?cityB) ) " +
                 "}";
 
-        final ValueFactory vf = new ValueFactoryImpl();
-        final URI wktTypeUri = vf.createURI("http://www.opengis.net/ont/geosparql#wktLiteral");
-        final URI asWKT = vf.createURI("http://www.opengis.net/ont/geosparql#asWKT");
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final IRI wktTypeUri = vf.createIRI("http://www.opengis.net/ont/geosparql#wktLiteral");
+        final IRI asWKT = vf.createIRI("http://www.opengis.net/ont/geosparql#asWKT");
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#dakar"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#canberra"), asWKT, vf.createLiteral("Point(149.12 -35.31)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#brussels"), asWKT, vf.createLiteral("Point(4.35 50.85)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"), vf.createURI("urn:containedIn"), vf.createLiteral("Europe")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam2"), vf.createURI("urn:containedIn"), vf.createLiteral("Europe")),
-                vf.createStatement(vf.createURI("tag:rya.apache.org,2017:ex#amsterdam2"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)));
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#dakar"), asWKT, vf.createLiteral("Point(-17.45 14.69)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#canberra"), asWKT, vf.createLiteral("Point(149.12 -35.31)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#brussels"), asWKT, vf.createLiteral("Point(4.35 50.85)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"), vf.createIRI("urn:containedIn"), vf.createLiteral("Europe")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam2"), vf.createIRI("urn:containedIn"), vf.createLiteral("Europe")),
+                vf.createStatement(vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam2"), asWKT, vf.createLiteral("Point(4.9 52.37)", wktTypeUri)));
 
         // The expected results of the SPARQL query once the PCJ has been computed.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam2"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam2"));
         expectedResults.add(bs);
 
         bs = new MapBindingSet();
-        bs.addBinding("cityA", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam2"));
-        bs.addBinding("cityB", vf.createURI("tag:rya.apache.org,2017:ex#amsterdam"));
+        bs.addBinding("cityA", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam2"));
+        bs.addBinding("cityB", vf.createIRI("tag:rya.apache.org,2017:ex#amsterdam"));
         expectedResults.add(bs);
 
         runTest(sparql, statements, expectedResults);
@@ -290,14 +290,14 @@
                 "}";
 
         // create some resources and literals to make statements out of
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final DatatypeFactory dtf = DatatypeFactory.newInstance();
 
-        final URI dtPredUri = vf.createURI("http://www.w3.org/2006/time#inXSDDateTime");
-        final URI eventz = vf.createURI("<http://eventz>");
+        final IRI dtPredUri = vf.createIRI("http://www.w3.org/2006/time#inXSDDateTime");
+        final IRI eventz = vf.createIRI("<http://eventz>");
 
         final Set<Statement> statements = Sets.newHashSet(
-                vf.createStatement(eventz, vf.createURI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createURI("<http://www.w3.org/2006/time#Instant>")),
+                vf.createStatement(eventz, vf.createIRI("http://www.w3.org/1999/02/22-rdf-syntax-ns#type"), vf.createIRI("<http://www.w3.org/2006/time#Instant>")),
                 vf.createStatement(eventz, dtPredUri, vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T01:01:01-08:00"))), // 1 second
                 vf.createStatement(eventz, dtPredUri, vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T04:01:02.000-05:00"))), // 2 seconds
                 vf.createStatement(eventz, dtPredUri, vf.createLiteral(dtf.newXMLGregorianCalendar("2001-01-01T01:01:03-08:00"))), // 3 seconds
diff --git a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsTest.java b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsTest.java
index f73fa8f..7ed6246 100644
--- a/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsTest.java
+++ b/extras/rya.pcj.fluo/rya.pcj.functions.geo/src/test/java/org/apache/rya/indexing/pcj/functions/geo/GeoFunctionsTest.java
@@ -26,9 +26,9 @@
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
 import org.apache.zookeeper.ClientCnxn;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
 
 /**
  * Verifies that the geoFunctions are registered via SPI.
@@ -45,7 +45,7 @@
     /**
      * Thirty-some functions are registered via SPI. Make sure they are registered.
      * This file lists functions to load:
-     * src/main/resources/META-INF/services/org.openrdf.query.algebra.evaluation.function.Function
+     * src/main/resources/META-INF/services/ org.eclipse.rdf4j.query.algebra.evaluation.function.Function
      */
     @Test
     public void verifySpiLoadedGeoFunctions() {
diff --git a/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAO.java b/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAO.java
index e9a2ccc..382266b 100644
--- a/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAO.java
+++ b/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAO.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.ArrayList;
@@ -30,13 +28,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.rya.accumulo.AccumuloRdfUtils;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.layout.TableLayoutStrategy;
-import org.apache.rya.api.persist.RdfDAOException;
-import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.Connector;
@@ -50,22 +41,24 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.ExternalSet;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.apache.rya.accumulo.AccumuloRdfUtils;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.layout.TableLayoutStrategy;
+import org.apache.rya.api.persist.RdfDAOException;
+import org.apache.rya.api.persist.RdfEvalStatsDAO;
+import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ExternalSet;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-
-
-
-
 public class AccumuloSelectivityEvalDAO implements SelectivityEvalDAO<RdfCloudTripleStoreConfiguration> {
 
   private boolean initialized = false;
@@ -76,7 +69,7 @@
   private boolean denormalized = false;
   private int FullTableCardinality = 0;
   private static final String DELIM = "\u0000";
-  private Map<String,Long> joinMap = new HashMap<String,Long>();;
+  private Map<String,Long> joinMap = new HashMap<String,Long>();
   private RdfEvalStatsDAO<RdfCloudTripleStoreConfiguration> resd;
 
   @Override
@@ -458,13 +451,6 @@
   
   
   
-  
-  
-  
-  
-  
-  
-  
 
   // obtains cardinality for StatementPattern. Returns cardinality of 0
   // if no instances of constants occur in table.
@@ -475,9 +461,9 @@
     Var subjectVar = sp.getSubjectVar();
     Resource subj = (Resource) getConstantValue(subjectVar);
     Var predicateVar = sp.getPredicateVar();
-    URI pred = (URI) getConstantValue(predicateVar);
+    IRI pred = (IRI) getConstantValue(predicateVar);
     Var objectVar = sp.getObjectVar();
-    org.openrdf.model.Value obj = getConstantValue(objectVar);
+    org.eclipse.rdf4j.model.Value obj = getConstantValue(objectVar);
     Resource context = (Resource) getConstantValue(sp.getContextVar());
 
     /**
@@ -492,7 +478,7 @@
     }
     try {
       if (subj != null) {
-        List<org.openrdf.model.Value> values = new ArrayList<org.openrdf.model.Value>();
+        List<org.eclipse.rdf4j.model.Value> values = new ArrayList<org.eclipse.rdf4j.model.Value>();
         CARDINALITY_OF card = RdfEvalStatsDAO.CARDINALITY_OF.SUBJECT;
         values.add(subj);
 
@@ -514,7 +500,7 @@
           cardinality = 0;
         }
       } else if (pred != null) {
-        List<org.openrdf.model.Value> values = new ArrayList<org.openrdf.model.Value>();
+        List<org.eclipse.rdf4j.model.Value> values = new ArrayList<org.eclipse.rdf4j.model.Value>();
         CARDINALITY_OF card = RdfEvalStatsDAO.CARDINALITY_OF.PREDICATE;
         values.add(pred);
 
@@ -531,7 +517,7 @@
           cardinality = 0;
         }
       } else if (obj != null) {
-        List<org.openrdf.model.Value> values = new ArrayList<org.openrdf.model.Value>();
+        List<org.eclipse.rdf4j.model.Value> values = new ArrayList<org.eclipse.rdf4j.model.Value>();
         values.add(obj);
         double evalCard = this.getCardinality(conf, RdfEvalStatsDAO.CARDINALITY_OF.OBJECT, values, context);
         if (evalCard >= 0) {
@@ -550,18 +536,18 @@
     return (long) cardinality;
   }
 
-  private org.openrdf.model.Value getConstantValue(Var var) {
+  private org.eclipse.rdf4j.model.Value getConstantValue(Var var) {
     if (var != null)
       return var.getValue();
     else
       return null;
   }
 
-  public double getCardinality(RdfCloudTripleStoreConfiguration conf, CARDINALITY_OF card, List<org.openrdf.model.Value> val) throws RdfDAOException {
+  public double getCardinality(RdfCloudTripleStoreConfiguration conf, CARDINALITY_OF card, List<org.eclipse.rdf4j.model.Value> val) throws RdfDAOException {
     return resd.getCardinality(conf, card, val);
   }
 
-  public double getCardinality(RdfCloudTripleStoreConfiguration conf, CARDINALITY_OF card, List<org.openrdf.model.Value> val, Resource context) throws RdfDAOException {
+  public double getCardinality(RdfCloudTripleStoreConfiguration conf, CARDINALITY_OF card, List<org.eclipse.rdf4j.model.Value> val, Resource context) throws RdfDAOException {
 
     return resd.getCardinality(conf, card, val, context);
 
@@ -613,7 +599,7 @@
   
   
   
-  private static class SpExternalCollector extends QueryModelVisitorBase<RuntimeException> {
+  private static class SpExternalCollector extends AbstractQueryModelVisitor<RuntimeException> {
 
       private List<QueryModelNode> eSet = Lists.newArrayList();
         
diff --git a/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/CardinalityCalcUtil.java b/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/CardinalityCalcUtil.java
index c0453ba..c836ac9 100644
--- a/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/CardinalityCalcUtil.java
+++ b/extras/rya.prospector/src/main/java/org/apache/rya/joinselect/CardinalityCalcUtil.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.accumulo.core.data.Key;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 public class CardinalityCalcUtil {
 
diff --git a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/IndexWorkPlan.java b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/IndexWorkPlan.java
index 77955e4..db99523 100644
--- a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/IndexWorkPlan.java
+++ b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/IndexWorkPlan.java
@@ -33,7 +33,7 @@
 import org.apache.rya.prospector.domain.IntermediateProspect;
 import org.apache.rya.prospector.mr.ProspectorCombiner;
 import org.apache.rya.prospector.mr.ProspectorMapper;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * Contains the methods that perform each of the Map Reduce functions that result
diff --git a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/impl/CountPlan.java b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/impl/CountPlan.java
index f408b7d..251c784 100644
--- a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/impl/CountPlan.java
+++ b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/plans/impl/CountPlan.java
@@ -53,8 +53,8 @@
 import org.apache.rya.prospector.plans.IndexWorkPlan;
 import org.apache.rya.prospector.utils.CustomEntry;
 import org.apache.rya.prospector.utils.ProspectorUtils;
-import org.openrdf.model.util.URIUtil;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.util.URIUtil;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * An implementation of {@link IndexWorkPlan} that counts the number of times
diff --git a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAO.java b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAO.java
index 3e45781..95e9f19 100644
--- a/extras/rya.prospector/src/main/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAO.java
+++ b/extras/rya.prospector/src/main/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAO.java
@@ -37,8 +37,8 @@
 import org.apache.rya.prospector.domain.IndexEntry;
 import org.apache.rya.prospector.domain.TripleValueType;
 import org.apache.rya.prospector.utils.ProspectorConstants;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * An ${@link org.apache.rya.api.persist.RdfEvalStatsDAO} that uses the Prospector Service underneath return counts.
diff --git a/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAOTest.java b/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAOTest.java
index 25b0dc3..8e58894 100644
--- a/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAOTest.java
+++ b/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/AccumuloSelectivityEvalDAOTest.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.util.ArrayList;
@@ -29,13 +27,6 @@
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
-import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
-import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchWriter;
@@ -54,15 +45,20 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.api.persist.RdfEvalStatsDAO;
+import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/mr/JoinSelectProspectOutputTest.java b/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/mr/JoinSelectProspectOutputTest.java
index a698676..25e3bce 100644
--- a/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/mr/JoinSelectProspectOutputTest.java
+++ b/extras/rya.prospector/src/test/java/org/apache/rya/joinselect/mr/JoinSelectProspectOutputTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya.joinselect.mr;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,24 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
-import static org.junit.Assert.*;
-
-import org.junit.Test;
+package org.apache.rya.joinselect.mr;
 
 import java.io.IOException;
 
-import org.apache.rya.joinselect.mr.JoinSelectProspectOutput;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.hadoop.io.Text;
+import org.apache.hadoop.mrunit.mapreduce.MapDriver;
 import org.apache.rya.joinselect.mr.utils.CardinalityType;
 import org.apache.rya.joinselect.mr.utils.CompositeType;
 import org.apache.rya.joinselect.mr.utils.TripleCard;
-
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.apache.hadoop.io.IntWritable;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.mrunit.mapreduce.MapDriver;
 import org.junit.Test;
 
 public class JoinSelectProspectOutputTest {
diff --git a/extras/rya.prospector/src/test/java/org/apache/rya/prospector/mr/ProspectorTest.java b/extras/rya.prospector/src/test/java/org/apache/rya/prospector/mr/ProspectorTest.java
index eac7aab..96f2685 100644
--- a/extras/rya.prospector/src/test/java/org/apache/rya/prospector/mr/ProspectorTest.java
+++ b/extras/rya.prospector/src/test/java/org/apache/rya/prospector/mr/ProspectorTest.java
@@ -45,8 +45,8 @@
 import org.apache.rya.prospector.domain.TripleValueType;
 import org.apache.rya.prospector.service.ProspectorService;
 import org.apache.rya.prospector.utils.ProspectorConstants;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 import com.google.common.collect.Lists;
 
@@ -239,7 +239,7 @@
      * debugging the test.
      */
     private void debugTable(Connector connector, String table) throws TableNotFoundException {
-        final Iterator<Entry<Key, Value>> it = connector.createScanner(table, new Authorizations(new String[]{"U", "FOUO"})).iterator();
+        final Iterator<Entry<Key, Value>> it = connector.createScanner(table, new Authorizations("U", "FOUO")).iterator();
         while(it.hasNext()) {
             final Entry<Key, Value> entry = it.next();
             System.out.println( entry );
diff --git a/extras/rya.prospector/src/test/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAOTest.java b/extras/rya.prospector/src/test/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAOTest.java
index f048742..b94ed8d 100644
--- a/extras/rya.prospector/src/test/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAOTest.java
+++ b/extras/rya.prospector/src/test/java/org/apache/rya/prospector/service/ProspectorServiceEvalStatsDAOTest.java
@@ -43,11 +43,11 @@
 import org.apache.rya.api.persist.RdfEvalStatsDAO;
 import org.apache.rya.api.persist.RdfEvalStatsDAO.CARDINALITY_OF;
 import org.apache.rya.prospector.mr.Prospector;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
 
 /**
  * Tests that show when the {@link Prospector} job is run, the
@@ -55,6 +55,7 @@
  * information from the prospect table.
  */
 public class ProspectorServiceEvalStatsDAOTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void testCount() throws Exception {
@@ -95,19 +96,19 @@
 
         // Get the cardinality of the 'urn:gem#pred' predicate.
         List<Value> values = new ArrayList<Value>();
-        values.add( new URIImpl("urn:gem#pred") );
+        values.add( VF.createIRI("urn:gem#pred") );
         double count = evalDao.getCardinality(rdfConf, CARDINALITY_OF.PREDICATE, values);
         assertEquals(4.0, count, 0.001);
 
         // Get the cardinality of the 'mydata1' object.
         values = new ArrayList<Value>();
-        values.add( new LiteralImpl("mydata1"));
+        values.add( VF.createLiteral("mydata1"));
         count = evalDao.getCardinality(rdfConf, RdfEvalStatsDAO.CARDINALITY_OF.OBJECT, values);
         assertEquals(1.0, count, 0.001);
 
         // Get the cardinality of the 'mydata3' object.
         values = new ArrayList<Value>();
-        values.add( new LiteralImpl("mydata3"));
+        values.add( VF.createLiteral("mydata3"));
         count = evalDao.getCardinality(rdfConf, RdfEvalStatsDAO.CARDINALITY_OF.OBJECT, values);
         assertEquals(-1.0, count, 0.001);
     }
@@ -151,19 +152,19 @@
 
         // Get the cardinality of the 'urn:gem#pred' predicate.
         List<Value> values = new ArrayList<Value>();
-        values.add( new URIImpl("urn:gem#pred"));
+        values.add( VF.createIRI("urn:gem#pred"));
         double count = evalDao.getCardinality(rdfConf, RdfEvalStatsDAO.CARDINALITY_OF.PREDICATE, values);
         assertEquals(4.0, count, 0.001);
 
         // Get the cardinality of the 'mydata1' object.
         values = new ArrayList<Value>();
-        values.add( new LiteralImpl("mydata1"));
+        values.add( VF.createLiteral("mydata1"));
         count = evalDao.getCardinality(rdfConf, RdfEvalStatsDAO.CARDINALITY_OF.OBJECT, values);
         assertEquals(1.0, count, 0.001);
 
         // Get the cardinality of the 'mydata3' object.
         values = new ArrayList<Value>();
-        values.add( new LiteralImpl("mydata3"));
+        values.add( VF.createLiteral("mydata3"));
         count = evalDao.getCardinality(rdfConf, RdfEvalStatsDAO.CARDINALITY_OF.OBJECT, values);
         assertEquals(-1.0, count, 0.001);
     }
@@ -173,7 +174,7 @@
      * debugging the test.
      */
     private void debugTable(Connector connector, String table) throws TableNotFoundException {
-        final Iterator<Entry<Key, org.apache.accumulo.core.data.Value>> it = connector.createScanner(table, new Authorizations(new String[]{"U", "FOUO"})).iterator();
+        final Iterator<Entry<Key, org.apache.accumulo.core.data.Value>> it = connector.createScanner(table, new Authorizations("U", "FOUO")).iterator();
         while(it.hasNext()) {
             System.out.println( it.next() );
         }
diff --git a/extras/rya.reasoning/README.md b/extras/rya.reasoning/README.md
index 533c903..812542d 100644
--- a/extras/rya.reasoning/README.md
+++ b/extras/rya.reasoning/README.md
@@ -668,12 +668,12 @@
 The main reasoning logic is located in **org.apache.rya.reasoning**, while MapReduce
 tools and utilities for interacting with Accumulo are located in
 **org.apache.rya.reasoning.mr**. Reasoning logic makes use of RDF constructs in the
-**org.openrdf.model** API, in particular: Statement, URI, Resource, and Value.
+**org.eclipse.rdf4j.model** API, in particular: Statement, URI, Resource, and Value.
 
 ### org.apache.rya.reasoning
 
 - **OWL2**:
-    In general, the Sesame/openrdf API is used to represent RDF constructs and
+    In general, the RDF4J API is used to represent RDF constructs and
     refer to the RDF, RDFS, and OWL vocabularies. However, the API only covers
     OWL 1 constructs. The OWL2 class contains static URIs for new OWL 2
     vocabulary resources: owl:IrreflexiveProperty, owl:propertyDisjointWith,
@@ -710,7 +710,7 @@
 
 - An **OwlProperty** or **OwlClass** represents a property or a class, respectively.
     Each object holds a reference to the RDF entity that identifies it (using to
-    the openrdf api): a URI for each OwlProperty, and a Resource for each class
+    the RDF4J api): a URI for each OwlProperty, and a Resource for each class
     (because a class is more general; it can be a URI or a bnode).
 
     Both maintain connections to other schema constructs, according to the
@@ -850,7 +850,7 @@
     jobs (using those parameters).
 
 - **ResourceWritable**:
-    WritableComparable wrapper for org.openrdf.model.Resource, so it can be used as
+    WritableComparable wrapper for org.eclipse.rdf4j.model.Resource, so it can be used as
     a key/value in MapReduce tasks. Also contains an integer field to enable
     arbitrary secondary sort. Provides static classes **PrimaryComparator** to use
     the Resource alone, and **SecondaryComparator** to use resource followed by key.
diff --git a/extras/rya.reasoning/pom.xml b/extras/rya.reasoning/pom.xml
index 864cac8..44042bc 100644
--- a/extras/rya.reasoning/pom.xml
+++ b/extras/rya.reasoning/pom.xml
@@ -62,22 +62,22 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-rdfxml</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-rdfxml</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-turtle</artifactId>
-            <version>${openrdf.sesame.version}</version>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-turtle</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-runtime</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-runtime</artifactId>
         </dependency>
 
         <dependency>
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/AbstractReasoner.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/AbstractReasoner.java
index 22a277e..75313a2 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/AbstractReasoner.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/AbstractReasoner.java
@@ -22,9 +22,9 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Abstract class for reasoning in the neighborhood of a particular resource.
@@ -162,7 +162,7 @@
      * @param   rule    The specific rule rule that yielded the inference
      * @param   source  One (might be the only) fact used in the derivation
      */
-    protected Fact triple(Resource s, URI p, Value o, OwlRule rule,
+    protected Fact triple(Resource s, IRI p, Value o, OwlRule rule,
             Fact source) {
         Fact fact = new Fact(s, p, o, this.currentIteration,
             rule, this.node);
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Derivation.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Derivation.java
index d2eb547..ae8e6da 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Derivation.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Derivation.java
@@ -27,12 +27,11 @@
 import java.util.Set;
 import java.util.TreeSet;
 
-import org.apache.rya.reasoning.mr.ResourceWritable;
-
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableUtils;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Value;
+import org.apache.rya.reasoning.mr.ResourceWritable;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
 
 /**
  * Represents the derivation of a fact.
@@ -133,7 +132,7 @@
      * in any step of the derivation.
      */
     public boolean hasSourceNode(Value v) {
-        return v instanceof Resource && sourceNodes.contains((Resource) v);
+        return v instanceof Resource && sourceNodes.contains(v);
     }
 
     /**
@@ -284,11 +283,8 @@
             || (rule != null && !rule.equals(other.rule))) {
             return false;
         }
-        if ((sources == null && other.sources != null)
-            || (sources != null && !sources.equals(other.sources))) {
-            return false;
-        }
-        return true;
+        return (sources != null || other.sources == null)
+                && (sources == null || sources.equals(other.sources));
     }
 
     /**
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Fact.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Fact.java
index e168f5a..ad0ba14 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Fact.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Fact.java
@@ -24,25 +24,24 @@
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 
+import org.apache.hadoop.io.WritableComparable;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
-
-import org.apache.hadoop.io.WritableComparable;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 
 /**
  * Represents a fact used and/or generated by the reasoner.
  */
 public class Fact implements WritableComparable<Fact>, Cloneable {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     Statement triple;
 
     // If this is a derived fact:
@@ -71,17 +70,17 @@
     /**
      * A fact containing a triple and no generating rule.
      */
-    public Fact(Resource s, URI p, Value o) {
-        this.triple = new StatementImpl(s, p, o);
+    public Fact(Resource s, IRI p, Value o) {
+        this.triple = VF.createStatement(s, p, o);
     }
 
     /**
      * A fact which contains a triple and was generated using a
      * particular rule by a reasoner for a particular node.
      */
-    public Fact(Resource s, URI p, Value o, int iteration,
+    public Fact(Resource s, IRI p, Value o, int iteration,
             OwlRule rule, Resource node) {
-        this.triple = new StatementImpl(s, p, o);
+        this.triple = VF.createStatement(s, p, o);
         this.derivation = new Derivation(iteration, rule, node);
     }
 
@@ -98,7 +97,7 @@
         }
     }
 
-    public URI getPredicate() {
+    public IRI getPredicate() {
         if (triple == null) {
             return null;
         }
@@ -211,7 +210,7 @@
         }
         else {
             Resource s = getSubject();
-            URI p = getPredicate();
+            IRI p = getPredicate();
             Value o = getObject();
             sb.append("<").append(s.toString()).append(">").append(sep);
             sb.append("<").append(p.toString()).append(">").append(sep);
@@ -293,17 +292,17 @@
             in.readFully(tripleBytes);
             String tripleString = new String(tripleBytes, StandardCharsets.UTF_8);
             String[] parts = tripleString.split(SEP);
-            ValueFactory factory = ValueFactoryImpl.getInstance();
+            ValueFactory factory = SimpleValueFactory.getInstance();
             String context = parts[0];
             Resource s = null;
-            URI p = factory.createURI(parts[2]);
+            IRI p = factory.createIRI(parts[2]);
             Value o = null;
             // Subject: either bnode or URI
             if (parts[1].startsWith("_")) {
                 s = factory.createBNode(parts[1].substring(2));
             }
             else {
-                s = factory.createURI(parts[1]);
+                s = factory.createIRI(parts[1]);
             }
             // Object: literal, bnode, or URI
             if (parts[3].startsWith("_")) {
@@ -325,20 +324,20 @@
                         o = factory.createLiteral(label, lang);
                     }
                     else if (data.startsWith("^^<")) {
-                        o = factory.createLiteral(label, factory.createURI(
+                        o = factory.createLiteral(label, factory.createIRI(
                             data.substring(3, data.length() - 1)));
                     }
                 }
             }
             else {
-                o = factory.createURI(parts[3]);
+                o = factory.createIRI(parts[3]);
             }
             // Create a statement with or without context
             if (context.isEmpty()) {
-                triple = new StatementImpl(s, p, o);
+                triple = VF.createStatement(s, p, o);
             }
             else {
-                triple = new ContextStatementImpl(s, p, o, factory.createURI(context));
+                triple = VF.createStatement(s, p, o, factory.createIRI(context));
             }
         }
         useful = in.readBoolean();
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/LocalReasoner.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/LocalReasoner.java
index 13a21c4..921d0cf 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/LocalReasoner.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/LocalReasoner.java
@@ -25,12 +25,12 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 
 /**
  * Perform reasoning with respect to a particular node, given a global schema.
@@ -112,7 +112,7 @@
         }
         // Otherwise, consider the semantics of the statement:
         Resource subject = fact.getSubject();
-        URI predURI = fact.getPredicate();
+        IRI predURI = fact.getPredicate();
         Value object = fact.getObject();
         boolean relevantToSubject = false;
         boolean relevantToObject = false;
@@ -185,7 +185,7 @@
             return Relevance.NONE;
         }
         // Otherwise, consider the semantics of the statement:
-        URI predURI = fact.getPredicate();
+        IRI predURI = fact.getPredicate();
         Value object = fact.getObject();
         boolean relevantToSubject = false;
         boolean relevantToObject = false;
@@ -289,9 +289,9 @@
     TypeReasoner types;
 
     // Keep track of statements whose properties might make them relevant later
-    Map<URI, List<Fact>> transitiveIncoming = new HashMap<>();
-    Map<URI, List<Fact>> asymmetricIncoming = new HashMap<>();
-    Map<URI, List<Fact>> disjointOutgoing = new HashMap<>();
+    Map<IRI, List<Fact>> transitiveIncoming = new HashMap<>();
+    Map<IRI, List<Fact>> asymmetricIncoming = new HashMap<>();
+    Map<IRI, List<Fact>> disjointOutgoing = new HashMap<>();
 
     // Only combine transitive paths of a certain size, based on the current
     // iteration, to avoid duplicate derivations and unnecessary memory use.
@@ -326,7 +326,7 @@
      */
     public void processFact(Fact fact) {
         Resource subject = fact.getSubject();
-        URI pred = fact.getPredicate();
+        IRI pred = fact.getPredicate();
         Value object = fact.getObject();
         // Whether this is a recursive call on a fact that's just been inferred
         boolean recursive = fact.getIteration() == currentIteration;
@@ -360,11 +360,11 @@
      * Process a triple in which this node is the subject.
      */
     private void processOutgoing(Fact fact) {
-        URI predURI = fact.getPredicate();
+        IRI predURI = fact.getPredicate();
         Value object = fact.getObject();
         OwlProperty prop = schema.getProperty(predURI);
         Set<Resource> restrictions = prop.getRestrictions();
-        Set<URI> disjointProps = prop.getDisjointProperties();
+        Set<IRI> disjointProps = prop.getDisjointProperties();
         // RL rule prp-dom: Apply domain(s), if appropriate
         for (Resource type : prop.getDomain()) {
             types.processType(type, OwlRule.PRP_DOM, fact);
@@ -374,7 +374,7 @@
         // if the input fact was derived using this rule, we must have  gotten
         // all the superproperties and don't need to apply them again.
         if (!fact.hasRule(OwlRule.PRP_SPO1)) {
-            for (URI superProp : prop.getSuperProperties()) {
+            for (IRI superProp : prop.getSuperProperties()) {
                 // (everything is its own superproperty)
                 if (superProp.equals(predURI)) {
                     continue;
@@ -384,7 +384,7 @@
         }
         // RL rule prp-pdw: Check if this conflicts with any disjoint properties
         if (!disjointProps.isEmpty()) {
-            for (URI disjointProp : disjointProps) {
+            for (IRI disjointProp : disjointProps) {
                 if (disjointOutgoing.containsKey(disjointProp)) {
                     for (Fact other : disjointOutgoing.get(disjointProp)) {
                         if (object.equals(other.getObject())) {
@@ -474,14 +474,14 @@
      */
     private void processIncoming(Fact fact) {
         Resource subject = fact.getSubject();
-        URI predURI = fact.getPredicate();
+        IRI predURI = fact.getPredicate();
         OwlProperty prop = schema.getProperty(predURI);
         // RL rule prp-rng: Apply range(s), if appropriate
         for (Resource type : prop.getRange()) {
             types.processType(type, OwlRule.PRP_RNG, fact);
         }
         // RL rules prp-inv1, prp-inv2: assert any inverse properties
-        for (URI inverseProp : prop.getInverseProperties()) {
+        for (IRI inverseProp : prop.getInverseProperties()) {
             collect(triple(node, inverseProp, subject, OwlRule.PRP_INV, fact));
         }
         // RL rule prp-symp: Assert the symmetric statement if appropriate
@@ -583,10 +583,10 @@
         int sumOutgoingDisjoint = 0;
         int sumIncomingTransitive = 0;
         for (List<Fact> l : asymmetricIncoming.values()) {
-            sumIncomingAsymmetric += l.size();;
+            sumIncomingAsymmetric += l.size();
         }
         for (List<Fact> l : disjointOutgoing.values()) {
-            sumOutgoingDisjoint += l.size();;
+            sumOutgoingDisjoint += l.size();
         }
         int maxTransitiveSpan = (int) Math.pow(2, currentIteration);
         int[] distribution = new int[maxTransitiveSpan+1];
@@ -632,10 +632,10 @@
     public int getNumStored() {
         int total = 0;
         for (List<Fact> l : asymmetricIncoming.values()) {
-            total += l.size();;
+            total += l.size();
         }
         for (List<Fact> l : disjointOutgoing.values()) {
-            total += l.size();;
+            total += l.size();
         }
         for (List<Fact> l : transitiveIncoming.values()) {
             total += l.size();
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OWL2.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OWL2.java
index a24e8e8..eeab8b0 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OWL2.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OWL2.java
@@ -19,20 +19,20 @@
  * under the License.
  */
 
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
 
 /**
- * Some useful OWL 2 URIs not in Sesame API.
+ * Some useful OWL 2 URIs not in RDF4J API.
  */
 public class OWL2 {
-    private static URI uri(String local) {
-        return ValueFactoryImpl.getInstance().createURI(OWL.NAMESPACE, local);
+    private static IRI uri(String local) {
+        return SimpleValueFactory.getInstance().createIRI(OWL.NAMESPACE, local);
     }
-    public static final URI ASYMMETRICPROPERTY = uri("AsymmetricProperty");
-    public static final URI IRREFLEXIVEPROPERTY = uri("IrreflexiveProperty");
-    public static final URI PROPERTYDISJOINTWITH = uri("propertyDisjointWith");
-    public static final URI ONCLASS = uri("onClass");
-    public static final URI MAXQUALIFIEDCARDINALITY = uri("maxQualifiedCardinality");
+    public static final IRI ASYMMETRICPROPERTY = uri("AsymmetricProperty");
+    public static final IRI IRREFLEXIVEPROPERTY = uri("IrreflexiveProperty");
+    public static final IRI PROPERTYDISJOINTWITH = uri("propertyDisjointWith");
+    public static final IRI ONCLASS = uri("onClass");
+    public static final IRI MAXQUALIFIEDCARDINALITY = uri("maxQualifiedCardinality");
 }
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlClass.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlClass.java
index 6da82ac..c3c60a8 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlClass.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlClass.java
@@ -23,10 +23,10 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
 
 /**
  * Contains all the schema information we might need about a class.
@@ -318,8 +318,8 @@
     /**
      * Get the onProperty relation(s) for this property restriction.
      */
-    public Set<URI> getOnProperty() {
-        Set<URI> onp = new HashSet<>();
+    public Set<IRI> getOnProperty() {
+        Set<IRI> onp = new HashSet<>();
         for (OwlProperty prop : properties) {
             onp.add(prop.getURI());
         }
@@ -411,9 +411,9 @@
      * is a subproperty of the other's.
      */
     boolean onSubProperty(OwlClass other) {
-        Set<URI> otherProp = other.getOnProperty();
+        Set<IRI> otherProp = other.getOnProperty();
         for (OwlProperty prop : this.properties) {
-            Set<URI> intersection = prop.getSuperProperties();
+            Set<IRI> intersection = prop.getSuperProperties();
             intersection.retainAll(otherProp);
             if (!intersection.isEmpty()) {
                 return true;
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlProperty.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlProperty.java
index 5443d7d..e745532 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlProperty.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/OwlProperty.java
@@ -23,8 +23,8 @@
 import java.util.HashSet;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
 
 /**
  * Contains all the schema information we might need about a property.
@@ -65,7 +65,7 @@
 public class OwlProperty implements Serializable {
     private static final long serialVersionUID = 1L;
 
-    private URI uri;
+    private IRI uri;
 
     // Boolean qualities the property might have
     private boolean transitive = false;
@@ -87,7 +87,7 @@
     // Restrictions on this property
     private Set<OwlClass> restrictions = new HashSet<OwlClass>();
 
-    OwlProperty(URI uri) {
+    OwlProperty(IRI uri) {
         this.uri = uri;
     }
 
@@ -115,7 +115,7 @@
     }
     boolean addRestriction(OwlClass r) { return restrictions.add(r); }
 
-    public void setURI(URI uri) { this.uri = uri; }
+    public void setURI(IRI uri) { this.uri = uri; }
     void setTransitive() { transitive = true; }
     void setSymmetric() { symmetric = true; }
     void setAsymmetric() { asymmetric = true; }
@@ -123,7 +123,7 @@
     void setInverseFunctional() { inverseFunctional = true; }
     void setIrreflexive() { irreflexive = true; }
 
-    public URI getURI() { return uri; }
+    public IRI getURI() { return uri; }
     public boolean isTransitive() { return transitive; }
     public boolean isSymmetric() { return symmetric; }
     public boolean isAsymmetric() { return asymmetric; }
@@ -185,8 +185,8 @@
     /**
      * Get all the superproperties of this subproperty.
      */
-    public Set<URI> getSuperProperties() {
-        Set<URI> ancestors = new HashSet<>();
+    public Set<IRI> getSuperProperties() {
+        Set<IRI> ancestors = new HashSet<>();
         for (OwlProperty ancestor : superProperties) {
             ancestors.add(ancestor.uri);
         }
@@ -199,8 +199,8 @@
      * Get all the equivalent properties for this property.
      * Apply RL rules scm-op and scm-dp: Every property is its own equivalent.
      */
-    public Set<URI> getEquivalentProperties() {
-        Set<URI> equivalents = new HashSet<>();
+    public Set<IRI> getEquivalentProperties() {
+        Set<IRI> equivalents = new HashSet<>();
         for (OwlProperty other : superProperties) {
             if (other.superProperties.contains(this)) {
                 equivalents.add(other.uri);
@@ -214,8 +214,8 @@
     /**
      * Get all properties declared disjoint with this one.
      */
-    public Set<URI> getDisjointProperties() {
-        Set<URI> disjoint = new HashSet<>();
+    public Set<IRI> getDisjointProperties() {
+        Set<IRI> disjoint = new HashSet<>();
         for (OwlProperty other : disjointProperties) {
             disjoint.add(other.uri);
         }
@@ -225,8 +225,8 @@
     /**
      * Get all properties declared inverse of this one.
      */
-    public Set<URI> getInverseProperties() {
-        Set<URI> inverse = new HashSet<>();
+    public Set<IRI> getInverseProperties() {
+        Set<IRI> inverse = new HashSet<>();
         for (OwlProperty other : inverseProperties) {
             inverse.add(other.uri);
         }
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Schema.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Schema.java
index d1a7236..fabc074 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Schema.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/Schema.java
@@ -19,18 +19,18 @@
  * under the License.
  */
 
-import java.util.HashSet;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 
 /**
  * Hold on to facts about the schema (TBox/RBox) and perform what reasoning we
@@ -56,8 +56,8 @@
 public class Schema {
     // Statements using these predicates are automatically relevant schema
     // information.
-    private static final Set<URI> schemaPredicates = new HashSet<>();
-    private static final URI[] schemaPredicateURIs = {
+    private static final Set<IRI> schemaPredicates = new HashSet<>();
+    private static final IRI[] schemaPredicateURIs = {
         RDFS.SUBCLASSOF,
         RDFS.SUBPROPERTYOF,
         RDFS.DOMAIN,
@@ -89,7 +89,7 @@
     };
 
     static {
-        for (URI uri : schemaPredicateURIs) {
+        for (IRI uri : schemaPredicateURIs) {
             schemaPredicates.add(uri);
         }
         for (Resource uri : schemaTypeURIs) {
@@ -102,7 +102,7 @@
      * information?
      */
     public static boolean isSchemaTriple(Statement triple) {
-        URI pred = triple.getPredicate();
+        IRI pred = triple.getPredicate();
         // Triples with certain predicates are schema triples,
         if (schemaPredicates.contains(pred)) {
             return true;
@@ -119,7 +119,7 @@
     /**
      * Map URIs to schema information about a property
      */
-    protected Map<URI, OwlProperty> properties = new HashMap<>();
+    protected Map<IRI, OwlProperty> properties = new HashMap<>();
 
     /**
      * Map Resources to schema information about a class/restriction
@@ -149,7 +149,7 @@
      * Get schema information for a property, for reading and writing.
      * Instantiates OwlProperty if it doesn't yet exist.
      */
-    public OwlProperty getProperty(URI p) {
+    public OwlProperty getProperty(IRI p) {
         if (!properties.containsKey(p)) {
             properties.put(p, new OwlProperty(p));
         }
@@ -161,13 +161,13 @@
      * Assumes this Value refers to a property URI.
      */
     public OwlProperty getProperty(Value p) {
-        return getProperty((URI) p);
+        return getProperty((IRI) p);
     }
 
     /**
      * Return whether this resource corresponds to a property.
      */
-    public boolean hasProperty(URI r) {
+    public boolean hasProperty(IRI r) {
         return properties.containsKey(r);
     }
 
@@ -193,14 +193,14 @@
      */
     public void processTriple(Statement triple) {
         Resource s = triple.getSubject();
-        URI p = triple.getPredicate();
+        IRI p = triple.getPredicate();
         Value o = triple.getObject();
         if (isSchemaTriple(triple)) {
             // For a type statement to be schema information, it must yield
             // some boolean information about a property.
             if (p.equals(RDF.TYPE)) {
                 if (schemaTypes.contains(o)) {
-                    addPropertyType((URI) s, (Resource) o);
+                    addPropertyType((IRI) s, (Resource) o);
                 }
             }
 
@@ -288,7 +288,7 @@
     /**
      * Add a particular characteristic to a property.
      */
-    private void addPropertyType(URI p, Resource t) {
+    private void addPropertyType(IRI p, Resource t) {
         OwlProperty prop = getProperty(p);
         if (t.equals(OWL.TRANSITIVEPROPERTY)) {
             prop.setTransitive();
@@ -367,7 +367,7 @@
         // schema-relevant triple at all.
         if (isSchemaTriple(triple)) {
             Resource s = triple.getSubject();
-            URI p = triple.getPredicate();
+            IRI p = triple.getPredicate();
             Value o = triple.getObject();
             // If this is telling us something about a property:
             if (properties.containsKey(s)) {
@@ -509,7 +509,7 @@
         if (classes.containsKey(type)) {
             OwlClass pr = classes.get(type);
             sb.append("owl:Restriction");
-            for (URI p : pr.getOnProperty()) {
+            for (IRI p : pr.getOnProperty()) {
                 sb.append(" (owl:onProperty ").append(p.toString()).append(")");
             }
             for (Value v : pr.hasValue()) {
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/TypeReasoner.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/TypeReasoner.java
index 35009ab..8ccc774 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/TypeReasoner.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/TypeReasoner.java
@@ -19,18 +19,17 @@
  * under the License.
  */
 
+import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 
 /**
  * Keep track of a single node's types and do reasoning about its types.
@@ -125,7 +124,7 @@
             }
         }
         // Apply property restriction rules:
-        for (URI prop : c.getOnProperty()) {
+        for (IRI prop : c.getOnProperty()) {
             // RL rule cls-hv1: if type is an owl:hasValue restriction
             for (Value val : c.hasValue()) {
                 collect(triple(node, prop, val, OwlRule.CLS_HV1, typeFact));
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/AbstractReasoningTool.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/AbstractReasoningTool.java
index abb300d..c81c6fe 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/AbstractReasoningTool.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/AbstractReasoningTool.java
@@ -21,13 +21,6 @@
 
 import java.io.IOException;
 
-import org.apache.rya.accumulo.mr.RyaStatementWritable;
-import org.apache.rya.accumulo.mr.RdfFileInputFormat;
-import org.apache.rya.accumulo.mr.MRUtils;
-import org.apache.rya.reasoning.Derivation;
-import org.apache.rya.reasoning.Fact;
-import org.apache.rya.reasoning.Schema;
-
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat;
 import org.apache.accumulo.core.data.Key;
@@ -53,7 +46,13 @@
 import org.apache.hadoop.mapreduce.lib.output.SequenceFileOutputFormat;
 import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
 import org.apache.hadoop.util.Tool;
-import org.openrdf.rio.RDFFormat;
+import org.apache.rya.accumulo.mr.MRUtils;
+import org.apache.rya.accumulo.mr.RdfFileInputFormat;
+import org.apache.rya.accumulo.mr.RyaStatementWritable;
+import org.apache.rya.reasoning.Derivation;
+import org.apache.rya.reasoning.Fact;
+import org.apache.rya.reasoning.Schema;
+import org.eclipse.rdf4j.rio.RDFFormat;
 
 /**
  * Contains common functionality for MapReduce jobs involved in reasoning. A
@@ -62,7 +61,7 @@
  */
 abstract public class AbstractReasoningTool extends Configured implements Tool {
     // Keep track of statistics about the input
-    protected static enum COUNTERS { ABOX, TBOX, USEFUL };
+    protected enum COUNTERS { ABOX, TBOX, USEFUL }
 
     // MapReduce job, to be configured by subclasses
     protected Job job;
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ConformanceTest.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ConformanceTest.java
index 420683f..34c8c44 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ConformanceTest.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ConformanceTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya.reasoning.mr;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.reasoning.mr;
 
 import java.io.BufferedReader;
 import java.io.File;
@@ -44,27 +43,28 @@
 import org.apache.hadoop.util.ToolRunner;
 import org.apache.rya.accumulo.mr.MRUtils;
 import org.apache.rya.api.path.PathUtils;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
 import org.apache.rya.reasoning.Fact;
 import org.apache.rya.reasoning.Schema;
-import org.openrdf.OpenRDFException;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.helpers.RDFHandlerBase;
-import org.openrdf.rio.ntriples.NTriplesParser;
-import org.openrdf.rio.rdfxml.RDFXMLParser;
-import org.openrdf.sail.memory.MemoryStore;
+import org.eclipse.rdf4j.RDF4JException;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
+import org.eclipse.rdf4j.rio.ntriples.NTriplesParser;
+import org.eclipse.rdf4j.rio.rdfxml.RDFXMLParser;
+import org.eclipse.rdf4j.sail.memory.MemoryStore;
 
 /**
  * Test the reasoner against Owl conformance tests in the database.
@@ -86,7 +86,7 @@
     static String TEST_SEMANTICS = TEST + "semantics";
     static String TEST_RDFBASED = TEST + "RDF-BASED";
 
-    private static class OwlTest extends RDFHandlerBase {
+    private static class OwlTest extends AbstractRDFHandler {
         Value uri;
         String name;
         String description;
@@ -125,7 +125,7 @@
         }
     }
 
-    private static class OutputCollector extends RDFHandlerBase {
+    private static class OutputCollector extends AbstractRDFHandler {
         Set<Statement> triples = new HashSet<>();
         @Override
         public void handleStatement(final Statement st) {
@@ -170,7 +170,7 @@
             RDFFormat inputFormat= RDFFormat.RDFXML;
             final String formatString = conf.get(MRUtils.FORMAT_PROP);
             if (formatString != null) {
-                inputFormat = RDFFormat.valueOf(formatString);
+                inputFormat = RdfFormatUtils.getRdfFormatFromName(formatString);
             }
             repo = new SailRepository(new MemoryStore());
             repo.initialize();
@@ -250,7 +250,7 @@
     /**
      * Verify that we can infer the correct triples or detect an inconsistency.
      * @param   conf    Specifies working directory, etc.
-     * @param   OwlTest   Contains premise/conclusion graphs, will store result
+     * @param   test   Contains premise/conclusion graphs, will store result
      * @return  Return value of the MapReduce job
      */
     int runTest(final Configuration conf, final String[] args, final OwlTest test)
@@ -341,7 +341,7 @@
      * test type.
      */
     Set<Value> getTestURIs(final RepositoryConnection conn, final String testType)
-            throws IOException, OpenRDFException {
+            throws IOException, RDF4JException {
         final Set<Value> testURIs = new HashSet<>();
         final TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL,
             "select ?test where { " +
@@ -362,7 +362,7 @@
      * Query a connection for conformance test details.
      */
     Collection<OwlTest> getTests(final RepositoryConnection conn, final Set<Value> testURIs)
-            throws IOException, OpenRDFException {
+            throws IOException, RDF4JException {
         final Map<Value, OwlTest> tests = new HashMap<>();
         final TupleQuery query = conn.prepareTupleQuery(QueryLanguage.SPARQL,
             "select * where { " +
@@ -419,7 +419,7 @@
      */
     boolean triviallyTrue(final Statement triple, final Schema schema) {
         final Resource s = triple.getSubject();
-        final URI p = triple.getPredicate();
+        final IRI p = triple.getPredicate();
         final Value o = triple.getObject();
         if (p.equals(RDF.TYPE)) {
             if (o.equals(OWL.ONTOLOGY)) {
@@ -430,9 +430,9 @@
             }
             else if ((o.equals(OWL.OBJECTPROPERTY)
                 || o.equals(OWL.DATATYPEPROPERTY))
-                && s instanceof URI) {
+                && s instanceof IRI) {
                 // Distinction not maintained, irrelevant to RL rules
-                return schema.hasProperty((URI) s);
+                return schema.hasProperty((IRI) s);
             }
         }
         return false;
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ForwardChain.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ForwardChain.java
index 7c58638..9e1be47 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ForwardChain.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ForwardChain.java
@@ -21,13 +21,6 @@
 
 import java.io.IOException;
 
-import org.apache.rya.accumulo.mr.RyaStatementWritable;
-import org.apache.rya.reasoning.Derivation;
-import org.apache.rya.reasoning.LocalReasoner;
-import org.apache.rya.reasoning.LocalReasoner.Relevance;
-import org.apache.rya.reasoning.Fact;
-import org.apache.rya.reasoning.Schema;
-
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.hadoop.conf.Configuration;
@@ -39,7 +32,13 @@
 import org.apache.hadoop.mapreduce.lib.output.MultipleOutputs;
 import org.apache.hadoop.util.ToolRunner;
 import org.apache.log4j.Logger;
-import org.openrdf.model.Resource;
+import org.apache.rya.accumulo.mr.RyaStatementWritable;
+import org.apache.rya.reasoning.Derivation;
+import org.apache.rya.reasoning.Fact;
+import org.apache.rya.reasoning.LocalReasoner;
+import org.apache.rya.reasoning.LocalReasoner.Relevance;
+import org.apache.rya.reasoning.Schema;
+import org.eclipse.rdf4j.model.Resource;
 
 public class ForwardChain extends AbstractReasoningTool {
     @Override
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ResourceWritable.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ResourceWritable.java
index 158fe32..06f0d20 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ResourceWritable.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/ResourceWritable.java
@@ -25,8 +25,8 @@
 
 import org.apache.hadoop.io.WritableComparable;
 import org.apache.hadoop.io.WritableComparator;
-import org.openrdf.model.Resource;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 /**
  * Allows us to use a URI or bnode for a key.
@@ -68,10 +68,10 @@
         String s = in.readUTF();
         if (s.length() > 0) {
             if (s.startsWith("_")) {
-                val = ValueFactoryImpl.getInstance().createBNode(s.substring(2));
+                val = SimpleValueFactory.getInstance().createBNode(s.substring(2));
             }
             else {
-                val = ValueFactoryImpl.getInstance().createURI(s);
+                val = SimpleValueFactory.getInstance().createIRI(s);
             }
         }
         key = in.readInt();
diff --git a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/SchemaWritable.java b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/SchemaWritable.java
index 97e3c78..87b6e4f 100644
--- a/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/SchemaWritable.java
+++ b/extras/rya.reasoning/src/main/java/org/apache/rya/reasoning/mr/SchemaWritable.java
@@ -68,8 +68,8 @@
                             org.apache.rya.reasoning.OwlProperty.class, //
                             java.util.HashSet.class, //
                             org.apache.rya.reasoning.OwlClass.class, //
-                            org.openrdf.model.impl.URIImpl.class, //
-                            org.openrdf.model.impl.BNodeImpl.class); 
+                            org.eclipse.rdf4j.model.impl.SimpleIRI.class, //
+                            org.eclipse.rdf4j.model.impl.SimpleBNode.class); 
         try {
                 Iterable<?> propList = (Iterable<?>) vois.readObject();
                 Iterable<?> classList = (Iterable<?>) vois.readObject();
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/LocalReasonerTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/LocalReasonerTest.java
index 8ed850a..9f81cb4 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/LocalReasonerTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/LocalReasonerTest.java
@@ -19,17 +19,16 @@
  * under the License.
  */
 
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SKOS;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.SKOS;
-
 public class LocalReasonerTest {
     private LocalReasoner reasoner;
     private Schema schema;
@@ -479,8 +478,8 @@
      */
     @Test
     public void testMaxCardinalityZero() throws Exception {
-        URI r = TestUtils.uri("restriction");
-        URI p = TestUtils.uri("impossiblePredicate1");
+        IRI r = TestUtils.uri("restriction");
+        IRI p = TestUtils.uri("impossiblePredicate1");
         schema.processTriple(TestUtils.statement(r, OWL.MAXCARDINALITY,
             TestUtils.intLiteral("0")));
         schema.processTriple(TestUtils.statement(r, OWL.ONPROPERTY, p));
@@ -497,7 +496,7 @@
     @Test
     public void testMaxQCardinalityZeroThings() throws Exception {
         Resource r = TestUtils.bnode("restriction");
-        URI p = TestUtils.uri("impossiblePredicate2");
+        IRI p = TestUtils.uri("impossiblePredicate2");
         schema.processTriple(TestUtils.statement(r, OWL2.MAXQUALIFIEDCARDINALITY,
             TestUtils.intLiteral("0")));
         schema.processTriple(TestUtils.statement(r, OWL.ONPROPERTY, p));
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/ReasonerFactTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/ReasonerFactTest.java
index 8b105c5..3c4636b 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/ReasonerFactTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/ReasonerFactTest.java
@@ -25,20 +25,19 @@
 import java.io.DataOutputStream;
 import java.util.ArrayList;
 
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDFS;
-
 public class ReasonerFactTest {
     static final String wordnet = "http://www.w3.org/2006/03/wn/wn20/instances/";
     static final String wnSchema = "http://www.w3.org/2006/03/wn/wn20/schema/";
-    static final URI[] nodes = {
+    static final IRI[] nodes = {
         TestUtils.uri(wordnet, "synset-entity-noun-1"),
         TestUtils.uri(wordnet, "synset-physical_entity-noun-1"),
         TestUtils.uri(wordnet, "synset-object-noun-1"),
@@ -49,7 +48,7 @@
         TestUtils.uri(wordnet, "synset-engineer-noun-1"),
         TestUtils.uri(wordnet, "synset-programmer-noun-1")
     };
-    static final URI hyper = TestUtils.uri(wnSchema, "hypernymOf");
+    static final IRI hyper = TestUtils.uri(wnSchema, "hypernymOf");
     static final Schema schema = new Schema();
     static final ArrayList<ArrayList<Fact>> hierarchy = new ArrayList<>();
     static final int MAX_LEVEL = 3;
@@ -140,7 +139,7 @@
     public void testTripleInequality() {
         Fact a = hierarchy.get(2).get(0);
         Fact b = a.clone();
-        Statement stmt = new StatementImpl(TestUtils.uri(a.getSubject().stringValue()),
+        Statement stmt = SimpleValueFactory.getInstance().createStatement(TestUtils.uri(a.getSubject().stringValue()),
             a.getPredicate(), a.getObject()); // subject will have extra prefix
         b.setTriple(stmt);
         Assert.assertFalse("Triple equality should be based on (s, p, o)", a.equals(b));
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaReasoningTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaReasoningTest.java
index b936f5d..97b2343 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaReasoningTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaReasoningTest.java
@@ -19,15 +19,14 @@
  * under the License.
  */
 
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.openrdf.model.Resource;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDFS;
-
 /**
  * Test the application of the OWL RL/RDF schema ("scm-") rules.
  */
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaTest.java
index 95500a3..00162a7 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/SchemaTest.java
@@ -1,15 +1,3 @@
-package org.apache.rya.reasoning;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutput;
-import java.io.DataOutputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-
-import org.apache.rya.reasoning.mr.SchemaWritable;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -28,20 +16,31 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.reasoning;
 
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.DataOutput;
+import java.io.DataOutputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+
+import org.apache.rya.reasoning.mr.SchemaWritable;
+
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SKOS;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SKOS;
 
 public class SchemaTest implements Serializable {
     private static final long serialVersionUID = -3616030386119902719L;
 
-    URI lubm(String s) {
+    IRI lubm(String s) {
         return TestUtils.uri("http://swat.cse.lehigh.edu/onto/univ-bench.owl", s);
     }
 
@@ -320,8 +319,8 @@
     @Test
     public void testInputMaxCardinality() throws Exception {
         Schema schema = new Schema();
-        URI s = TestUtils.uri("x");
-        URI p = OWL.MAXCARDINALITY;
+        IRI s = TestUtils.uri("x");
+        IRI p = OWL.MAXCARDINALITY;
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("7")));
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("4")));
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("-1")));
@@ -334,8 +333,8 @@
     @Test
     public void testInputMaxQualifiedCardinality() throws Exception {
         Schema schema = new Schema();
-        URI s = TestUtils.uri("x");
-        URI p = OWL2.MAXQUALIFIEDCARDINALITY;
+        IRI s = TestUtils.uri("x");
+        IRI p = OWL2.MAXQUALIFIEDCARDINALITY;
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("-20")));
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("100")));
         schema.processTriple(TestUtils.statement(s, p, TestUtils.stringLiteral("0")));
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/TestUtils.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/TestUtils.java
index 86fe9a7..bec124b 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/TestUtils.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/TestUtils.java
@@ -21,38 +21,37 @@
 
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaURI;
-
-import org.openrdf.model.BNode;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 public class TestUtils {
-    private static final ValueFactory VALUE_FACTORY = new ValueFactoryImpl();
+    private static final ValueFactory VALUE_FACTORY = SimpleValueFactory.getInstance();
     public static final String TEST_PREFIX = "http://test.test";
-    public static final URI NODE = uri("http://thisnode.test", "x");
+    public static final IRI NODE = uri("http://thisnode.test", "x");
 
-    public static URI uri(String prefix, String u) {
+    public static IRI uri(String prefix, String u) {
         if (prefix.length() > 0) {
             u = prefix + "#" + u;
         }
-        return VALUE_FACTORY.createURI(u);
+        return VALUE_FACTORY.createIRI(u);
     }
 
-    public static URI uri(String u) {
+    public static IRI uri(String u) {
         return uri(TEST_PREFIX, u);
     }
 
-    public static Fact fact(Resource s, URI p, Value o) {
+    public static Fact fact(Resource s, IRI p, Value o) {
         return new Fact(s, p, o);
     }
 
-    public static Statement statement(Resource s, URI p, Value o) {
+    public static Statement statement(Resource s, IRI p, Value o) {
         return VALUE_FACTORY.createStatement(s, p, o);
     }
 
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/DuplicateEliminationTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/DuplicateEliminationTest.java
index 11c1d6c..30ced20 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/DuplicateEliminationTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/DuplicateEliminationTest.java
@@ -23,6 +23,12 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Value;
+import org.apache.hadoop.io.LongWritable;
+import org.apache.hadoop.io.NullWritable;
+import org.apache.hadoop.mrunit.mapreduce.MapDriver;
+import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
 import org.apache.rya.accumulo.mr.RyaStatementWritable;
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
 import org.apache.rya.api.domain.RyaStatement;
@@ -30,22 +36,15 @@
 import org.apache.rya.api.resolver.triple.TripleRowResolver;
 import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
 import org.apache.rya.reasoning.Derivation;
-import org.apache.rya.reasoning.OwlRule;
 import org.apache.rya.reasoning.Fact;
+import org.apache.rya.reasoning.OwlRule;
 import org.apache.rya.reasoning.TestUtils;
-
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Value;
-import org.apache.hadoop.io.LongWritable;
-import org.apache.hadoop.io.NullWritable;
-import org.apache.hadoop.mrunit.mapreduce.MapDriver;
-import org.apache.hadoop.mrunit.mapreduce.ReduceDriver;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
diff --git a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/ForwardChainTest.java b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/ForwardChainTest.java
index 9bcee1b..759ede9 100644
--- a/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/ForwardChainTest.java
+++ b/extras/rya.reasoning/src/test/java/org/apache/rya/reasoning/mr/ForwardChainTest.java
@@ -24,17 +24,6 @@
 import java.util.List;
 import java.util.Map;
 
-import org.apache.rya.accumulo.mr.RyaStatementWritable;
-import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.resolver.triple.TripleRow;
-import org.apache.rya.api.resolver.triple.TripleRowResolver;
-import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
-import org.apache.rya.reasoning.OwlRule;
-import org.apache.rya.reasoning.Fact;
-import org.apache.rya.reasoning.Schema;
-import org.apache.rya.reasoning.TestUtils;
-
 import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Value;
 import org.apache.hadoop.io.LongWritable;
@@ -44,13 +33,23 @@
 import org.apache.hadoop.mrunit.mapreduce.ReduceFeeder;
 import org.apache.hadoop.mrunit.types.KeyValueReuseList;
 import org.apache.hadoop.mrunit.types.Pair;
+import org.apache.rya.accumulo.mr.RyaStatementWritable;
+import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.resolver.triple.TripleRow;
+import org.apache.rya.api.resolver.triple.TripleRowResolver;
+import org.apache.rya.api.resolver.triple.impl.WholeRowTripleResolver;
+import org.apache.rya.reasoning.Fact;
+import org.apache.rya.reasoning.OwlRule;
+import org.apache.rya.reasoning.Schema;
+import org.apache.rya.reasoning.TestUtils;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
@@ -187,7 +186,7 @@
     public void testTransitiveChain() throws Exception {
         int max = 8;
         int n = 4;
-        URI prop = TestUtils.uri("subOrganizationOf");
+        IRI prop = TestUtils.uri("subOrganizationOf");
         Map<Integer, Map<Integer, Pair<Fact, NullWritable>>> connections
             = new HashMap<>();
         for (int i = 0; i <= max; i++) {
@@ -195,8 +194,8 @@
         }
         // Initial input: make a chain from org0 to org8
         for (int i = 0; i < max; i++) {
-            URI orgI = TestUtils.uri("org" + i);
-            URI orgJ = TestUtils.uri("org" + (i + 1));
+            IRI orgI = TestUtils.uri("org" + i);
+            IRI orgJ = TestUtils.uri("org" + (i + 1));
             Fact triple = new Fact(orgI, prop, orgJ);
             connections.get(i).put(i+1, new Pair<>(triple, NullWritable.get()));
         }
@@ -232,8 +231,8 @@
                 // This includes any path of length k for appropriate k:
                 for (int k = minSpan; k <= maxSpan && j+k <= max; k++) {
                     int middle = j + minSpan - 1;
-                    URI left = TestUtils.uri("org" + j);
-                    URI right = TestUtils.uri("org" + (j + k));
+                    IRI left = TestUtils.uri("org" + j);
+                    IRI right = TestUtils.uri("org" + (j + k));
                     Fact triple = new Fact(left, prop,
                         right, i, OwlRule.PRP_TRP, TestUtils.uri("org" + middle));
                     triple.addSource(connections.get(j).get(middle).getFirst());
diff --git a/extras/rya.streams/api/pom.xml b/extras/rya.streams/api/pom.xml
index 9253d01..22f9b21 100644
--- a/extras/rya.streams/api/pom.xml
+++ b/extras/rya.streams/api/pom.xml
@@ -41,8 +41,8 @@
         </dependency>
         
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryparser-sparql</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryparser-sparql</artifactId>
         </dependency>
         
         <dependency>
diff --git a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/interactor/defaults/DefaultAddQuery.java b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/interactor/defaults/DefaultAddQuery.java
index 67edec0..c06a61c 100644
--- a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/interactor/defaults/DefaultAddQuery.java
+++ b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/interactor/defaults/DefaultAddQuery.java
@@ -24,8 +24,8 @@
 import org.apache.rya.streams.api.exception.RyaStreamsException;
 import org.apache.rya.streams.api.interactor.AddQuery;
 import org.apache.rya.streams.api.queries.QueryRepository;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryChangeLog.java b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryChangeLog.java
index f0f628e..1563e2f 100644
--- a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryChangeLog.java
+++ b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryChangeLog.java
@@ -25,11 +25,12 @@
 import java.util.List;
 import java.util.concurrent.locks.ReentrantLock;
 
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+
 import com.google.common.collect.Lists;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * An in memory implementation of {@link QueryChangeLog}. Anything that is stored in this change log will be
diff --git a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryRepository.java b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryRepository.java
index c71f0f8..4544fbb 100644
--- a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryRepository.java
+++ b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/InMemoryQueryRepository.java
@@ -32,6 +32,7 @@
 
 import org.apache.rya.streams.api.entity.StreamsQuery;
 import org.apache.rya.streams.api.queries.QueryChangeLog.QueryChangeLogException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,7 +40,6 @@
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * An in memory implementation of {@link QueryRepository}. It is lazily
@@ -262,7 +262,7 @@
                 listeners.forEach(listener -> listener.notify(entry, newQueryState));
 
                 cachePosition = Optional.of( entry.getPosition() );
-                log.debug("New chache position: " + cachePosition);
+                log.debug("New cache position: " + cachePosition);
             }
 
         } catch (final QueryChangeLogException e) {
diff --git a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/QueryChangeLog.java b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/QueryChangeLog.java
index 5765366..6accdf6 100644
--- a/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/QueryChangeLog.java
+++ b/extras/rya.streams/api/src/main/java/org/apache/rya/streams/api/queries/QueryChangeLog.java
@@ -18,9 +18,10 @@
  */
 package org.apache.rya.streams.api.queries;
 
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * An ordered log of all of the changes that have been applied to the SPARQL Queries that are managed by Rya Streams.
diff --git a/extras/rya.streams/client/pom.xml b/extras/rya.streams/client/pom.xml
index dc5009b..f93f6ac 100644
--- a/extras/rya.streams/client/pom.xml
+++ b/extras/rya.streams/client/pom.xml
@@ -50,28 +50,28 @@
 
         <!-- Statement formats we support for loading. -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-nquads</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-nquads</artifactId>
         </dependency>
        <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-rdfxml</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-rdfxml</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-turtle</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-turtle</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryresultio-sparqljson</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryresultio-sparqljson</artifactId>
         </dependency>
             
         <!-- Third Party dependencies -->
diff --git a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/AddQueryCommand.java b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/AddQueryCommand.java
index 3886a95..f80b85a 100644
--- a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/AddQueryCommand.java
+++ b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/AddQueryCommand.java
@@ -33,7 +33,7 @@
 import org.apache.rya.streams.client.RyaStreamsCommand;
 import org.apache.rya.streams.kafka.KafkaTopics;
 import org.apache.rya.streams.kafka.queries.KafkaQueryChangeLogFactory;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.Parameter;
diff --git a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/StreamResultsCommand.java b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/StreamResultsCommand.java
index 783aedc..dcc2ce8 100644
--- a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/StreamResultsCommand.java
+++ b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/command/StreamResultsCommand.java
@@ -37,10 +37,10 @@
 import org.apache.rya.streams.kafka.queries.KafkaQueryChangeLogFactory;
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementDeserializer;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Reduced;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Reduced;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.beust.jcommander.JCommander;
 import com.beust.jcommander.Parameter;
diff --git a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/util/QueryResultsOutputUtil.java b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/util/QueryResultsOutputUtil.java
index 114a6fe..a05d596 100644
--- a/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/util/QueryResultsOutputUtil.java
+++ b/extras/rya.streams/client/src/main/java/org/apache/rya/streams/client/util/QueryResultsOutputUtil.java
@@ -27,15 +27,15 @@
 import org.apache.rya.api.model.VisibilityStatement;
 import org.apache.rya.streams.api.entity.QueryResultStream;
 import org.apache.rya.streams.api.exception.RyaStreamsException;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.resultio.sparqljson.SPARQLResultsJSONWriter;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFWriter;
-import org.openrdf.rio.Rio;
-import org.openrdf.rio.WriterConfig;
-import org.openrdf.rio.helpers.BasicWriterSettings;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONWriter;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFWriter;
+import org.eclipse.rdf4j.rio.Rio;
+import org.eclipse.rdf4j.rio.WriterConfig;
+import org.eclipse.rdf4j.rio.helpers.BasicWriterSettings;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/LoadStatementsCommandIT.java b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/LoadStatementsCommandIT.java
index 03c31b4..7e79fe4 100644
--- a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/LoadStatementsCommandIT.java
+++ b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/LoadStatementsCommandIT.java
@@ -36,15 +36,16 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementDeserializer;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 /**
  * Integration tests the methods of {@link LoadStatementsCommand}.
  */
 public class LoadStatementsCommandIT {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private static final Path TURTLE_FILE = Paths.get("src/test/resources/statements.ttl");
 
@@ -83,16 +84,15 @@
             }
         }
 
-        final ValueFactory VF = ValueFactoryImpl.getInstance();
         final List<VisibilityStatement> expected = new ArrayList<>();
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#alice"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#bob")),
+                VF.createStatement(VF.createIRI("http://example#alice"), VF.createIRI("http://example#talksTo"), VF.createIRI("http://example#bob")),
                 visibilities));
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#bob"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#charlie")),
+                VF.createStatement(VF.createIRI("http://example#bob"), VF.createIRI("http://example#talksTo"), VF.createIRI("http://example#charlie")),
                 visibilities));
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#charlie"), VF.createURI("http://example#likes"), VF.createURI("http://example#icecream")),
+                VF.createStatement(VF.createIRI("http://example#charlie"), VF.createIRI("http://example#likes"), VF.createIRI("http://example#icecream")),
                 visibilities));
 
         // Show the written statements matches the read ones.
@@ -129,16 +129,15 @@
             }
         }
 
-        final ValueFactory VF = ValueFactoryImpl.getInstance();
         final List<VisibilityStatement> expected = new ArrayList<>();
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#alice"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#bob")),
+                VF.createStatement(VF.createIRI("http://example#alice"), VF.createIRI("http://example#talksTo"), VF.createIRI("http://example#bob")),
                 visibilities));
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#bob"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#charlie")),
+                VF.createStatement(VF.createIRI("http://example#bob"), VF.createIRI("http://example#talksTo"), VF.createIRI("http://example#charlie")),
                 visibilities));
         expected.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#charlie"), VF.createURI("http://example#likes"), VF.createURI("http://example#icecream")),
+                VF.createStatement(VF.createIRI("http://example#charlie"), VF.createIRI("http://example#likes"), VF.createIRI("http://example#icecream")),
                 visibilities));
 
         // Show the written statements matches the read ones.
diff --git a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/RunQueryCommandIT.java b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/RunQueryCommandIT.java
index 6df7a3d..9fbc2c6 100644
--- a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/RunQueryCommandIT.java
+++ b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/command/RunQueryCommandIT.java
@@ -52,13 +52,13 @@
 import org.apache.rya.streams.kafka.serialization.queries.QueryChangeSerializer;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.AbstractScheduledService.Scheduler;
@@ -148,34 +148,34 @@
         };
 
         // Create the statements that will be loaded.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Alice"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:BurgerJoint")), "a"));
+                vf.createIRI("urn:Alice"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:BurgerJoint")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Bob"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Bob"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Charlie"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Charlie"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
 
         // Create the expected results.
         final List<VisibilityBindingSet> expected = new ArrayList<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Charlie"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Charlie"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
 
         // Execute the test. This will result in a set of results that were read from the results topic.
diff --git a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/util/QueryResultsOutputUtilTest.java b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/util/QueryResultsOutputUtilTest.java
index b82e671..be0db23 100644
--- a/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/util/QueryResultsOutputUtilTest.java
+++ b/extras/rya.streams/client/src/test/java/org/apache/rya/streams/client/util/QueryResultsOutputUtilTest.java
@@ -31,13 +31,13 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.model.VisibilityStatement;
 import org.apache.rya.streams.api.entity.QueryResultStream;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.impl.MapBindingSet;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Charsets;
 
@@ -46,7 +46,7 @@
  */
 public class QueryResultsOutputUtilTest {
 
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
     public void toNtriplesFile() throws Exception {
@@ -58,10 +58,10 @@
 
             final List<VisibilityStatement> results = new ArrayList<>();
 
-            Statement stmt = VF.createStatement(VF.createURI("urn:alice"), VF.createURI("urn:age"), VF.createLiteral(23));
+            Statement stmt = VF.createStatement(VF.createIRI("urn:alice"), VF.createIRI("urn:age"), VF.createLiteral(23));
             results.add( new VisibilityStatement(stmt) );
 
-            stmt = VF.createStatement(VF.createURI("urn:bob"), VF.createURI("urn:worksAt"), VF.createLiteral("Taco Shop"));
+            stmt = VF.createStatement(VF.createIRI("urn:bob"), VF.createIRI("urn:worksAt"), VF.createLiteral("Taco Shop"));
             results.add( new VisibilityStatement(stmt) );
             return results;
         });
@@ -103,7 +103,7 @@
             MapBindingSet bs = new MapBindingSet();
             bs.addBinding("name", VF.createLiteral("alice"));
             bs.addBinding("company", VF.createLiteral("Taco Shop"));
-            bs.addBinding("ssn", VF.createURI("urn:111-11-1111"));
+            bs.addBinding("ssn", VF.createIRI("urn:111-11-1111"));
             results.add(new VisibilityBindingSet(bs, ""));
 
 
diff --git a/extras/rya.streams/geo/src/test/java/org/apache/rya/streams/kafka/processors/filter/GeoFilterIT.java b/extras/rya.streams/geo/src/test/java/org/apache/rya/streams/kafka/processors/filter/GeoFilterIT.java
index 17a290a..82aa4b8 100644
--- a/extras/rya.streams/geo/src/test/java/org/apache/rya/streams/kafka/processors/filter/GeoFilterIT.java
+++ b/extras/rya.streams/geo/src/test/java/org/apache/rya/streams/kafka/processors/filter/GeoFilterIT.java
@@ -38,18 +38,17 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.function.Function;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.vividsolutions.jts.geom.Coordinate;
 import com.vividsolutions.jts.geom.Geometry;
@@ -104,7 +103,7 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = getStatements();
 
         // Make the expected results.
@@ -127,11 +126,11 @@
     }
 
     private static Statement statement(final Geometry geo) {
-        final ValueFactory vf = new ValueFactoryImpl();
-        final Resource subject = vf.createURI("urn:event1");
-        final URI predicate = GeoConstants.GEO_AS_WKT;
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        final Resource subject = vf.createIRI("urn:event1");
+        final IRI predicate = GeoConstants.GEO_AS_WKT;
         final WKTWriter w = new WKTWriter();
         final Value object = vf.createLiteral(w.write(geo), GeoConstants.XMLSCHEMA_OGC_WKT);
-        return new StatementImpl(subject, predicate, object);
+        return vf.createStatement(subject, predicate, object);
     }
 }
\ No newline at end of file
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorIT.java
index 2a1e760..ab0c2ab 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorIT.java
@@ -34,12 +34,12 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests {@link AggregationProcessor}.
@@ -59,29 +59,29 @@
                 "} GROUP BY ?person";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasBook"), vf.createLiteral("Book 1")), "a"));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasBook"), vf.createLiteral("Book 1")), "a"));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hasBook"), vf.createLiteral("Book 1")), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hasBook"), vf.createLiteral("Book 1")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasBook"), vf.createLiteral("Book 2")), "b"));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasBook"), vf.createLiteral("Book 2")), "b"));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("bookCount", vf.createLiteral("1", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, "a"));
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
         bs.addBinding("bookCount", vf.createLiteral("1", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("bookCount", vf.createLiteral("2", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, "a&b"));
 
@@ -109,26 +109,26 @@
                 "} GROUP BY ?person";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasFoodType"), vf.createURI("urn:corn")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasFoodType"), vf.createIRI("urn:corn")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasFoodType"), vf.createURI("urn:apple")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasFoodType"), vf.createIRI("urn:apple")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:corn"), vf.createURI("urn:count"), vf.createLiteral(4)), ""));
+                vf.createStatement(vf.createIRI("urn:corn"), vf.createIRI("urn:count"), vf.createLiteral(4)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:apple"), vf.createURI("urn:count"), vf.createLiteral(3)), ""));
+                vf.createStatement(vf.createIRI("urn:apple"), vf.createIRI("urn:count"), vf.createLiteral(3)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("totalFood", vf.createLiteral("4", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("totalFood", vf.createLiteral("7", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
@@ -155,14 +155,14 @@
                 "}";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral(3)), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral(3)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(7)), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(7)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:age"), vf.createLiteral(2)), ""));
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:age"), vf.createLiteral(2)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
@@ -201,18 +201,18 @@
                 "}";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral(13)), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral(13)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(14)), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(14)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:age"), vf.createLiteral(7)), ""));
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:age"), vf.createLiteral(7)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:age"), vf.createLiteral(5)), ""));
+                vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:age"), vf.createLiteral(5)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:age"), vf.createLiteral(25)), ""));
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:age"), vf.createLiteral(25)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
@@ -251,18 +251,18 @@
                 "}";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral(13)), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral(13)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(14)), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(14)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:age"), vf.createLiteral(7)), ""));
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:age"), vf.createLiteral(7)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:age"), vf.createLiteral(5)), ""));
+                vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:age"), vf.createLiteral(5)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:age"), vf.createLiteral(25)), ""));
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:age"), vf.createLiteral(25)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
@@ -304,65 +304,65 @@
                 "} GROUP BY ?business ?employee";
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoJoint")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoJoint")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:TacoJoint"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard1")), ""));
+                vf.createStatement(vf.createIRI("urn:TacoJoint"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard1")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard1")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard1")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:timecard1"), vf.createURI("urn:hours"), vf.createLiteral(40)), ""));
+                vf.createStatement(vf.createIRI("urn:timecard1"), vf.createIRI("urn:hours"), vf.createLiteral(40)), ""));
 
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:TacoJoint"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard2")), ""));
+                vf.createStatement(vf.createIRI("urn:TacoJoint"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard2")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard2")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard2")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:timecard2"), vf.createURI("urn:hours"), vf.createLiteral(25)), ""));
+                vf.createStatement(vf.createIRI("urn:timecard2"), vf.createIRI("urn:hours"), vf.createLiteral(25)), ""));
 
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoJoint")), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoJoint")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:TacoJoint"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard3")), ""));
+                vf.createStatement(vf.createIRI("urn:TacoJoint"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard3")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard3")), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard3")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:timecard3"), vf.createURI("urn:hours"), vf.createLiteral(28)), ""));
+                vf.createStatement(vf.createIRI("urn:timecard3"), vf.createIRI("urn:hours"), vf.createLiteral(28)), ""));
 
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:worksAt"), vf.createURI("urn:CoffeeShop")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:CoffeeShop")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:CoffeeShop"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard5")), ""));
+                vf.createStatement(vf.createIRI("urn:CoffeeShop"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard5")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:hasTimecardId"), vf.createURI("urn:timecard5")), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:hasTimecardId"), vf.createIRI("urn:timecard5")), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:timecard5"), vf.createURI("urn:hours"), vf.createLiteral(12)), ""));
+                vf.createStatement(vf.createIRI("urn:timecard5"), vf.createIRI("urn:hours"), vf.createLiteral(12)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
-        bs.addBinding("employee", vf.createURI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
+        bs.addBinding("employee", vf.createIRI("urn:Alice"));
         bs.addBinding("totalHours", vf.createLiteral("40", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
         bs = new MapBindingSet();
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
-        bs.addBinding("employee", vf.createURI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
+        bs.addBinding("employee", vf.createIRI("urn:Alice"));
         bs.addBinding("totalHours", vf.createLiteral("65", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
         bs = new MapBindingSet();
-        bs.addBinding("business", vf.createURI("urn:TacoJoint"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoJoint"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
         bs.addBinding("totalHours", vf.createLiteral("28", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
         bs = new MapBindingSet();
-        bs.addBinding("business", vf.createURI("urn:CoffeeShop"));
-        bs.addBinding("employee", vf.createURI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:CoffeeShop"));
+        bs.addBinding("employee", vf.createIRI("urn:Alice"));
         bs.addBinding("totalHours", vf.createLiteral("12", XMLSchema.INTEGER));
         expected.add(new VisibilityBindingSet(bs, ""));
 
@@ -389,18 +389,18 @@
                 "}";
 
         // Create the statements that will be input into the query..
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral(13)), ""));
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral(13)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(14)), ""));
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(14)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:age"), vf.createLiteral(7)), ""));
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:age"), vf.createLiteral(7)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:age"), vf.createLiteral(5)), ""));
+                vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:age"), vf.createLiteral(5)), ""));
         statements.add(new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:age"), vf.createLiteral(25)), ""));
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:age"), vf.createLiteral(25)), ""));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorIT.java
index 7fb228a..f2a8d36 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorIT.java
@@ -34,11 +34,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the methods of {@link FilterProcessor}.
@@ -68,15 +68,15 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add(new VisibilityStatement(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(11)), "a"));
-        statements.add(new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral(9)), "a"));
+        statements.add(new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(11)), "a"));
+        statements.add(new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral(9)), "a"));
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("age", vf.createLiteral(9));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorTest.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorTest.java
index 3ff8e8d..51bd919 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorTest.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/FilterProcessorTest.java
@@ -30,11 +30,11 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResult;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.UnaryResult;
 import org.apache.rya.streams.kafka.processors.filter.FilterProcessorSupplier.FilterProcessor;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit tests the methods of {@link FilterProcessor}.
@@ -52,9 +52,9 @@
                 "}");
 
         // Create a Binding Set that will be passed into the Filter function based on the where clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
         bs.addBinding("age", vf.createLiteral(9));
         final VisibilityBindingSet inputVisBs = new VisibilityBindingSet(bs, "a");
 
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/TemporalFilterIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/TemporalFilterIT.java
index 11637b7..15c33ee 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/TemporalFilterIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/filter/TemporalFilterIT.java
@@ -39,24 +39,23 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.Function;
+import org.eclipse.rdf4j.query.algebra.evaluation.function.FunctionRegistry;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.function.Function;
-import org.openrdf.query.algebra.evaluation.function.FunctionRegistry;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the temporal methods of {@link FilterProcessor}.
  */
 public class TemporalFilterIT {
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final String TEMPORAL = "http://rya.apache.org/ns/temporal";
     private static final ZonedDateTime TIME = ZonedDateTime.parse("2015-12-30T12:00:00Z");
     private static final ZonedDateTime TIME_10 = ZonedDateTime.parse("2015-12-30T12:00:10Z");
@@ -100,13 +99,12 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
         final List<VisibilityStatement> statements = getStatements();
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("date", vf.createLiteral(TIME.toString()));
+        bs.addBinding("date", VF.createLiteral(TIME.toString()));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -134,13 +132,12 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
         final List<VisibilityStatement> statements = getStatements();
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("date", vf.createLiteral(TIME.toString()));
+        bs.addBinding("date", VF.createLiteral(TIME.toString()));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -168,13 +165,12 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
         final List<VisibilityStatement> statements = getStatements();
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("date", vf.createLiteral(TIME_20.toString()));
+        bs.addBinding("date", VF.createLiteral(TIME_20.toString()));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -202,13 +198,12 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
         final List<VisibilityStatement> statements = getStatements();
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("date", vf.createLiteral(TIME_10.toString()));
+        bs.addBinding("date", VF.createLiteral(TIME_10.toString()));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -224,9 +219,9 @@
     }
 
     private static Statement statement(final ZonedDateTime time) {
-        final Resource subject = vf.createURI("urn:time");
-        final URI predicate = vf.createURI("http://www.w3.org/2006/time/atTime");
-        final Value object = vf.createLiteral(time.toString());
-        return new StatementImpl(subject, predicate, object);
+        final Resource subject = VF.createIRI("urn:time");
+        final IRI predicate = VF.createIRI("http://www.w3.org/2006/time/atTime");
+        final Value object = VF.createLiteral(time.toString());
+        return VF.createStatement(subject, predicate, object);
     }
 }
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/join/JoinProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/join/JoinProcessorIT.java
index 5f09372..0de176d 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/join/JoinProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/join/JoinProcessorIT.java
@@ -37,11 +37,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 
@@ -81,33 +81,33 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements that generate a bunch of right SP results.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoPlace")), "a&b") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoPlace")), "a&b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "a") );
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:worksAt"), vf.createURI("urn:CoffeeShop")), "b") );
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:CoffeeShop")), "b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "b|c") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "b|c") );
 
         // Add a statement that will generate a left result that joins with some of those right results.
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "c") );
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "c") );
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoPlace"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoPlace"));
         expected.add( new VisibilityBindingSet(bs, "a&b&c") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add( new VisibilityBindingSet(bs, "c&(b|c)") );
 
         // Run the test.
@@ -132,33 +132,33 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements that generate a bunch of right SP results.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoPlace")), "a&b") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoPlace")), "a&b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "a") );
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:worksAt"), vf.createURI("urn:CoffeeShop")), "b") );
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:CoffeeShop")), "b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "b|c") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "b|c") );
 
         // Add a statement that will generate a left result that joins with some of those right results.
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "c") );
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "c") );
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoPlace"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoPlace"));
         expected.add( new VisibilityBindingSet(bs, "a&b&c") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add( new VisibilityBindingSet(bs, "c&(b|c)") );
 
         // Run the test.
@@ -183,39 +183,39 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements that generate a bunch of right SP results.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoPlace")), "a&b") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoPlace")), "a&b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "c") );
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "c") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "a") );
+                vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Eve"), vf.createURI("urn:worksAt"), vf.createURI("urn:CoffeeShop")), "b") );
+                vf.createStatement(vf.createIRI("urn:Eve"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:CoffeeShop")), "b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "b|c") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "b|c") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:talksTo"), vf.createURI("urn:Charlie")), "c") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Charlie")), "c") );
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoPlace"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoPlace"));
         expected.add( new VisibilityBindingSet(bs, "a&b&c") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add( new VisibilityBindingSet(bs, "c&(b|c)") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("employee", vf.createURI("urn:Charlie"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("employee", vf.createIRI("urn:Charlie"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add( new VisibilityBindingSet(bs, "a&c") );
 
         // Run the test.
@@ -241,21 +241,21 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements that generate a bunch of right SP results.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "a") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:hourlyWage"), vf.createLiteral(7.25)), "a") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:hourlyWage"), vf.createLiteral(7.25)), "a") );
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         bs.addBinding("wage", vf.createLiteral(7.25));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
@@ -281,33 +281,33 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements that generate a result that includes the optional value as well as one that does not.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
+                vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoPlace")), "b") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoPlace")), "b") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:talksTo"), vf.createURI("urn:Charlie")), "c") );
+                vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Charlie")), "c") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:David"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "d") );
+                vf.createStatement(vf.createIRI("urn:David"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "d") );
 
         // Make the expected results.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("employee", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoPlace"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("employee", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoPlace"));
         expected.add( new VisibilityBindingSet(bs, "a&b") );
 
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("employee", vf.createURI("urn:Charlie"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("employee", vf.createIRI("urn:Charlie"));
         expected.add( new VisibilityBindingSet(bs, "c") );
 
         // Run the test.
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorIT.java
index c6fd1cf..7142cb7 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorIT.java
@@ -32,12 +32,12 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.BNode;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
 
 /**
  * Integration tests the methods of {@link MultiProjectionProcessor}.
@@ -71,20 +71,20 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, () -> bNodeId);
 
         // Create the statements that will be input into the query.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:car1"), vf.createURI("urn:compass"), vf.createURI("urn:NW")), "a") );
+                vf.createStatement(vf.createIRI("urn:car1"), vf.createIRI("urn:compass"), vf.createIRI("urn:NW")), "a") );
         statements.add( new VisibilityStatement(
-                vf.createStatement(vf.createURI("urn:car1"), vf.createURI("urn:corner"), vf.createURI("urn:corner1")), "a") );
+                vf.createStatement(vf.createIRI("urn:car1"), vf.createIRI("urn:corner"), vf.createIRI("urn:corner1")), "a") );
 
         // Make the expected results.
         final Set<VisibilityStatement> expected = new HashSet<>();
         final BNode blankNode = vf.createBNode(bNodeId);
 
-        expected.add(new VisibilityStatement(vf.createStatement(blankNode, RDF.TYPE, vf.createURI("urn:movementObservation")), "a"));
-        expected.add(new VisibilityStatement(vf.createStatement(blankNode, vf.createURI("urn:direction"), vf.createURI("urn:NW")), "a"));
-        expected.add(new VisibilityStatement(vf.createStatement(blankNode, vf.createURI("urn:location"), vf.createURI("urn:corner1")), "a"));
+        expected.add(new VisibilityStatement(vf.createStatement(blankNode, RDF.TYPE, vf.createIRI("urn:movementObservation")), "a"));
+        expected.add(new VisibilityStatement(vf.createStatement(blankNode, vf.createIRI("urn:direction"), vf.createIRI("urn:NW")), "a"));
+        expected.add(new VisibilityStatement(vf.createStatement(blankNode, vf.createIRI("urn:location"), vf.createIRI("urn:corner1")), "a"));
 
         // Run the test.
         RyaStreamsTestUtil.runStreamProcessingTest(kafka, statementsTopic, resultsTopic, builder, statements, expected, VisibilityStatementDeserializer.class);
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorIT.java
index f53f2c4..977e453 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorIT.java
@@ -34,11 +34,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Sets;
 
@@ -68,16 +68,16 @@
         final TopologyBuilder builder = new TopologyFactory().build(sparql, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Load some data into the input topic.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
 
         // Show the correct binding set results from the job.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
 
         final MapBindingSet expectedBs = new MapBindingSet();
-        expectedBs.addBinding("p", vf.createURI("urn:Alice"));
-        expectedBs.addBinding("otherPerson", vf.createURI("urn:Bob"));
+        expectedBs.addBinding("p", vf.createIRI("urn:Alice"));
+        expectedBs.addBinding("otherPerson", vf.createIRI("urn:Bob"));
         expected.add(new VisibilityBindingSet(expectedBs, "a"));
 
         RyaStreamsTestUtil.runStreamProcessingTest(kafka, statementsTopic, resultsTopic, builder, statements, Sets.newHashSet(expected), VisibilityBindingSetDeserializer.class);
diff --git a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/sp/StatementPatternProcessorIT.java b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/sp/StatementPatternProcessorIT.java
index fd0a48d..1e65827 100644
--- a/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/sp/StatementPatternProcessorIT.java
+++ b/extras/rya.streams/integration/src/test/java/org/apache/rya/streams/kafka/processors/sp/StatementPatternProcessorIT.java
@@ -34,11 +34,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetDeserializer;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 /**
  * Integration tests the methods of {@link StatementPatternProcessor}.
@@ -62,16 +62,16 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create a statement that generate an SP result.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
 
         // Show the correct binding set results from the job.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Bob"));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -92,24 +92,24 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements where some generates SP results and others do not.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:worksAt"), vf.createURI("urn:TacoJoin")), "b") );
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:talksTo"), vf.createURI("urn:Alice")), "a|b") );
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:worksAt"), vf.createURI("urn:BurgerJoint")), "c") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:TacoJoin")), "b") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Alice")), "a|b") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:worksAt"), vf.createIRI("urn:BurgerJoint")), "c") );
 
         // Show the correct binding set results from the job.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
 
         QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Bob"));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Alice"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Alice"));
         expected.add( new VisibilityBindingSet(bs, "a|b") );
 
         // Run the test.
@@ -133,17 +133,17 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements where some generates SP results and others do not.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
 
         // Show the correct binding set results from the job.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
 
         final QueryBindingSet bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("action", vf.createURI("urn:talksTo"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("action", vf.createIRI("urn:talksTo"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Bob"));
         expected.add( new VisibilityBindingSet(bs, "a") );
 
         // Run the test.
@@ -167,26 +167,26 @@
         final TopologyBuilder builder = factory.build(query, statementsTopic, resultsTopic, new RandomUUIDFactory());
 
         // Create some statements where some generates SP results and others do not.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Charlie")), "a|b") );
-        statements.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Charlie"), vf.createURI("urn:walksWith"), vf.createURI("urn:Bob")), "b") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Charlie")), "a|b") );
+        statements.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Charlie"), vf.createIRI("urn:walksWith"), vf.createIRI("urn:Bob")), "b") );
 
         // Show the correct binding set results from the job.
         final Set<VisibilityBindingSet> expected = new HashSet<>();
 
         QueryBindingSet bs = new QueryBindingSet();
         bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("action", vf.createURI("urn:talksTo"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Charlie"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("action", vf.createIRI("urn:talksTo"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Charlie"));
         expected.add(new VisibilityBindingSet(bs, "a&(a|b)"));
 
         bs = new QueryBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("action", vf.createURI("urn:talksTo"));
-        bs.addBinding("otherPerson", vf.createURI("urn:Bob"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("action", vf.createIRI("urn:talksTo"));
+        bs.addBinding("otherPerson", vf.createIRI("urn:Bob"));
         expected.add(new VisibilityBindingSet(bs, "a"));
 
         // Run the test.
diff --git a/extras/rya.streams/kafka/pom.xml b/extras/rya.streams/kafka/pom.xml
index 3f3227d..a1b518b 100644
--- a/extras/rya.streams/kafka/pom.xml
+++ b/extras/rya.streams/kafka/pom.xml
@@ -68,6 +68,10 @@
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.api</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.sail</artifactId>
+        </dependency>
 
         <!-- Kafka dependencies -->
         <dependency>
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/SingleThreadKafkaStreamsFactory.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/SingleThreadKafkaStreamsFactory.java
index 63d64b9..efcc21e 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/SingleThreadKafkaStreamsFactory.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/SingleThreadKafkaStreamsFactory.java
@@ -31,7 +31,7 @@
 import org.apache.rya.streams.kafka.topology.TopologyBuilderFactory;
 import org.apache.rya.streams.kafka.topology.TopologyBuilderFactory.TopologyBuilderException;
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatements.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatements.java
index cf10f6a..ab026f3 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatements.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatements.java
@@ -28,15 +28,17 @@
 import org.apache.kafka.clients.producer.Producer;
 import org.apache.kafka.clients.producer.ProducerRecord;
 import org.apache.rya.api.model.VisibilityStatement;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
 import org.apache.rya.streams.api.exception.RyaStreamsException;
 import org.apache.rya.streams.api.interactor.LoadStatements;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.Rio;
-import org.openrdf.rio.helpers.RDFHandlerBase;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.Rio;
+import org.eclipse.rdf4j.rio.UnsupportedRDFormatException;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -75,11 +77,15 @@
         }
 
         // Create an RDF Parser whose format is derived from the statementPath's file extension.
-        final RDFFormat format = RDFFormat.forFileName(statementsPath.getFileName().toString());
+        final String filename = statementsPath.getFileName().toString();
+        final RDFFormat format = RdfFormatUtils.forFileName(filename);
+        if (format == null) {
+            throw new UnsupportedRDFormatException("Unknown RDF format for the file: " + filename);
+        }
         final RDFParser parser = Rio.createParser(format);
 
         // Set a handler that writes the statements to the specified kafka topic.
-        parser.setRDFHandler(new RDFHandlerBase() {
+        parser.setRDFHandler(new AbstractRDFHandler() {
             @Override
             public void startRDF() throws RDFHandlerException {
                 log.trace("Starting loading statements.");
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/StatementPatternProcessorSupplier.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/StatementPatternProcessorSupplier.java
index f7c2e5e..46415d0 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/StatementPatternProcessorSupplier.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/StatementPatternProcessorSupplier.java
@@ -28,8 +28,8 @@
 import org.apache.rya.api.function.sp.StatementPatternMatcher;
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.model.VisibilityStatement;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorSupplier.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorSupplier.java
index c101914..5af54d3 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorSupplier.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/AggregationProcessorSupplier.java
@@ -35,7 +35,7 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResultFactory;
 import org.apache.rya.streams.kafka.processors.RyaStreamsProcessor;
 import org.apache.rya.streams.kafka.processors.RyaStreamsProcessorSupplier;
-import org.openrdf.query.algebra.Group;
+import org.eclipse.rdf4j.query.algebra.Group;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/KeyValueAggregationStateStore.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/KeyValueAggregationStateStore.java
index 3300590..4eb7474 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/KeyValueAggregationStateStore.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/aggregation/KeyValueAggregationStateStore.java
@@ -28,7 +28,7 @@
 import org.apache.rya.api.function.aggregation.AggregationState;
 import org.apache.rya.api.function.aggregation.AggregationStateStore;
 import org.apache.rya.api.model.VisibilityBindingSet;
-import org.openrdf.query.BindingSet;
+import org.eclipse.rdf4j.query.BindingSet;
 
 import com.google.common.base.Joiner;
 
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/join/KeyValueJoinStateStore.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/join/KeyValueJoinStateStore.java
index 61ca141..c2d6190 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/join/KeyValueJoinStateStore.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/join/KeyValueJoinStateStore.java
@@ -31,7 +31,7 @@
 import org.apache.rya.api.utils.CloseableIterator;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.BinaryResult;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.BinaryResult.Side;
-import org.openrdf.query.impl.MapBindingSet;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterSupplier.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterSupplier.java
index 74a6f96..6e68908 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterSupplier.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterSupplier.java
@@ -26,12 +26,12 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.api.model.VisibilityStatement;
 import org.apache.rya.streams.kafka.processors.ProcessorResult;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.collect.Sets;
 
@@ -56,7 +56,7 @@
     @DefaultAnnotation(NonNull.class)
     public static final class StatementOutputFormatter implements Processor<Object, ProcessorResult> {
 
-        private static final ValueFactory VF = new ValueFactoryImpl();
+        private static final ValueFactory VF = SimpleValueFactory.getInstance();
         private static final Collection<String> REQURIED_BINDINGS = Sets.newHashSet("subject", "predicate", "object");
 
         private ProcessorContext processorContext;
@@ -88,14 +88,14 @@
 
                 // Make sure the Predicate is the correct type.
                 final Value predVal = result.getValue("predicate");
-                if(!(predVal instanceof URI)) {
+                if(!(predVal instanceof IRI)) {
                     return;
                 }
 
                 // Forward the visibility statement.
                 final Statement statement = VF.createStatement(
                         (Resource) subjVal,
-                        (URI) predVal,
+                        (IRI) predVal,
                         result.getValue("object"));
                 processorContext.forward(key, new VisibilityStatement(statement, result.getVisibility()));
             }
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLog.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLog.java
index 2822272..e536efc 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLog.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLog.java
@@ -35,12 +35,12 @@
 import org.apache.rya.streams.api.queries.ChangeLogEntry;
 import org.apache.rya.streams.api.queries.QueryChange;
 import org.apache.rya.streams.api.queries.QueryChangeLog;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 
 import com.google.common.collect.Lists;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
-import info.aduna.iteration.CloseableIteration;
 
 /**
  * A Kafka implementation of a {@link QueryChangeLog}.
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyBuilderFactory.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyBuilderFactory.java
index c533854..e57503b 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyBuilderFactory.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyBuilderFactory.java
@@ -20,7 +20,7 @@
 
 import org.apache.kafka.streams.processor.TopologyBuilder;
 import org.apache.rya.api.function.projection.BNodeIdFactory;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
diff --git a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyFactory.java b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyFactory.java
index f330fa3..f2e721e 100644
--- a/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyFactory.java
+++ b/extras/rya.streams/kafka/src/main/java/org/apache/rya/streams/kafka/topology/TopologyFactory.java
@@ -62,22 +62,22 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityBindingSetSerializer;
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementDeserializer;
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementSerializer;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.BinaryTupleOperator;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Group;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.QueryModelNode;
-import org.openrdf.query.algebra.Reduced;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Group;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.QueryModelNode;
+import org.eclipse.rdf4j.query.algebra.Reduced;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
@@ -334,7 +334,7 @@
      * {@link ProcessorSupplier} and meta information needed for creating a
      * {@link TopologyBuilder}.
      */
-    final static class QueryVisitor extends QueryModelVisitorBase<TopologyBuilderException> {
+    final static class QueryVisitor extends AbstractQueryModelVisitor<TopologyBuilderException> {
         // Each node needs a ProcessorEntry to be a processor node in the TopologyBuilder.
         private final List<ProcessorEntry> entries = new ArrayList<>();
         private final Map<TupleExpr, String> idMap = new HashMap<>();
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaGetQueryResultStreamIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaGetQueryResultStreamIT.java
index 59c08b7..3538ac6 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaGetQueryResultStreamIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaGetQueryResultStreamIT.java
@@ -39,11 +39,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementSerializer;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the methods of {@link KafkaGetQueryResultStream}.
@@ -91,7 +91,7 @@
         // Create a list of test VisibilityBindingSets.
         final List<VisibilityBindingSet> original = new ArrayList<>();
 
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         MapBindingSet bs = new MapBindingSet();
         bs.addBinding("urn:name", vf.createLiteral("Alice"));
         original.add(new VisibilityBindingSet(bs, "a|b|c"));
@@ -133,7 +133,7 @@
             final String resultTopic = KafkaTopics.queryResultsTopic(ryaInstance, queryId);
 
             // Write a single visibility binding set to the query's result topic. This will not appear in the expected results.
-            final ValueFactory vf = new ValueFactoryImpl();
+            final ValueFactory vf = SimpleValueFactory.getInstance();
             MapBindingSet bs = new MapBindingSet();
             bs.addBinding("urn:name", vf.createLiteral("Alice"));
             producer.send(new ProducerRecord<>(resultTopic, new VisibilityBindingSet(bs, "a|b|c")));
@@ -201,10 +201,10 @@
 
         // Create some statements that will be written to the result topic.
         final List<VisibilityStatement> original = new ArrayList<>();
-        final ValueFactory vf = new ValueFactoryImpl();
-        original.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:talksTo"), vf.createURI("urn:Bob")), "a") );
-        original.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Bob"), vf.createURI("urn:age"), vf.createLiteral(63)), "b") );
-        original.add( new VisibilityStatement(vf.createStatement(vf.createURI("urn:Alice"), vf.createURI("urn:age"), vf.createLiteral("urn:34")), "") );
+        final ValueFactory vf = SimpleValueFactory.getInstance();
+        original.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:talksTo"), vf.createIRI("urn:Bob")), "a") );
+        original.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Bob"), vf.createIRI("urn:age"), vf.createLiteral(63)), "b") );
+        original.add( new VisibilityStatement(vf.createStatement(vf.createIRI("urn:Alice"), vf.createIRI("urn:age"), vf.createLiteral("urn:34")), "") );
 
         // Write the entries to the query result topic in Kafka.
         try(final Producer<?, VisibilityStatement> producer =
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatementsIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatementsIT.java
index 7bfa560..4df2479 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatementsIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaLoadStatementsIT.java
@@ -35,11 +35,11 @@
 import org.apache.rya.streams.kafka.serialization.VisibilityStatementSerializer;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.rio.UnsupportedRDFormatException;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.rio.UnsupportedRDFormatException;
 
 /**
  * Integration tests the {@link KafkaLoadStatements} command
@@ -81,16 +81,16 @@
         }
 
         final List<VisibilityStatement> original = new ArrayList<>();
-        final ValueFactory VF = ValueFactoryImpl.getInstance();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         original.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#alice"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#bob")),
+                vf.createStatement(vf.createIRI("http://example#alice"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#bob")),
                 visibilities));
         original.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#bob"), VF.createURI("http://example#talksTo"), VF.createURI("http://example#charlie")),
+                vf.createStatement(vf.createIRI("http://example#bob"), vf.createIRI("http://example#talksTo"), vf.createIRI("http://example#charlie")),
                 visibilities));
         original.add(new VisibilityStatement(
-                VF.createStatement(VF.createURI("http://example#charlie"), VF.createURI("http://example#likes"), VF.createURI("http://example#icecream")),
+                vf.createStatement(vf.createIRI("http://example#charlie"), vf.createIRI("http://example#likes"), vf.createIRI("http://example#icecream")),
                 visibilities));
         // Show the written statement matches the read one.
         assertEquals(original, read);
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaRunQueryIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaRunQueryIT.java
index 4459057..b1a801e 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaRunQueryIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/interactor/KafkaRunQueryIT.java
@@ -44,13 +44,13 @@
 import org.apache.rya.streams.kafka.topology.TopologyFactory;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.AbstractScheduledService.Scheduler;
@@ -116,34 +116,34 @@
         kafka.createTopic(resultsTopic);
 
         // Create the statements that will be loaded.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Alice"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:BurgerJoint")), "a"));
+                vf.createIRI("urn:Alice"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:BurgerJoint")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Bob"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Bob"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Charlie"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Charlie"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
 
         // Create the expected results.
         final List<VisibilityBindingSet> expected = new ArrayList<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Charlie"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Charlie"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
 
         // Execute the test. This will result in a set of results that were read from the results topic.
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/BindingSetOutputFormatterTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/BindingSetOutputFormatterTest.java
index 3c810b1..1560f50 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/BindingSetOutputFormatterTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/BindingSetOutputFormatterTest.java
@@ -30,10 +30,10 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResult.BinaryResult.Side;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.UnaryResult;
 import org.apache.rya.streams.kafka.processors.output.BindingSetOutputFormatterSupplier.BindingSetOutputFormatter;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit tests the methods of {@link BindingSetOutputFormatter}.
@@ -43,9 +43,9 @@
     @Test
     public void unaryResult() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("person", vf.createURI("urn:Alice"));
+        bindingSet.addBinding("person", vf.createIRI("urn:Alice"));
         bindingSet.addBinding("age", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -64,9 +64,9 @@
     @Test
     public void binaryResult() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("person", vf.createURI("urn:Alice"));
+        bindingSet.addBinding("person", vf.createIRI("urn:Alice"));
         bindingSet.addBinding("age", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterTest.java
index 5f7e9a6..0f5c9fb 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/output/StatementOutputFormatterTest.java
@@ -32,10 +32,10 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResult.BinaryResult.Side;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.UnaryResult;
 import org.apache.rya.streams.kafka.processors.output.StatementOutputFormatterSupplier.StatementOutputFormatter;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit tests the methods of {@link StatementOutputFormatter}.
@@ -45,10 +45,10 @@
     @Test
     public void unaryResult() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("subject", vf.createURI("urn:Alice"));
-        bindingSet.addBinding("predicate", vf.createURI("urn:age"));
+        bindingSet.addBinding("subject", vf.createIRI("urn:Alice"));
+        bindingSet.addBinding("predicate", vf.createIRI("urn:age"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -62,8 +62,8 @@
 
         // Verify the mock was invoked with the expected output.
         final VisibilityStatement expectedStmt = new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Alice"),
-                vf.createURI("urn:age"),
+                vf.createIRI("urn:Alice"),
+                vf.createIRI("urn:age"),
                 vf.createLiteral(34)), "a");
         verify(context, times(1)).forward(eq("key"), eq(expectedStmt));
     }
@@ -71,10 +71,10 @@
     @Test
     public void binaryResult() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("subject", vf.createURI("urn:Alice"));
-        bindingSet.addBinding("predicate", vf.createURI("urn:age"));
+        bindingSet.addBinding("subject", vf.createIRI("urn:Alice"));
+        bindingSet.addBinding("predicate", vf.createIRI("urn:age"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -88,8 +88,8 @@
 
         // Verify the mock was invoked with the expected output.
         final VisibilityStatement expectedStmt = new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Alice"),
-                vf.createURI("urn:age"),
+                vf.createIRI("urn:Alice"),
+                vf.createIRI("urn:age"),
                 vf.createLiteral(34)), "a");
         verify(context, times(1)).forward(eq("key"), eq(expectedStmt));
     }
@@ -97,9 +97,9 @@
     @Test
     public void missingSubject() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("predicate", vf.createURI("urn:age"));
+        bindingSet.addBinding("predicate", vf.createIRI("urn:age"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -118,10 +118,10 @@
     @Test
     public void subjectWrongType() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
         bindingSet.addBinding("subject", vf.createLiteral("Alice"));
-        bindingSet.addBinding("predicate", vf.createURI("urn:age"));
+        bindingSet.addBinding("predicate", vf.createIRI("urn:age"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -140,9 +140,9 @@
     @Test
     public void missingPredicate() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("subject", vf.createURI("urn:Alice"));
+        bindingSet.addBinding("subject", vf.createIRI("urn:Alice"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
@@ -161,9 +161,9 @@
     @Test
     public void predicateWrongType() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("subject", vf.createURI("urn:Alice"));
+        bindingSet.addBinding("subject", vf.createIRI("urn:Alice"));
         bindingSet.addBinding("predicate", vf.createLiteral("age"));
         bindingSet.addBinding("object", vf.createLiteral(34));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
@@ -183,10 +183,10 @@
     @Test
     public void missingObject() {
         // Create the input binding set.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bindingSet = new MapBindingSet();
-        bindingSet.addBinding("subject", vf.createURI("urn:Alice"));
-        bindingSet.addBinding("predicate", vf.createURI("urn:age"));
+        bindingSet.addBinding("subject", vf.createIRI("urn:Alice"));
+        bindingSet.addBinding("predicate", vf.createIRI("urn:age"));
         final VisibilityBindingSet visBs = new VisibilityBindingSet(bindingSet, "a");
 
         // Mock the processor context that will be invoked.
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorTest.java
index d25db23..a52c73c 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/MultiProjectionProcessorTest.java
@@ -37,14 +37,14 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResult.ResultType;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.UnaryResult;
 import org.apache.rya.streams.kafka.processors.projection.MultiProjectionProcessorSupplier.MultiProjectionProcessor;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
-import org.openrdf.model.BNode;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit test the methods of {@link MultiProjectionProcessor}.
@@ -66,10 +66,10 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet inputBs = new MapBindingSet();
-        inputBs.addBinding("location", vf.createURI("urn:corner1"));
-        inputBs.addBinding("direction", vf.createURI("urn:NW"));
+        inputBs.addBinding("location", vf.createIRI("urn:corner1"));
+        inputBs.addBinding("direction", vf.createIRI("urn:NW"));
         final VisibilityBindingSet inputVisBs = new VisibilityBindingSet(inputBs, "a|b");
 
         // Make the expected results.
@@ -80,19 +80,19 @@
         MapBindingSet expectedBs = new MapBindingSet();
         expectedBs.addBinding("subject", blankNode);
         expectedBs.addBinding("predicate", RDF.TYPE);
-        expectedBs.addBinding("object", vf.createURI("urn:movementObservation"));
+        expectedBs.addBinding("object", vf.createIRI("urn:movementObservation"));
         expected.add(new VisibilityBindingSet(expectedBs, "a|b"));
 
         expectedBs = new MapBindingSet();
         expectedBs.addBinding("subject", blankNode);
-        expectedBs.addBinding("predicate", vf.createURI("urn:direction"));
-        expectedBs.addBinding("object", vf.createURI("urn:NW"));
+        expectedBs.addBinding("predicate", vf.createIRI("urn:direction"));
+        expectedBs.addBinding("object", vf.createIRI("urn:NW"));
         expected.add(new VisibilityBindingSet(expectedBs, "a|b"));
 
         expectedBs = new MapBindingSet();
         expectedBs.addBinding("subject", blankNode);
-        expectedBs.addBinding("predicate", vf.createURI("urn:location"));
-        expectedBs.addBinding("object", vf.createURI("urn:corner1"));
+        expectedBs.addBinding("predicate", vf.createIRI("urn:location"));
+        expectedBs.addBinding("object", vf.createIRI("urn:corner1"));
         expected.add(new VisibilityBindingSet(expectedBs, "a|b"));
 
         // Mock the processor context that will be invoked.
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorTest.java
index 7ff2c96..f0fd762 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/processors/projection/ProjectionProcessorTest.java
@@ -30,11 +30,11 @@
 import org.apache.rya.streams.kafka.processors.ProcessorResult;
 import org.apache.rya.streams.kafka.processors.ProcessorResult.UnaryResult;
 import org.apache.rya.streams.kafka.processors.projection.ProjectionProcessorSupplier.ProjectionProcessor;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Unit tests the methods of {@link ProjectionProcessor}.
@@ -52,18 +52,18 @@
                 "}");
 
         // Create a Binding Set that contains the result of the WHERE clause.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet inputBs = new MapBindingSet();
-        inputBs.addBinding("person", vf.createURI("urn:Alice"));
-        inputBs.addBinding("employee", vf.createURI("urn:Bob"));
-        inputBs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        inputBs.addBinding("person", vf.createIRI("urn:Alice"));
+        inputBs.addBinding("employee", vf.createIRI("urn:Bob"));
+        inputBs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet inputVisBs = new VisibilityBindingSet(inputBs, "a");
 
         // The expected binding set changes the "person" binding name to "p" and "employee" to "e".
         final MapBindingSet expectedBs = new MapBindingSet();
-        expectedBs.addBinding("p", vf.createURI("urn:Alice"));
-        expectedBs.addBinding("e", vf.createURI("urn:Bob"));
-        expectedBs.addBinding("business", vf.createURI("urn:TacoJoint"));
+        expectedBs.addBinding("p", vf.createIRI("urn:Alice"));
+        expectedBs.addBinding("e", vf.createIRI("urn:Bob"));
+        expectedBs.addBinding("business", vf.createIRI("urn:TacoJoint"));
         final VisibilityBindingSet expectedVisBs = new VisibilityBindingSet(expectedBs, "a");
 
         // Show it resulted in the correct output BindingSet.
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLogIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLogIT.java
index 0dcd079..78db768 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLogIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/queries/KafkaQueryChangeLogIT.java
@@ -39,6 +39,7 @@
 import org.apache.rya.test.kafka.KafkaITBase;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
@@ -46,8 +47,6 @@
 
 import com.google.common.collect.Lists;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Integration tests the {@link KafkaQueryChangeLog}.
  */
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetKafkaIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetKafkaIT.java
index 70cba1c..5b14bd4 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetKafkaIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetKafkaIT.java
@@ -31,11 +31,11 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Integration tests the {@link VisibilityBindingSetSerde} class' methods.
@@ -48,10 +48,10 @@
     @Test
     public void readAndWrite() throws Exception {
         // Create the object that will be written to the topic.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
 
         final MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("urn:name", vf.createURI("urn:alice"));
+        bs.addBinding("urn:name", vf.createIRI("urn:alice"));
         bs.addBinding("urn:age", vf.createLiteral(32));
         final VisibilityBindingSet original = new VisibilityBindingSet(bs, "a|b|c");
 
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetSerdeTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetSerdeTest.java
index 9d93539..049893b 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetSerdeTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityBindingSetSerdeTest.java
@@ -23,10 +23,10 @@
 
 import org.apache.kafka.common.serialization.Serde;
 import org.apache.rya.api.model.VisibilityBindingSet;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 /**
  * Tests the methods of {@link VisibilityBindingSetSerde}.
@@ -36,7 +36,7 @@
     @Test
     public void serializeAndDeserialize() {
         // Create the object that will be serialized.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final MapBindingSet bs = new MapBindingSet();
         bs.addBinding("name", vf.createLiteral("alice"));
         bs.addBinding("age", vf.createLiteral(37));
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementKafkaIT.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementKafkaIT.java
index 9e85f52..a680582 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementKafkaIT.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementKafkaIT.java
@@ -31,10 +31,10 @@
 import org.apache.rya.api.model.VisibilityStatement;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 /**
  * Integration tests the {@link VisibilityStatementSerde} class' methods.
@@ -47,13 +47,13 @@
     @Test
     public void readAndWrite() throws Exception {
         // Create the object that will be written to the topic.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final VisibilityStatement original = new VisibilityStatement(
                 vf.createStatement(
-                        vf.createURI("urn:alice"),
-                        vf.createURI("urn:age"),
+                        vf.createIRI("urn:alice"),
+                        vf.createIRI("urn:age"),
                         vf.createLiteral(32),
-                        vf.createURI("urn:context")),
+                        vf.createIRI("urn:context")),
                 "a|b|c");
 
         // Write a VisibilityStatement to the test topic.
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementSerdeTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementSerdeTest.java
index 47a79c9..d4f8ada 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementSerdeTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/serialization/VisibilityStatementSerdeTest.java
@@ -23,10 +23,10 @@
 
 import org.apache.kafka.common.serialization.Serde;
 import org.apache.rya.api.model.VisibilityStatement;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
 
 /**
  * Tests the methods of {@link VisibilityStatementSerde}.
@@ -36,12 +36,12 @@
     @Test
     public void serializeAndDeserialize() {
         // Create the object that will be serialized.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final Statement statement = vf.createStatement(
-                vf.createURI("urn:person1"),
-                vf.createURI("urn:hasName"),
+                vf.createIRI("urn:person1"),
+                vf.createIRI("urn:hasName"),
                 vf.createLiteral("alice"),
-                vf.createURI("urn:testContext"));
+                vf.createIRI("urn:testContext"));
 
         final VisibilityStatement original = new VisibilityStatement(statement, "a|b|c");
 
diff --git a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/topology/TopologyFactoryTest.java b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/topology/TopologyFactoryTest.java
index 31462ec..95e2ddb 100644
--- a/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/topology/TopologyFactoryTest.java
+++ b/extras/rya.streams/kafka/src/test/java/org/apache/rya/streams/kafka/topology/TopologyFactoryTest.java
@@ -23,16 +23,17 @@
 
 import java.util.List;
 
+import org.apache.rya.api.domain.VarNameUtils;
 import org.apache.rya.api.function.projection.RandomUUIDFactory;
 import org.apache.rya.streams.kafka.topology.TopologyFactory.ProcessorEntry;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
 
 /**
  * Unit tests the methods of {@link TopologyFactory}.
@@ -40,9 +41,9 @@
 public class TopologyFactoryTest {
     private static TopologyFactory FACTORY;
 
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
-    private static final Var TALKS_TO = new Var("-const-urn:talksTo", VF.createURI("urn:talksTo"));
-    private static final Var CHEWS = new Var("-const-urn:chews", VF.createURI("urn:chews"));
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final Var TALKS_TO = VarNameUtils.createUniqueConstVar(VF.createIRI("urn:talksTo"));
+    private static final Var CHEWS = VarNameUtils.createUniqueConstVar(VF.createIRI("urn:chews"));
 
     static {
         TALKS_TO.setAnonymous(true);
diff --git a/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/QueryExecutor.java b/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/QueryExecutor.java
index bcee796..2c0686f 100644
--- a/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/QueryExecutor.java
+++ b/extras/rya.streams/query-manager/src/main/java/org/apache/rya/streams/querymanager/QueryExecutor.java
@@ -22,7 +22,7 @@
 import java.util.UUID;
 
 import org.apache.rya.streams.api.entity.StreamsQuery;
-import org.openrdf.model.Statement;
+import org.eclipse.rdf4j.model.Statement;
 
 import com.google.common.util.concurrent.Service;
 
diff --git a/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/kafka/LocalQueryExecutorIT.java b/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/kafka/LocalQueryExecutorIT.java
index 83f040d..fcb3a46 100644
--- a/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/kafka/LocalQueryExecutorIT.java
+++ b/extras/rya.streams/query-manager/src/test/java/org/apache/rya/streams/querymanager/kafka/LocalQueryExecutorIT.java
@@ -42,13 +42,13 @@
 import org.apache.rya.streams.querymanager.QueryExecutor;
 import org.apache.rya.test.kafka.KafkaTestInstanceRule;
 import org.apache.rya.test.kafka.KafkaTestUtil;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.impl.MapBindingSet;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.impl.MapBindingSet;
 
 import com.google.common.collect.Lists;
 
@@ -89,34 +89,34 @@
         final StreamsQuery sQuery = new StreamsQuery(UUID.randomUUID(), "SELECT * WHERE { ?person <urn:worksAt> ?business . }", true, false);
 
         // Create the statements that will be loaded.
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         final List<VisibilityStatement> statements = new ArrayList<>();
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Alice"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:BurgerJoint")), "a"));
+                vf.createIRI("urn:Alice"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:BurgerJoint")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Bob"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Bob"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
         statements.add(new VisibilityStatement(vf.createStatement(
-                vf.createURI("urn:Charlie"),
-                vf.createURI("urn:worksAt"),
-                vf.createURI("urn:TacoShop")), "a"));
+                vf.createIRI("urn:Charlie"),
+                vf.createIRI("urn:worksAt"),
+                vf.createIRI("urn:TacoShop")), "a"));
 
         // Create the expected results.
         final List<VisibilityBindingSet> expected = new ArrayList<>();
         MapBindingSet bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Alice"));
-        bs.addBinding("business", vf.createURI("urn:BurgerJoint"));
+        bs.addBinding("person", vf.createIRI("urn:Alice"));
+        bs.addBinding("business", vf.createIRI("urn:BurgerJoint"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Bob"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Bob"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
         bs = new MapBindingSet();
-        bs.addBinding("person", vf.createURI("urn:Charlie"));
-        bs.addBinding("business", vf.createURI("urn:TacoShop"));
+        bs.addBinding("person", vf.createIRI("urn:Charlie"));
+        bs.addBinding("business", vf.createIRI("urn:TacoShop"));
         expected.add(new VisibilityBindingSet(bs, "a"));
 
         // Start the executor that will be tested.
diff --git a/extras/shell/src/main/java/org/apache/rya/shell/RyaCommands.java b/extras/shell/src/main/java/org/apache/rya/shell/RyaCommands.java
index 1d53348..c257860 100644
--- a/extras/shell/src/main/java/org/apache/rya/shell/RyaCommands.java
+++ b/extras/shell/src/main/java/org/apache/rya/shell/RyaCommands.java
@@ -35,12 +35,14 @@
 import org.apache.rya.api.client.ExecuteSparqlQuery;
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.api.client.RyaClientException;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
 import org.apache.rya.shell.SharedShellState.ShellState;
 import org.apache.rya.shell.util.ConsolePrinter;
 import org.apache.rya.shell.util.SparqlPrompt;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.rio.RDFFormat;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.Rio;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -121,7 +123,7 @@
             RDFFormat rdfFormat = null;
             // If a format was provided, then go with that.
             if (format != null) {
-                rdfFormat = RDFFormat.valueOf(format);
+                rdfFormat = RdfFormatUtils.getRdfFormatFromName(format);
                 if (rdfFormat == null) {
                     throw new RuntimeException("Unsupported RDF Statement data input format: " + format);
                 }
@@ -129,7 +131,7 @@
 
             // Otherwise try to figure it out using the filename.
             else if (rdfFormat == null) {
-                rdfFormat = RDFFormat.forFileName(rootedFile.getFileName().toString());
+                rdfFormat = Rio.getParserFormatForFileName(rootedFile.getFileName().toString()).get();
                 if (rdfFormat == null) {
                     throw new RuntimeException("Unable to detect RDF Statement data input format for file: " + rootedFile);
                 } else {
diff --git a/extras/shell/src/main/java/org/apache/rya/shell/RyaStreamsCommands.java b/extras/shell/src/main/java/org/apache/rya/shell/RyaStreamsCommands.java
index fede1a9..f286472 100644
--- a/extras/shell/src/main/java/org/apache/rya/shell/RyaStreamsCommands.java
+++ b/extras/shell/src/main/java/org/apache/rya/shell/RyaStreamsCommands.java
@@ -37,7 +37,7 @@
 import org.apache.rya.streams.api.entity.StreamsQuery;
 import org.apache.rya.streams.api.exception.RyaStreamsException;
 import org.apache.rya.streams.kafka.KafkaRyaStreamsClientFactory;
-import org.openrdf.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.shell.core.CommandMarker;
 import org.springframework.shell.core.annotation.CliAvailabilityIndicator;
diff --git a/extras/shell/src/main/java/org/apache/rya/shell/util/StreamsQueryFormatter.java b/extras/shell/src/main/java/org/apache/rya/shell/util/StreamsQueryFormatter.java
index babeec8..646ca7c 100644
--- a/extras/shell/src/main/java/org/apache/rya/shell/util/StreamsQueryFormatter.java
+++ b/extras/shell/src/main/java/org/apache/rya/shell/util/StreamsQueryFormatter.java
@@ -24,9 +24,9 @@
 import java.util.List;
 
 import org.apache.rya.streams.api.entity.StreamsQuery;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-import org.openrdf.queryrender.sparql.SPARQLQueryRenderer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.queryrender.sparql.SPARQLQueryRenderer;
 
 import com.google.common.collect.Lists;
 
diff --git a/extras/shell/src/test/java/org/apache/rya/shell/RyaCommandsTest.java b/extras/shell/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
index d08b0bd..ced94f3 100644
--- a/extras/shell/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
+++ b/extras/shell/src/test/java/org/apache/rya/shell/RyaCommandsTest.java
@@ -17,6 +17,7 @@
  * under the License.
  */
 package org.apache.rya.shell;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
@@ -37,9 +38,9 @@
 import org.apache.rya.api.client.accumulo.AccumuloConnectionDetails;
 import org.apache.rya.shell.util.ConsolePrinter;
 import org.apache.rya.shell.util.SparqlPrompt;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.rio.RDFFormat;
 import org.junit.Test;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.rio.RDFFormat;
 
 import com.google.common.base.Optional;
 
diff --git a/extras/vagrantExample/src/main/vagrant/Vagrantfile b/extras/vagrantExample/src/main/vagrant/Vagrantfile
index e3f2a73..6b81abe 100644
--- a/extras/vagrantExample/src/main/vagrant/Vagrantfile
+++ b/extras/vagrantExample/src/main/vagrant/Vagrantfile
@@ -20,7 +20,7 @@
 
 #
 # Builds a single node Rya on Accumulo on Hadoop and Zookeeper.
-# Deploys Rya, and the Sesame openrdf-workbench on Tomcat accessable from the host's browser.
+# Deploys Rya, and the Eclipse rdf4j-workbench on Tomcat accessible from the host's browser.
 # See the accompanying readme for URL's, verification, and troubleshooting.
 #
 # Note: Machine's ip is 192.168.33.10
@@ -52,8 +52,8 @@
     export ACCUMULO_VERSION=1.6.5
     ###export ACCUMULO_VERSION=1.7.1
     export HADOOP_VERSION=2.7.2
-    export RYA_EXAMPLE_VERSION=3.2.10-SNAPSHOT
-    export SESAME_VERSION=2.7.6
+    export RYA_EXAMPLE_VERSION=3.2.13-SNAPSHOT
+    export RDF4J_VERSION=2.3.1
     export ZOOKEEPER_VERSION=3.4.5-cdh4.5.0
     
     echo "Updating host file with permanent ip"
@@ -288,25 +288,25 @@
 
     echo 'Done!'
 
-	echo "Installing Sesame Server"
-	# creating log dir sesame-http-server-${SESAME_VERSION}
-	sudo mkdir --parents /usr/share/tomcat7/.aduna 
+	echo "Installing RDF4J Server"
+	# creating log dir rdf4j-http-server-${RDF4J_VERSION}
+	sudo mkdir --parents /usr/share/tomcat7/.RDF4J 
 	sudo chown -R tomcat7:tomcat7 /usr/share/tomcat7  
-    sudo ln --force -s /usr/share/tomcat7/.aduna/openrdf-sesame/logs /var/log/tomcat7/openrdf-sesame
-	sesamewar=/var/lib/tomcat7/webapps/openrdf-sesame.war
-	if [[ ! -s $sesamewar ]] ; then 
+    sudo ln --force -s /usr/share/tomcat7/.RDF4J/Server/logs /var/log/tomcat7/rdf4j-server
+	rdf4jwar=/var/lib/tomcat7/webapps/rdf4j-server.war
+	if [[ ! -s $rdf4jwar ]] ; then 
 		echo "Downloading"
-		download --output $sesamewar http://repo1.maven.org/maven2/org/openrdf/sesame/sesame-http-server/${SESAME_VERSION}/sesame-http-server-${SESAME_VERSION}.war || exit 110
+		download --output $rdf4jwar http://repo1.maven.org/maven2/org/eclipse/rdf4j/rdf4j-http-server/${RDF4J_VERSION}/rdf4j-http-server-${RDF4J_VERSION}.war || exit 110
 	fi
-	echo "Sesame http server deployed at http://rya-example-box:8080/openrdf-sesame"
+	echo "RDF4J http server deployed at http://rya-example-box:8080/rdf4j-server"
 	
-	echo "Installing Sesame Workbench"
-	workbench=/var/lib/tomcat7/webapps/openrdf-workbench.war
+	echo "Installing RDF4J Workbench"
+	workbench=/var/lib/tomcat7/webapps/rdf4j-workbench.war
 	if [[ ! -s $workbench ]] ; then 
 		echo "Downloading"
-		download --output $workbench http://repo1.maven.org/maven2/org/openrdf/sesame/sesame-http-workbench/${SESAME_VERSION}/sesame-http-workbench-${SESAME_VERSION}.war || exit 111
+		download --output $workbench http://repo1.maven.org/maven2/org/eclipse/rdf4j/rdf4j-http-workbench/${RDF4J_VERSION}/rdf4j-http-workbench-${RDF4J_VERSION}.war || exit 111
 	fi
-	echo "Sesame workbench deployed at http://rya-example-box:8080/openrdf-workbench"
+	echo "RDF4J workbench deployed at http://rya-example-box:8080/rdf4j-workbench"
 
 	echo "Installing Rya"
 	ryaIndexing=rya.indexing.example-${RYA_EXAMPLE_VERSION}-distribution
@@ -319,23 +319,23 @@
 	sudo unzip -q -o ${ryaIndexing}.zip -d ${ryaIndexing}
 	
     # before continueing, wait for tomcat to deploy wars:
-    waitForDeploy /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/
-    waitForDeploy /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/
+    waitForDeploy /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/
+    waitForDeploy /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/
 
 	# soft linking the files doesn't seem to work in tomcat, so we copy them instead :(
-	sudo cp ${ryaIndexing}/dist/lib/* /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/ || exit 113
-	sudo cp ${ryaIndexing}/dist/lib/* /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/    || exit 114
+	sudo cp ${ryaIndexing}/dist/lib/* /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/ || exit 113
+	sudo cp ${ryaIndexing}/dist/lib/* /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/    || exit 114
 
 	# These are older libs that breaks tomcat 7
-	sudo rm --force /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/servlet-api-2.5.jar
-	sudo rm --force /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/jsp-api-2.1.jar
-	sudo rm --force /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/servlet-api-2.5.jar
-	sudo rm --force /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/jsp-api-2.1.jar
+	sudo rm --force /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/servlet-api-2.5.jar
+	sudo rm --force /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/jsp-api-2.1.jar
+	sudo rm --force /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/servlet-api-2.5.jar
+	sudo rm --force /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/jsp-api-2.1.jar
 	
-	sudo chown -R tomcat7:tomcat7 /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/
-	sudo chown -R tomcat7:tomcat7 /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/
+	sudo chown -R tomcat7:tomcat7 /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/
+	sudo chown -R tomcat7:tomcat7 /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/
 
-	echo "Downloading and installing new templates for OpenRdf WorkBench"
+	echo "Downloading and installing new templates for RDF4J WorkBench"
 	ryaVagrant=rya.vagrant.example-${RYA_EXAMPLE_VERSION}
 	if [[ ! -s ${ryaVagrant}.jar ]] ; then
 		echo "Downloading"
@@ -343,8 +343,8 @@
 	fi
 	sudo mkdir --parents ${ryaVagrant}
 	sudo unzip -q -o ${ryaVagrant}.jar -d ${ryaVagrant}
-	sudo cp ${ryaVagrant}/*.xsl /var/lib/tomcat7/webapps/openrdf-workbench/transformations/
-    sudo chown tomcat7:tomcat7 /var/lib/tomcat7/webapps/openrdf-workbench/transformations/*
+	sudo cp ${ryaVagrant}/*.xsl /var/lib/tomcat7/webapps/rdf4j-workbench/transformations/
+    sudo chown tomcat7:tomcat7 /var/lib/tomcat7/webapps/rdf4j-workbench/transformations/*
 	
 	echo "Deploying Rya Web"
 	ryaWar=web.rya-${RYA_EXAMPLE_VERSION}.war
diff --git a/extras/vagrantExample/src/main/vagrant/readme.md b/extras/vagrantExample/src/main/vagrant/readme.md
index 235d28d..dcfcf8d 100644
--- a/extras/vagrantExample/src/main/vagrant/readme.md
+++ b/extras/vagrantExample/src/main/vagrant/readme.md
@@ -21,7 +21,7 @@
 
 # Rya Vagrant Example Documentation
 
-The Rya Vagrant Example project allows users to quickly get up and running on Rya using a Virtual Machine.  Specifically, this project uses Vagrant to create a VM, install Rya on Accumulo, and configure the OpenRDF Workbench Web Application to use Rya. 
+The Rya Vagrant Example project allows users to quickly get up and running on Rya using a Virtual Machine.  Specifically, this project uses Vagrant to create a VM, install Rya on Accumulo, and configure the RDF4J Workbench Web Application to use Rya. 
 
 ## Setting up the VM
 
@@ -49,9 +49,9 @@
 
 1. **Verify the Tomcat instance**:  Open a browser to <http://rya-example-box:8080/>.  You should see a webpage that says “It works!  If you're seeing this page via a web browser, it means you've setup Tomcat successfully. Congratulations!
 
-1. **Verify the deployed OpenRDF Sesame service**: Open your browser to <http://rya-example-box:8080/openrdf-sesame/protocol> and you should see a `6` (this is the OpenRDF Protocol Version).
+1. **Verify the deployed RDF4J Server service**: Open your browser to <http://rya-example-box:8080/rdf4j-server/protocol> and you should see a `6` (this is the RDF4J Protocol Version).
 
-1. **Verify the deployed OpenRDF Workbench**: Open your browser to <http://rya-example-box:8080/openrdf-workbench>
+1. **Verify the deployed RDF4J Workbench**: Open your browser to <http://rya-example-box:8080/rdf4j-workbench>
 
 1. **Verify the deployed Rya Web**: Open your browser to <http://rya-example-box:8080/web.rya/sparqlQuery.jsp>
  
@@ -74,15 +74,15 @@
 Run these two commands and see if you have any Rya files in the two lib directories:
 
 ```
-    ls /var/lib/tomcat7/webapps/openrdf-sesame/WEB-INF/lib/rya*
-    ls /var/lib/tomcat7/webapps/openrdf-workbench/WEB-INF/lib/rya* 
+    ls /var/lib/tomcat7/webapps/rdf4j-server/WEB-INF/lib/rya*
+    ls /var/lib/tomcat7/webapps/rdf4j-workbench/WEB-INF/lib/rya* 
 ```
 
 If these files do note exists, open the vagrant file and look for the line `echo "Downloading Rya"`. Try working through those commands manually on your Vagrant VM.
 
-#### OpenRDF Workbench transformations are not installed
+#### RDF4J Workbench transformations are not installed
 
-OpenRDF Workbench requires a set of "transformations" for listing Rya in the OpenRDF Workbench Repository list. The transforms are in this directory: /var/lib/tomcat7/webapps/openrdf-workbench/transformations/
+RDF4J Workbench requires a set of "transformations" for listing Rya in the RDF4J Workbench Repository list. The transforms are in this directory: /var/lib/tomcat7/webapps/rdf4j-workbench/transformations/
 
 1. Verify that this file exists: create-RyaAccumuloSail.xsl
 1. Verify that create.xsl has been updated for rya.  (run: "cat create.xsl | grep Rya" and make sure there's some stuff there.)
@@ -183,30 +183,30 @@
     
 ## Interacting with Rya on the VM
 
-### Connecting to Rya via OpenRDF Workbench
+### Connecting to Rya via RDF4J Workbench
 
-The first step to using Rya via the OpenRDF Workbench is to create a repository using the Rya Accumulo Store connector.
+The first step to using Rya via the RDF4J Workbench is to create a repository using the Rya Accumulo Store connector.
 
-1. Open your browser to the [OpenRDF Workbench](http://rya-example-box:8080/openrdf-workbench)
+1. Open your browser to the [RDF4j Workbench](http://rya-example-box:8080/rdf4j-workbench)
 2. Click on `New Repository`
 3. Choose "Type" of `Rya Accumulo Store`, a Repository "ID" (e.g., `RyaAccumulo`), and a Repository "Title" (e.g., `Rya Accumulo`).  Click on `Next` when complete.
 4. Enter the Rya Accumulo Store connection parameters.  The default parameters will connect to the Rya Example Box Acccumulo deployment (i.e., Accumulo User: `root`, Accumulo Password: `root`, Accumulo Instance: `dev`, Zookeepers: `localhost`, is Mock?: `false`).  Click on `Create` when complete.
 
-### Uploading Data via OpenRDF Workbench
+### Uploading Data via RDF4J Workbench
 
-Once we've created a Rya repository, we can load data into Rya via the OpenRDF Workbench.
+Once we've created a Rya repository, we can load data into Rya via the RDF4J Workbench.
 
-1.  Open your browser to the [OpenRDF Workbench](http://rya-example-box:8080/openrdf-workbench)
-1. Verify that OpenRDF Workbench is connected to Rya.  The OpenRDF Workbench screen should have `Current Selections: Repository:	Rya Accumulo ( RyaAccumulo )` at the top of the page.	
+1.  Open your browser to the [RDF4J Workbench](http://rya-example-box:8080/rdf4j-workbench)
+1. Verify that RDF4J Workbench is connected to Rya.  The RDF4j Workbench screen should have `Current Selections: Repository:	Rya Accumulo ( RyaAccumulo )` at the top of the page.	
 2. Click on `Add` on the left side of the page.
 3. This page allows a user to add data either through a local file (uploaded through the browser), cut-and-pasted RDF, or a file located on the web.  For this example, let's choose a file on the web.  Set "Data Format" to `RDF/XML` and "Location of the RDF data you wish to upload" to `http://telegraphis.net/data/currencies/currencies.rdf`.  All other fields should remain empty.  Click on `Upload` when complete.
 
-### Querying Data via OpenRDF Workbench
+### Querying Data via RDF4J Workbench
 
-Once we've created a Rya repository and uploaded data, we can query Rya via the OpenRDF Workbench.
+Once we've created a Rya repository and uploaded data, we can query Rya via the RDF4J Workbench.
 
-1. Open your browser to the [OpenRDF Workbench](http://rya-example-box:8080/openrdf-workbench)
-1. Verify that OpenRDF Workbench is connected to Rya.  The OpenRDF Workbench screen should have `Current Selections: Repository:	Rya Accumulo ( RyaAccumulo )` at the top of the page.	
+1. Open your browser to the [RDF4J Workbench](http://rya-example-box:8080/rdf4j-workbench)
+1. Verify that RDF4J Workbench is connected to Rya.  The RDF4J Workbench screen should have `Current Selections: Repository:	Rya Accumulo ( RyaAccumulo )` at the top of the page.	
 1. Click on `Query` on the left side of the page.
 1. Use the example SPARQL query below to query for Currencies with a Short Name of "dollar"
 
@@ -220,9 +220,10 @@
     }
     ```
 
-### Using the OpenRDF REST Service
+### Using the RDF4J REST Service
 
-More information about the Sesame REST HTTP Protocol is availible in the [OpenRDF 2.7 Docs] (http://rdf4j.org/sesame/2.7/docs/system.docbook?view#The_Sesame_REST_HTTP_Protocol)
+More information about the RDF4J REST HTTP Protocol is availible in the [RDF4J 2.3.1 Docs] 
+(http://docs.rdf4j.org/rest-api/)
 
 ### Using Rya Java Client
 TODO
diff --git a/mapreduce/pom.xml b/mapreduce/pom.xml
index 98b4200..dc3cec4 100644
--- a/mapreduce/pom.xml
+++ b/mapreduce/pom.xml
@@ -60,16 +60,16 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-nquads</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-nquads</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/AbstractAccumuloMRTool.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/AbstractAccumuloMRTool.java
index 0e7cbc6..7489391 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/AbstractAccumuloMRTool.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/AbstractAccumuloMRTool.java
@@ -19,13 +19,6 @@
  * under the License.
  */
 
-import org.apache.rya.accumulo.AccumuloRdfConstants;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
-import org.apache.rya.api.RdfCloudTripleStoreUtils;
-import org.apache.rya.indexing.accumulo.ConfigUtils;
-
 import java.io.IOException;
 
 import org.apache.accumulo.core.client.AccumuloException;
@@ -45,7 +38,13 @@
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.util.Tool;
-import org.openrdf.rio.RDFFormat;
+import org.apache.rya.accumulo.AccumuloRdfConstants;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConstants;
+import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.api.RdfCloudTripleStoreUtils;
+import org.apache.rya.indexing.accumulo.ConfigUtils;
+import org.eclipse.rdf4j.rio.RDFFormat;
 
 import com.google.common.base.Preconditions;
 
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/MRUtils.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/MRUtils.java
index e985563..f826b71 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/MRUtils.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/MRUtils.java
@@ -1,5 +1,3 @@
-package org.apache.rya.accumulo.mr;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,6 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr;
 
 import org.apache.accumulo.core.client.Instance;
 import org.apache.accumulo.core.client.mapreduce.InputFormatBase;
@@ -27,11 +26,11 @@
 import org.apache.hadoop.mapreduce.JobContext;
 import org.apache.hadoop.mapreduce.RecordReader;
 import org.apache.hadoop.mapreduce.TaskAttemptContext;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.rio.RDFFormat;
-
 import org.apache.rya.api.RdfCloudTripleStoreConstants.TABLE_LAYOUT;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.rio.RDFFormat;
 
 /**
  * Contains constants and static methods for interacting with a
@@ -114,7 +113,7 @@
 
     public static final String AC_TABLE_PROP = "ac.table";
     public static final String HADOOP_IO_SORT_MB = "io.sort.mb";
-    public static final ValueFactory vf = new ValueFactoryImpl();
+    public static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     /**
      * Gets the TTL from a given Configuration.
@@ -200,7 +199,7 @@
      * @return  The configured RDFFormat, or null if not set.
      */
     public static RDFFormat getRDFFormat(Configuration conf) {
-        return RDFFormat.valueOf(conf.get(FORMAT_PROP));
+        return RdfFormatUtils.getRdfFormatFromName(conf.get(FORMAT_PROP));
     }
 
     /**
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RdfFileInputFormat.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RdfFileInputFormat.java
index 27e38f2..84e0210 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RdfFileInputFormat.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RdfFileInputFormat.java
@@ -38,17 +38,18 @@
 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 import org.apache.hadoop.mapreduce.lib.input.KeyValueLineRecordReader;
 import org.apache.log4j.Logger;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandler;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.rio.RDFParser;
-import org.openrdf.rio.Rio;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaTripleContext;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandler;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.rio.RDFParser;
+import org.eclipse.rdf4j.rio.Rio;
 
 /**
  * {@link FileInputFormat} that can read multiple RDF files and convert into
@@ -124,7 +125,7 @@
 
     private RDFFormat getRDFFormat(JobContext context) {
         String name = context.getConfiguration().get(FORMAT_PROP);
-        return RDFFormat.valueOf(name);
+        return RdfFormatUtils.getRdfFormatFromName(name);
     }
 
     /**
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaOutputFormat.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaOutputFormat.java
index 0d42df2..0dd08b1 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaOutputFormat.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaOutputFormat.java
@@ -62,8 +62,8 @@
 import org.apache.rya.indexing.accumulo.entity.EntityCentricIndex;
 import org.apache.rya.indexing.accumulo.freetext.AccumuloFreeTextIndexer;
 import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
-import org.openrdf.model.Statement;
-import org.openrdf.model.vocabulary.XMLSchema;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 
 /**
  * {@link OutputFormat} that uses Rya, the {@link GeoIndexer}, the
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaTypeWritable.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaTypeWritable.java
index ec47d82..be90180 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaTypeWritable.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/RyaTypeWritable.java
@@ -23,11 +23,10 @@
 import java.io.DataOutput;
 import java.io.IOException;
 
-import org.apache.rya.api.domain.RyaType;
-
 import org.apache.hadoop.io.WritableComparable;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.apache.rya.api.domain.RyaType;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 public class RyaTypeWritable implements WritableComparable<RyaTypeWritable>{
 
@@ -52,10 +51,10 @@
 
     @Override
     public void readFields(DataInput dataInput) throws IOException {
-        ValueFactoryImpl vfi = new ValueFactoryImpl();
+        SimpleValueFactory vfi = SimpleValueFactory.getInstance();
         String data = dataInput.readLine();
         String dataTypeString = dataInput.readLine();
-        URI dataType = vfi.createURI(dataTypeString);
+        IRI dataType = vfi.createIRI(dataTypeString);
         ryatype.setData(data);
         ryatype.setDataType(dataType);
     }
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/examples/TextOutputExample.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/examples/TextOutputExample.java
index ab42aab..593e568 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/examples/TextOutputExample.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/examples/TextOutputExample.java
@@ -1,7 +1,3 @@
-package org.apache.rya.accumulo.mr.examples;
-
-import java.io.BufferedReader;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -20,7 +16,9 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr.examples;
 
+import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.nio.charset.Charset;
@@ -51,11 +49,11 @@
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
-import org.openrdf.model.Statement;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFWriter;
-import org.openrdf.rio.Rio;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFWriter;
+import org.eclipse.rdf4j.rio.Rio;
 
 /**
  * Example of using a MapReduce tool to get triples from a Rya instance and serialize them to a text file as RDF.
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountTool.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountTool.java
index 5adb893..c2ad57a 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountTool.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountTool.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Date;
@@ -49,8 +47,8 @@
 import org.apache.rya.api.resolver.RyaTripleContext;
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.api.resolver.triple.TripleRowResolverException;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 
 import com.google.common.collect.Lists;
 import com.google.common.io.ByteArrayDataInput;
@@ -130,7 +128,7 @@
         public static final byte[] EMPTY_BYTES = new byte[0];
         private RdfCloudTripleStoreConstants.TABLE_LAYOUT tableLayout = RdfCloudTripleStoreConstants.TABLE_LAYOUT.OSP;
 
-        ValueFactoryImpl vf = new ValueFactoryImpl();
+        SimpleValueFactory vf = SimpleValueFactory.getInstance();
 
         private final Text keyOut = new Text();
         private final LongWritable valOut = new LongWritable(1);
@@ -213,7 +211,7 @@
         Text row = new Text();
         Text cat_txt = new Text();
         Value v_out = new Value();
-        ValueFactory vf = new ValueFactoryImpl();
+        ValueFactory vf = SimpleValueFactory.getInstance();
 
         // any count lower than this does not need to be saved
         public static final int TOO_LOW = 10;
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/RdfFileInputTool.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/RdfFileInputTool.java
index 55c4365..c004f4e 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/RdfFileInputTool.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/RdfFileInputTool.java
@@ -25,10 +25,9 @@
 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
-import org.openrdf.rio.RDFFormat;
-
 import org.apache.rya.accumulo.mr.AbstractAccumuloMRTool;
 import org.apache.rya.accumulo.mr.MRUtils;
+import org.eclipse.rdf4j.rio.RDFFormat;
 
 /**
  * Reads RDF data from one or more file(s) and inserts statements into Rya.
diff --git a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/Upgrade322Tool.java b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/Upgrade322Tool.java
index 4edc949..e271e27 100644
--- a/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/Upgrade322Tool.java
+++ b/mapreduce/src/main/java/org/apache/rya/accumulo/mr/tools/Upgrade322Tool.java
@@ -1,5 +1,3 @@
-package org.apache.rya.accumulo.mr.tools;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,11 +16,17 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr.tools;
 
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.DELIM;
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.TBL_OSP_SUFFIX;
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.TBL_PO_SUFFIX;
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.TBL_PRFX_DEF;
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.TBL_SPO_SUFFIX;
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.TYPE_DELIM;
 
-
-import org.apache.rya.accumulo.mr.AbstractAccumuloMRTool;
-import org.apache.rya.accumulo.mr.MRUtils;
+import java.io.IOException;
+import java.util.Date;
 
 import org.apache.accumulo.core.client.IteratorSetting;
 import org.apache.accumulo.core.client.mapreduce.AccumuloInputFormat;
@@ -37,14 +41,11 @@
 import org.apache.hadoop.mapreduce.Reducer;
 import org.apache.hadoop.util.Tool;
 import org.apache.hadoop.util.ToolRunner;
+import org.apache.rya.accumulo.mr.AbstractAccumuloMRTool;
+import org.apache.rya.accumulo.mr.MRUtils;
 import org.calrissian.mango.types.LexiTypeEncoders;
 import org.calrissian.mango.types.TypeEncoder;
 
-import java.io.IOException;
-import java.util.Date;
-
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.*;
-
 /**
  */
 public class Upgrade322Tool extends AbstractAccumuloMRTool implements Tool {
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RdfFileInputFormatTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RdfFileInputFormatTest.java
index c3bbbba..6129d6c 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RdfFileInputFormatTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RdfFileInputFormatTest.java
@@ -1,32 +1,3 @@
-package org.apache.rya.accumulo.mr;
-
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.apache.hadoop.mapreduce.InputSplit;
-import org.apache.hadoop.mapreduce.Job;
-import org.apache.hadoop.mapreduce.TaskAttemptContext;
-import org.apache.hadoop.mapreduce.TaskAttemptID;
-import org.apache.hadoop.mapreduce.lib.input.FileSplit;
-import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.LiteralImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.rio.RDFFormat;
-
-import org.apache.rya.api.resolver.RyaToRdfConversions;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -45,8 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.FileSystem;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.mapreduce.InputSplit;
+import org.apache.hadoop.mapreduce.Job;
+import org.apache.hadoop.mapreduce.TaskAttemptContext;
+import org.apache.hadoop.mapreduce.TaskAttemptID;
+import org.apache.hadoop.mapreduce.lib.input.FileSplit;
+import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;
+import org.apache.rya.api.resolver.RyaToRdfConversions;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 public class RdfFileInputFormatTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+
     static String NT_INPUT = "src/test/resources/test.ntriples";
     static String TRIG_INPUT = "src/test/resources/namedgraphs.trig";
 
@@ -81,17 +79,17 @@
         RdfFileInputFormat.setRDFFormat(job, RDFFormat.NTRIPLES);
         init(NT_INPUT);
         String prefix = "urn:lubm:rdfts#";
-        URI[] gs = {
-                new URIImpl(prefix + "GraduateStudent01"),
-                new URIImpl(prefix + "GraduateStudent02"),
-                new URIImpl(prefix + "GraduateStudent03"),
-                new URIImpl(prefix + "GraduateStudent04")
+        IRI[] gs = {
+                VF.createIRI(prefix + "GraduateStudent01"),
+                VF.createIRI(prefix + "GraduateStudent02"),
+                VF.createIRI(prefix + "GraduateStudent03"),
+                VF.createIRI(prefix + "GraduateStudent04")
         };
-        URI hasFriend = new URIImpl(prefix + "hasFriend");
+        IRI hasFriend = VF.createIRI(prefix + "hasFriend");
         Statement[] statements = {
-                new StatementImpl(gs[0], hasFriend, gs[1]),
-                new StatementImpl(gs[1], hasFriend, gs[2]),
-                new StatementImpl(gs[2], hasFriend, gs[3])
+                VF.createStatement(gs[0], hasFriend, gs[1]),
+                VF.createStatement(gs[1], hasFriend, gs[2]),
+                VF.createStatement(gs[2], hasFriend, gs[3])
         };
         int count = 0;
         while (reader.nextKeyValue()) {
@@ -109,11 +107,11 @@
         init(TRIG_INPUT);
         Assert.assertTrue(reader.nextKeyValue());
         Assert.assertEquals(1, reader.getCurrentKey().get());
-        Statement expected = new ContextStatementImpl(
-            new URIImpl("http://www.example.org/exampleDocument#Monica"),
-            new URIImpl("http://www.example.org/vocabulary#name"),
-            new LiteralImpl("Monica Murphy"),
-            new URIImpl("http://www.example.org/exampleDocument#G1"));
+        Statement expected = VF.createStatement(
+            VF.createIRI("http://www.example.org/exampleDocument#Monica"),
+            VF.createIRI("http://www.example.org/vocabulary#name"),
+            VF.createLiteral("Monica Murphy"),
+            VF.createIRI("http://www.example.org/exampleDocument#G1"));
         Statement actual = RyaToRdfConversions.convertStatement(
             reader.getCurrentValue().getRyaStatement());
         Assert.assertEquals(expected, actual);
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaOutputFormatTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaOutputFormatTest.java
index 96f57f6..e0a7ac0 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaOutputFormatTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaOutputFormatTest.java
@@ -36,15 +36,14 @@
 import org.apache.rya.indexing.accumulo.freetext.SimpleTokenizer;
 import org.apache.rya.indexing.accumulo.freetext.Tokenizer;
 import org.apache.rya.indexing.accumulo.temporal.AccumuloTemporalIndexer;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.Statement;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.XMLSchema;
-
-import info.aduna.iteration.CloseableIteration;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
@@ -224,7 +223,7 @@
         RyaOutputFormat.setFreeTextEnabled(job, false);
         RyaOutputFormat.setTemporalEnabled(job, true);
         RyaOutputFormat.setEntityEnabled(job, false);
-        final ValueFactory vf = new ValueFactoryImpl();
+        final ValueFactory vf = SimpleValueFactory.getInstance();
         for (int i = 0; i < instants.length; i++) {
             final RyaType time = RdfToRyaConversions.convertLiteral(vf.createLiteral(instants[i].toString()));
             final RyaStatement input = RyaStatement.builder()
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaStatementWritableTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaStatementWritableTest.java
index 29639c2..98d36c9 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaStatementWritableTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/RyaStatementWritableTest.java
@@ -5,17 +5,16 @@
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.openrdf.model.vocabulary.XMLSchema;
-import org.junit.Assert;
-import org.junit.Rule;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.resolver.RyaTripleContext;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+import org.junit.Assert;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
 
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountToolTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountToolTest.java
index 9b7fa22..30c6a7a 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountToolTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/AccumuloRdfCountToolTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya.accumulo.mr.tools;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,16 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr.tools;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
+import java.util.HashMap;
+import java.util.Map;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.accumulo.mr.tools.AccumuloRdfCountTool;
-import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaURI;
-import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Scanner;
@@ -40,18 +36,17 @@
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.TablePermission;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreConstants;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaURI;
+import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 /**
  * Created by IntelliJ IDEA.
@@ -70,7 +65,7 @@
     private Connector connector;
 
     private AccumuloRyaDAO dao;
-    private ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
     static String litdupsNS = "urn:test:litdups#";
 
@@ -110,19 +105,19 @@
 
     @Test
     public void testMR() throws Exception {
-        RyaURI test1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "test1"));
-        RyaURI pred1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "pred1"));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(0))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(1))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(2))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(3))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(4))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(5))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(6))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(7))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(8))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(9))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(10))));
+        RyaURI test1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "test1"));
+        RyaURI pred1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "pred1"));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(0))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(1))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(2))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(3))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(4))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(5))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(6))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(7))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(8))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(9))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(10))));
 
         AccumuloRdfCountTool.main(new String[]{
                 "-Dac.mock=true",
@@ -155,19 +150,19 @@
     }
 
 //    public void testMRObject() throws Exception {
-//        URI pred1 = vf.createURI(litdupsNS, "pred1");
-//        Literal literal = vf.createLiteral(0);
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test0"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test1"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test2"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test3"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test4"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test5"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test6"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test7"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test8"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test9"), pred1, literal));
-//        dao.add(new StatementImpl(vf.createURI(litdupsNS, "test10"), pred1, literal));
+//        URI pred1 = VF.createIRI(litdupsNS, "pred1");
+//        Literal literal = VF.createLiteral(0);
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test0"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test1"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test2"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test3"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test4"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test5"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test6"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test7"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test8"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test9"), pred1, literal));
+//        dao.add(new StatementImpl(VF.createIRI(litdupsNS, "test10"), pred1, literal));
 //        dao.commit();
 //
 //        AccumuloRdfCountTool.main(new String[]{
@@ -202,19 +197,19 @@
 
     @Test
     public void testTTL() throws Exception {
-        RyaURI test1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "test1"));
-        RyaURI pred1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "pred1"));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(0))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(1))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(2))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(3))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(4))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(5))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(6))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(7))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(8))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(9))));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(10))));
+        RyaURI test1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "test1"));
+        RyaURI pred1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "pred1"));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(0))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(1))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(2))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(3))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(4))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(5))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(6))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(7))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(8))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(9))));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(10))));
 
         AccumuloRdfCountTool.main(new String[]{
                 "-Dac.mock=true",
@@ -236,20 +231,20 @@
 
     @Test
     public void testContext() throws Exception {
-        RyaURI test1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "test1"));
-        RyaURI pred1 = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "pred1"));
-        RyaURI cntxt = RdfToRyaConversions.convertURI(vf.createURI(litdupsNS, "cntxt"));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(0)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(1)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(2)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(3)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(4)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(5)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(6)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(7)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(8)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(9)), cntxt));
-        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(vf.createLiteral(10)), cntxt));
+        RyaURI test1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "test1"));
+        RyaURI pred1 = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "pred1"));
+        RyaURI cntxt = RdfToRyaConversions.convertURI(VF.createIRI(litdupsNS, "cntxt"));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(0)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(1)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(2)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(3)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(4)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(5)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(6)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(7)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(8)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(9)), cntxt));
+        dao.add(new RyaStatement(test1, pred1, RdfToRyaConversions.convertLiteral(VF.createLiteral(10)), cntxt));
 
         AccumuloRdfCountTool.main(new String[]{
                 "-Dac.mock=true",
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/RdfFileInputToolTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/RdfFileInputToolTest.java
index 6b41ca2..b8b2384 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/RdfFileInputToolTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/RdfFileInputToolTest.java
@@ -19,23 +19,21 @@
  * under the License.
  */
 
+import junit.framework.TestCase;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.admin.SecurityOperations;
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.TablePermission;
-import org.junit.Test;
-import org.openrdf.rio.RDFFormat;
-
-import junit.framework.TestCase;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.mr.TestUtils;
-import org.apache.rya.accumulo.mr.tools.RdfFileInputTool;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.junit.Test;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/Upgrade322ToolTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/Upgrade322ToolTest.java
index f740cc0..cfdbeb7 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/Upgrade322ToolTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/Upgrade322ToolTest.java
@@ -1,23 +1,3 @@
-package org.apache.rya.accumulo.mr.tools;
-
-import java.util.Map;
-
-import org.apache.accumulo.core.Constants;
-import org.apache.accumulo.core.client.BatchWriter;
-import org.apache.accumulo.core.client.BatchWriterConfig;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.Scanner;
-import org.apache.accumulo.core.client.TableNotFoundException;
-import org.apache.accumulo.core.client.admin.SecurityOperations;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.apache.accumulo.core.data.Key;
-import org.apache.accumulo.core.data.Mutation;
-import org.apache.accumulo.core.data.Range;
-import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.security.Authorizations;
-import org.apache.accumulo.core.security.TablePermission;
-import org.openrdf.model.vocabulary.XMLSchema;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -36,19 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.accumulo.mr.tools;
 
+import java.util.Map;
 
-
-import junit.framework.TestCase;
+import org.apache.accumulo.core.Constants;
+import org.apache.accumulo.core.client.BatchWriter;
+import org.apache.accumulo.core.client.BatchWriterConfig;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.Scanner;
+import org.apache.accumulo.core.client.TableNotFoundException;
+import org.apache.accumulo.core.client.admin.SecurityOperations;
+import org.apache.accumulo.core.client.mock.MockInstance;
+import org.apache.accumulo.core.data.Key;
+import org.apache.accumulo.core.data.Mutation;
+import org.apache.accumulo.core.data.Range;
+import org.apache.accumulo.core.data.Value;
+import org.apache.accumulo.core.security.Authorizations;
+import org.apache.accumulo.core.security.TablePermission;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.accumulo.mr.TestUtils;
-import org.apache.rya.accumulo.mr.tools.Upgrade322Tool;
 import org.apache.rya.accumulo.query.AccumuloRyaQueryEngine;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
+import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
+
+import junit.framework.TestCase;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/UpgradeObjectSerializationTest.java b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/UpgradeObjectSerializationTest.java
index f7096e3..b14587c 100644
--- a/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/UpgradeObjectSerializationTest.java
+++ b/mapreduce/src/test/java/org/apache/rya/accumulo/mr/tools/UpgradeObjectSerializationTest.java
@@ -19,14 +19,18 @@
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
 
+import org.apache.rya.accumulo.mr.tools.Upgrade322Tool.UpgradeObjectSerialization;
 
-import org.apache.rya.api.resolver.impl.*;
+import org.apache.rya.api.resolver.impl.BooleanRyaTypeResolver;
+import org.apache.rya.api.resolver.impl.ByteRyaTypeResolver;
+import org.apache.rya.api.resolver.impl.DateTimeRyaTypeResolver;
+import org.apache.rya.api.resolver.impl.DoubleRyaTypeResolver;
+import org.apache.rya.api.resolver.impl.IntegerRyaTypeResolver;
+import org.apache.rya.api.resolver.impl.LongRyaTypeResolver;
 import org.junit.Test;
 
-import static org.apache.rya.accumulo.mr.tools.Upgrade322Tool.UpgradeObjectSerialization;
-import static org.junit.Assert.*;
-
 public class UpgradeObjectSerializationTest {
 
     @Test
diff --git a/osgi/alx.rya.console/pom.xml b/osgi/alx.rya.console/pom.xml
index 72ee63a..e078e0d 100644
--- a/osgi/alx.rya.console/pom.xml
+++ b/osgi/alx.rya.console/pom.xml
@@ -39,8 +39,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-repository-api</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-repository-api</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.karaf.shell</groupId>
diff --git a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/AbstractRyaCommand.java b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/AbstractRyaCommand.java
index 0d3ac97..c4c4705 100644
--- a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/AbstractRyaCommand.java
+++ b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/AbstractRyaCommand.java
@@ -19,11 +19,9 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.persist.RyaDAO;
 import org.apache.karaf.shell.console.OsgiCommandSupport;
-import org.openrdf.repository.Repository;
+import org.apache.rya.api.persist.RyaDAO;
+import org.eclipse.rdf4j.repository.Repository;
 import org.osgi.util.tracker.ServiceTracker;
 
 public abstract class AbstractRyaCommand extends OsgiCommandSupport {
diff --git a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/GetStatementsRyaCommand.java b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/GetStatementsRyaCommand.java
index 408f700..96017c7 100644
--- a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/GetStatementsRyaCommand.java
+++ b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/GetStatementsRyaCommand.java
@@ -19,17 +19,15 @@
  * under the License.
  */
 
-
-
 import org.apache.felix.gogo.commands.Command;
 import org.apache.felix.gogo.commands.Option;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryResult;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryResult;
 
-import static org.apache.rya.api.RdfCloudTripleStoreUtils.*;
+import static org.apache.rya.api.RdfCloudTripleStoreUtils.createValue;
 
 /**
  * Date: 5/16/12
@@ -62,7 +60,7 @@
             connection = repository.getConnection();
             RepositoryResult<Statement> statements = connection.getStatements(
                     (subject != null) ? (Resource) createValue(subject) : null,
-                    (predicate != null) ? (URI) createValue(predicate) : null,
+                    (predicate != null) ? (IRI) createValue(predicate) : null,
                     (object != null) ? createValue(object) : null,
                     false,
                     (context != null) ? new Resource[]{(Resource) createValue(context)} : new Resource[0]);
diff --git a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/InfoRyaCommand.java b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/InfoRyaCommand.java
index 37be971..1712050 100644
--- a/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/InfoRyaCommand.java
+++ b/osgi/alx.rya.console/src/main/java/org/apache/rya/alx/command/InfoRyaCommand.java
@@ -19,13 +19,11 @@
  * under the License.
  */
 
-
-
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.felix.gogo.commands.Command;
-
 import java.util.Map;
 
+import org.apache.felix.gogo.commands.Command;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+
 /**
  * Date: 5/16/12
  * Time: 11:04 AM
diff --git a/osgi/alx.rya/src/main/features/alx.rya-features.xml b/osgi/alx.rya/src/main/features/alx.rya-features.xml
index 87794b9..1d892a6 100644
--- a/osgi/alx.rya/src/main/features/alx.rya-features.xml
+++ b/osgi/alx.rya/src/main/features/alx.rya-features.xml
@@ -20,47 +20,47 @@
 -->
 
 <features name="alx.rya">
-    <feature name='org.openrdf.sesame.runtime' version="2.6.4">
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-model/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-runtime/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-query/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryalgebra-model/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryparser-api/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryparser-serql/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryparser-sparql/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryresultio-api/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryresultio-binary/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryresultio-sparqljson/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryresultio-text/2.6.4</bundle>
+    <feature name='org.eclipse.rdf4j.runtime' version="2.3.1">
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-model/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-runtime/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-query/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryalgebra-model/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-api/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-serql/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryparser-sparql/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-api/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-binary/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-sparqljson/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-text/2.3.1</bundle>
         <bundle>wrap:mvn:net.sf.opencsv/opencsv/2.0</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-api/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-manager/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-event/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-sail/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-sail-memory/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-sail-inferencer/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryalgebra-evaluation/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-sparql/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-http/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-http-client/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-dataset/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-repository-contextaware/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-http-protocol/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-ntriples/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-api/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-binary/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-n3/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-trix/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-turtle/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-trig/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-sail-api/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-sail-nativerdf/2.6.4</bundle>
-        <!--bundle>wrap:mvn:org.openrdf.sesame/sesame-sail-rdbms/2.6.4</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-api/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-manager/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-event/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-sail/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-memory/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-inferencer/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryalgebra-evaluation/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-sparql/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-http/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-http-client/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-dataset/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-repository-contextaware/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-http-protocol/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-ntriples/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-api/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-binary/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-n3/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-trix/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-turtle/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-trig/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-api/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-nativerdf/2.3.1</bundle>
+        <!--bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-sail-rdbms/2.3.1</bundle>
         <bundle>wrap:mvn:commons-dbcp/commons-dbcp/1.3</bundle>
         <bundle>wrap:mvn:commons-pool/commons-pool/1.3</bundle-->
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-queryresultio-sparqlxml/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-util/2.6.4</bundle>
-        <bundle>wrap:mvn:org.openrdf.sesame/sesame-rio-rdfxml/2.6.4</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-queryresultio-sparqlxml/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-util/2.3.1</bundle>
+        <bundle>wrap:mvn:org.eclipse.rdf4j/rdf4j-rio-rdfxml/2.3.1</bundle>
     </feature>
     <feature name='tinkerpop.blueprints' version='1.2'>
         <bundle>wrap:mvn:com.tinkerpop.blueprints/blueprints-core/1.2</bundle>
@@ -71,10 +71,10 @@
         <bundle>mvn:org.codehaus.jackson/jackson-mapper-asl/1.8.5</bundle>
     </feature>
     <feature name='rya.sail' version='3.0.4'>
-        <!--<feature version="[2.6,3.0)">org.openrdf.sesame.runtime</feature>-->
+        <!--<feature version="[2.3,3.0)">org.eclipse.rdf4j.runtime</feature>-->
         <feature version="1.2">tinkerpop.blueprints</feature>
         <feature version="[10,12)">google.guava</feature>
-        <bundle>mvn:org.apache.rya/sesame-runtime-osgi/2.6.4</bundle>
+        <bundle>mvn:org.apache.rya/rdf4j-runtime-osgi/2.3.1s</bundle>
         <bundle>wrap:mvn:org.apache.rya/rya.api/3.0.4-SNAPSHOT</bundle>
         <bundle>wrap:mvn:org.apache.rya/rya.sail.impl/3.0.4-SNAPSHOT</bundle>
     </feature>
diff --git a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailComponent.java b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailComponent.java
index e5d73d2..940bce5 100644
--- a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailComponent.java
+++ b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailComponent.java
@@ -19,18 +19,16 @@
  * under the License.
  */
 
-
-
-import org.apache.camel.Endpoint;
-import org.apache.camel.impl.DefaultComponent;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.sail.SailRepository;
+import static com.google.common.base.Preconditions.checkNotNull;
 
 import java.util.Map;
 
-import static com.google.common.base.Preconditions.*;
+import org.apache.camel.Endpoint;
+import org.apache.camel.impl.DefaultComponent;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.Repository;
+
 /**
  * Save and retrieve triples
  */
@@ -41,7 +39,7 @@
     public static final String SPARQL_QUERY_PROP = "cbsail.sparql";
     public static final String START_TIME_QUERY_PROP = "cbsail.startTime";
     public static final String TTL_QUERY_PROP = "cbsail.ttl";
-    public static final ValueFactory valueFactory = new ValueFactoryImpl();
+    public static final ValueFactory VALUE_FACTORY = SimpleValueFactory.getInstance();
 
     @Override
     protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> parameters) throws Exception {
diff --git a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailEndpoint.java b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailEndpoint.java
index a8909cb..6d09c52 100644
--- a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailEndpoint.java
+++ b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailEndpoint.java
@@ -19,13 +19,15 @@
  * under the License.
  */
 
+import static com.google.common.base.Preconditions.checkNotNull;
 
-
-import org.apache.camel.*;
+import org.apache.camel.Component;
+import org.apache.camel.Consumer;
+import org.apache.camel.Processor;
+import org.apache.camel.Producer;
+import org.apache.camel.RuntimeCamelException;
 import org.apache.camel.impl.DefaultEndpoint;
-import org.openrdf.repository.Repository;
-
-import static com.google.common.base.Preconditions.*;
+import org.eclipse.rdf4j.repository.Repository;
 
 /**
  * setHeader(SPARQL, sqarlQuery).setHeader(TTL, ttl).to("cbsail:server?port=2181&user=user&pwd=pwd&instanceName=name").getBody(<Triple Map>)
diff --git a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailProducer.java b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailProducer.java
index eba4b3d..0b8738c 100644
--- a/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailProducer.java
+++ b/osgi/camel.rya/src/main/java/org/apache/rya/camel/cbsail/CbSailProducer.java
@@ -1,18 +1,3 @@
-package org.apache.rya.camel.cbsail;
-
-import static org.apache.rya.api.RdfCloudTripleStoreConfiguration.CONF_INFER;
-import static org.apache.rya.api.RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH;
-import static org.apache.rya.camel.cbsail.CbSailComponent.SPARQL_QUERY_PROP;
-import static org.apache.rya.camel.cbsail.CbSailComponent.valueFactory;
-
-import java.io.ByteArrayOutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -31,23 +16,35 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.camel.cbsail;
 
+import static org.apache.rya.api.RdfCloudTripleStoreConfiguration.CONF_INFER;
+import static org.apache.rya.api.RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH;
+import static org.apache.rya.camel.cbsail.CbSailComponent.SPARQL_QUERY_PROP;
+import static org.apache.rya.camel.cbsail.CbSailComponent.VALUE_FACTORY;
 
+import java.io.ByteArrayOutputStream;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.impl.DefaultProducer;
-import org.openrdf.model.Statement;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandlerBase;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.rio.RDFHandlerException;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.AbstractTupleQueryResultHandler;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
 
 /**
  */
@@ -130,14 +127,14 @@
         final TupleQuery tupleQuery = connection.prepareTupleQuery(
                 QueryLanguage.SPARQL, query);
         if (auth != null && auth.length() > 0) {
-            tupleQuery.setBinding(CONF_QUERY_AUTH, valueFactory.createLiteral(auth));
+            tupleQuery.setBinding(CONF_QUERY_AUTH, VALUE_FACTORY.createLiteral(auth));
         }
         if (infer != null) {
-            tupleQuery.setBinding(CONF_INFER, valueFactory.createLiteral(infer));
+            tupleQuery.setBinding(CONF_INFER, VALUE_FACTORY.createLiteral(infer));
         }
         if (CbSailEndpoint.CbSailOutput.BINARY.equals(queryOutput)) {
             final List listOutput = new ArrayList();
-            final TupleQueryResultHandlerBase handler = new TupleQueryResultHandlerBase() {
+            final AbstractTupleQueryResultHandler handler = new AbstractTupleQueryResultHandler() {
                 @Override
                 public void handleSolution(final BindingSet bindingSet) throws TupleQueryResultHandlerException {
                     final Map<String, String> map = new HashMap<String, String>();
diff --git a/osgi/camel.rya/src/test/java/org/apache/rya/camel/cbsail/CbSailTest.java b/osgi/camel.rya/src/test/java/org/apache/rya/camel/cbsail/CbSailTest.java
index 4803bd4..f9e8855 100644
--- a/osgi/camel.rya/src/test/java/org/apache/rya/camel/cbsail/CbSailTest.java
+++ b/osgi/camel.rya/src/test/java/org/apache/rya/camel/cbsail/CbSailTest.java
@@ -19,16 +19,11 @@
  * under the License.
  */
 
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
-
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.rya.rdftriplestore.RyaSailRepository;
-import org.apache.rya.rdftriplestore.inference.InferenceEngine;
-import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Instance;
 import org.apache.accumulo.core.client.mock.MockInstance;
@@ -39,17 +34,20 @@
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.impl.JndiRegistry;
 import org.apache.camel.test.CamelTestSupport;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConstants;
+import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.apache.rya.rdftriplestore.RyaSailRepository;
+import org.apache.rya.rdftriplestore.inference.InferenceEngine;
+import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
 
 /**
  */
@@ -59,7 +57,7 @@
 
     private RdfCloudTripleStore store;
     private Repository repository;
-    private ValueFactory vf = RdfCloudTripleStoreConstants.VALUE_FACTORY;
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @EndpointInject(uri = "mock:results")
     protected MockEndpoint resultEndpoint;
@@ -108,9 +106,9 @@
     
     public void testSimpleQuery() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI cpu = vf.createURI(litdupsNS, "cpu");
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
+        IRI cpu = VF.createIRI(litdupsNS, "cpu");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
         conn.add(cpu, loadPerc, uri1);
         conn.commit();
         conn.close();
@@ -128,11 +126,11 @@
 
     public void testSimpleQueryAuth() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI cpu = vf.createURI(litdupsNS, "cpu");
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
-        URI uri2 = vf.createURI(litdupsNS, "uri2");
-        URI auth1 = vf.createURI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "auth1");
+        IRI cpu = VF.createIRI(litdupsNS, "cpu");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
+        IRI uri2 = VF.createIRI(litdupsNS, "uri2");
+        IRI auth1 = VF.createIRI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "auth1");
         conn.add(cpu, loadPerc, uri1, auth1);
         conn.add(cpu, loadPerc, uri2);
         conn.commit();
@@ -162,13 +160,13 @@
     }
     
     public void testInsertData() throws Exception {
-        URI cpu = vf.createURI(litdupsNS, "cpu");
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
-        URI uri2 = vf.createURI(litdupsNS, "uri2");
+        IRI cpu = VF.createIRI(litdupsNS, "cpu");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
+        IRI uri2 = VF.createIRI(litdupsNS, "uri2");
         List<Statement> insert = new ArrayList<Statement>();
-        insert.add(new StatementImpl(cpu, loadPerc, uri1));
-        insert.add(new StatementImpl(cpu, loadPerc, uri2));
+        insert.add(VF.createStatement(cpu, loadPerc, uri1));
+        insert.add(VF.createStatement(cpu, loadPerc, uri2));
 
         resultEndpoint.expectedBodiesReceived(true);
         template.sendBody(insert);
diff --git a/osgi/pom.xml b/osgi/pom.xml
index 4ca9dd2..3371951 100644
--- a/osgi/pom.xml
+++ b/osgi/pom.xml
@@ -41,7 +41,7 @@
         <module>alx.rya.console</module>
         <module>camel.rya</module>
         <!-- Disabling and documented in RYA-8 -->
-        <!--   <module>sesame-runtime-osgi</module> -->
+        <!--   <module>rdf4j-runtime-osgi</module> -->
     </modules>
     <build>
         <pluginManagement>
@@ -53,7 +53,7 @@
                         <excludes>
                             <!-- Services Files -->
                             <exclude>**/resources/META-INF/services/**</exclude>
-                            <exclude>sesame-runtime-osgi/openrdf-sesame-osgi.bnd</exclude>
+                            <exclude>rdf4j-runtime-osgi/eclipse-rdf4j-osgi.bnd</exclude>
                         </excludes>
                     </configuration>
                 </plugin>
diff --git a/osgi/rdf4j-runtime-osgi/eclipse-rdf4j-osgi.bnd b/osgi/rdf4j-runtime-osgi/eclipse-rdf4j-osgi.bnd
new file mode 100644
index 0000000..a838bfc
--- /dev/null
+++ b/osgi/rdf4j-runtime-osgi/eclipse-rdf4j-osgi.bnd
@@ -0,0 +1,7 @@
+-classpath= target/rdf4j-runtime-osgi.jar
+-output= target/rdf4j-runtime-osgi-2.3.1.jar
+Import-Package= *;resolution:=optional
+Export-Package= *
+Bundle-Version= 2.3.1
+Bundle-SymbolicName= rdf4j-runtime-osgi
+DynamicImport-Package= *
diff --git a/osgi/sesame-runtime-osgi/pom.xml b/osgi/rdf4j-runtime-osgi/pom.xml
similarity index 88%
rename from osgi/sesame-runtime-osgi/pom.xml
rename to osgi/rdf4j-runtime-osgi/pom.xml
index ce55927..df2a35d 100644
--- a/osgi/sesame-runtime-osgi/pom.xml
+++ b/osgi/rdf4j-runtime-osgi/pom.xml
@@ -24,18 +24,18 @@
     <parent>
         <groupId>org.apache.rya</groupId>
         <artifactId>rya.osgi</artifactId>
-        <version>3.2.10-incubating-SNAPSHOT</version>
+        <version>3.2.13-incubating-SNAPSHOT</version>
     </parent>
 
-    <artifactId>sesame-runtime-osgi</artifactId>
-    <name>Sesame Runtime for OSGI</name>
+    <artifactId>rdf4j-runtime-osgi</artifactId>
+    <name>RDF4J Runtime for OSGI</name>
 
     <packaging>pom</packaging>
 
     <dependencies>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-runtime-osgi</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-runtime-osgi</artifactId>
         </dependency>
         <dependency>
             <groupId>biz.aQute</groupId>
@@ -58,11 +58,11 @@
                         <configuration>
                             <artifactItems>
                                 <artifactItem>
-                                    <groupId>org.openrdf.sesame</groupId>
-                                    <artifactId>sesame-runtime-osgi</artifactId>
+                                    <groupId>org.eclipse.rdf4j</groupId>
+                                    <artifactId>rdf4j-runtime-osgi</artifactId>
                                     <version>${project.version}</version>
                                     <outputDirectory>${project.build.directory}</outputDirectory>
-                                    <destFileName>sesame-runtime-osgi.jar</destFileName>
+                                    <destFileName>rdf4j-runtime-osgi.jar</destFileName>
                                 </artifactItem>
                                 <artifactItem>
                                     <groupId>biz.aQute</groupId>
@@ -95,7 +95,7 @@
                         <argument>-jar</argument>
                         <argument>target/bnd.jar</argument>
                         <argument>build</argument>
-                        <argument>openrdf-sesame-osgi.bnd</argument>
+                        <argument>eclipse-rdf4j-osgi.bnd</argument>
                     </arguments>
                 </configuration>
             </plugin>
@@ -114,7 +114,7 @@
                         <configuration>
                             <artifacts>
                                 <artifact>
-                                    <file>${project.build.directory}/sesame-runtime-osgi-${project.version}.jar</file>
+                                    <file>${project.build.directory}/rdf4j-runtime-osgi-${project.version}.jar</file>
                                 </artifact>
                             </artifacts>
                         </configuration>
diff --git a/osgi/sesame-runtime-osgi/openrdf-sesame-osgi.bnd b/osgi/sesame-runtime-osgi/openrdf-sesame-osgi.bnd
deleted file mode 100644
index c0aea07..0000000
--- a/osgi/sesame-runtime-osgi/openrdf-sesame-osgi.bnd
+++ /dev/null
@@ -1,7 +0,0 @@
--classpath= target/sesame-runtime-osgi.jar
--output= target/sesame-runtime-osgi-2.6.4.jar
-Import-Package= *;resolution:=optional
-Export-Package= *
-Bundle-Version= 2.6.4
-Bundle-SymbolicName= sesame-runtime-osgi
-DynamicImport-Package= *
diff --git a/pig/accumulo.pig/pom.xml b/pig/accumulo.pig/pom.xml
index e9b14d0..de1b3d0 100644
--- a/pig/accumulo.pig/pom.xml
+++ b/pig/accumulo.pig/pom.xml
@@ -41,8 +41,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryparser-sparql</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryparser-sparql</artifactId>
         </dependency>
 
         <dependency>
diff --git a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/IndexWritingTool.java b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/IndexWritingTool.java
index 3d5de56..c6ce45a 100644
--- a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/IndexWritingTool.java
+++ b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/IndexWritingTool.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.io.File;
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
@@ -53,10 +51,10 @@
 import org.apache.hadoop.util.ToolRunner;
 import org.apache.log4j.Logger;
 import org.apache.rya.api.path.PathUtils;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
diff --git a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlQueryPigEngine.java b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlQueryPigEngine.java
index d0641e6..7302559 100644
--- a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlQueryPigEngine.java
+++ b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlQueryPigEngine.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
 package org.apache.rya.accumulo.pig;
 
 import java.io.ByteArrayInputStream;
@@ -24,31 +42,10 @@
 import org.apache.rya.rdftriplestore.inference.InverseOfVisitor;
 import org.apache.rya.rdftriplestore.inference.SymmetricPropertyVisitor;
 import org.apache.rya.rdftriplestore.inference.TransitivePropertyVisitor;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.QueryParser;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.QueryParser;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.base.Preconditions;
 
diff --git a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitor.java b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitor.java
index c57aab8..673750d 100644
--- a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitor.java
+++ b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitor.java
@@ -18,16 +18,25 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
-
-
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-
-import java.util.*;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.Slice;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Created by IntelliJ IDEA.
@@ -35,7 +44,7 @@
  * Time: 10:17 AM
  * To change this template use File | Settings | File Templates.
  */
-public class SparqlToPigTransformVisitor extends QueryModelVisitorBase<RuntimeException> {
+public class SparqlToPigTransformVisitor extends AbstractQueryModelVisitor<RuntimeException> {
     private StringBuilder pigScriptBuilder = new StringBuilder();
     private String tablePrefix;
     private String instance, zk, user, password; //TODO: use a Configuration object to get these
@@ -328,7 +337,7 @@
             if (value == null) {
                 return "";
             }
-            if (value instanceof URI) {
+            if (value instanceof IRI) {
                 return "<" + value.stringValue() + ">";
             }
             if (value instanceof Literal) {
diff --git a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/StatementPatternStorage.java b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/StatementPatternStorage.java
index bc3914c..0837e5c 100644
--- a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/StatementPatternStorage.java
+++ b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/StatementPatternStorage.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.Collection;
@@ -52,17 +50,17 @@
 import org.apache.rya.api.resolver.triple.TripleRow;
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.QueryParser;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.QueryParser;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import com.google.common.io.ByteArrayDataInput;
 import com.google.common.io.ByteStreams;
@@ -169,7 +167,7 @@
         } catch (MalformedQueryException e) {
             throw new IOException(e);
         }
-        parsedQuery.getTupleExpr().visitChildren(new QueryModelVisitorBase<IOException>() {
+        parsedQuery.getTupleExpr().visitChildren(new AbstractQueryModelVisitor<IOException>() {
             @Override
             public void meet(StatementPattern node) throws IOException {
                 Var subjectVar = node.getSubjectVar();
@@ -193,7 +191,7 @@
 
     protected Map.Entry<TABLE_LAYOUT, Range> createRange(Value s_v, Value p_v, Value o_v) throws IOException {
         RyaURI subject_rya = RdfToRyaConversions.convertResource((Resource) s_v);
-        RyaURI predicate_rya = RdfToRyaConversions.convertURI((URI) p_v);
+        RyaURI predicate_rya = RdfToRyaConversions.convertURI((IRI) p_v);
         RyaType object_rya = RdfToRyaConversions.convertValue(o_v);
         TriplePatternStrategy strategy = ryaContext.retrieveStrategy(subject_rya, predicate_rya, object_rya, null);
         if (strategy == null) {
@@ -232,12 +230,12 @@
             //is it subclassof or subpropertyof
             if (RDF.TYPE.equals(predicate_value)) {
                 //try subclassof
-                Collection<URI> parents = inferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), (URI) object_value);
+                Collection<IRI> parents = InferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), (IRI) object_value);
                 if (parents != null && parents.size() > 0) {
                     //subclassof relationships found
                     //don't add self, that will happen anyway later
                     //add all relationships
-                    for (URI parent : parents) {
+                    for (IRI parent : parents) {
                         Map.Entry<TABLE_LAYOUT, Range> temp =
                                 createRange(subject_value, predicate_value, parent);
                         Range range = temp.getValue();
@@ -249,8 +247,8 @@
                 }
             } else if (predicate_value != null) {
                 //subpropertyof check
-                Set<URI> parents = inferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), (URI) predicate_value);
-                for (URI parent : parents) {
+                Set<IRI> parents = InferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), (IRI) predicate_value);
+                for (IRI parent : parents) {
                     Map.Entry<TABLE_LAYOUT, Range> temp =
                             createRange(subject_value, parent, object_value);
                     Range range = temp.getValue();
@@ -285,8 +283,8 @@
     public Tuple getNext() throws IOException {
         try {
             if (reader.nextKeyValue()) {
-                Key key = (Key) reader.getCurrentKey();
-                org.apache.accumulo.core.data.Value value = (org.apache.accumulo.core.data.Value) reader.getCurrentValue();
+                Key key = reader.getCurrentKey();
+                org.apache.accumulo.core.data.Value value = reader.getCurrentValue();
                 ByteArrayDataInput input = ByteStreams.newDataInput(key.getRow().getBytes());
                 RyaStatement ryaStatement = ryaContext.deserializeTriple(layout, new TripleRow(key.getRow().getBytes(),
                         key.getColumnFamily().getBytes(), key.getColumnQualifier().getBytes()));
diff --git a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/optimizer/SimilarVarJoinOptimizer.java b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/optimizer/SimilarVarJoinOptimizer.java
index c046a3d..36739c5 100644
--- a/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/optimizer/SimilarVarJoinOptimizer.java
+++ b/pig/accumulo.pig/src/main/java/org/apache/rya/accumulo/pig/optimizer/SimilarVarJoinOptimizer.java
@@ -18,18 +18,24 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 
-
-
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.*;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-
-import java.util.*;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
 
 /**
  * A query optimizer that re-orders nested Joins according to cardinality, preferring joins that have similar variables.
@@ -57,7 +63,7 @@
         tupleExpr.visit(new JoinVisitor());
     }
 
-    protected class JoinVisitor extends QueryModelVisitorBase<RuntimeException> {
+    protected class JoinVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         Set<String> boundVars = new HashSet<String>();
 
diff --git a/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitorTest.java b/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitorTest.java
index 5bd5b35..baf4c55 100644
--- a/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitorTest.java
+++ b/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/SparqlToPigTransformVisitorTest.java
@@ -19,15 +19,13 @@
  * under the License.
  */
 
-
-
 import junit.framework.TestCase;
 import org.apache.rya.accumulo.pig.optimizer.SimilarVarJoinOptimizer;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.QueryParser;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.QueryParser;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/StatementPatternStorageTest.java b/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/StatementPatternStorageTest.java
index 1446d20..eb40df9 100644
--- a/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/StatementPatternStorageTest.java
+++ b/pig/accumulo.pig/src/test/java/org/apache/rya/accumulo/pig/StatementPatternStorageTest.java
@@ -19,20 +19,10 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
-import junit.framework.TestCase;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.apache.rya.api.domain.RyaStatement;
-import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaURI;
-
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.admin.SecurityOperations;
@@ -48,8 +38,14 @@
 import org.apache.hadoop.mapreduce.TaskAttemptID;
 import org.apache.hadoop.mapreduce.task.TaskAttemptContextImpl;
 import org.apache.pig.data.Tuple;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreConstants;
+import org.apache.rya.api.domain.RyaStatement;
+import org.apache.rya.api.domain.RyaType;
+import org.apache.rya.api.domain.RyaURI;
+
+import junit.framework.TestCase;
 
 /**
  * Created by IntelliJ IDEA.
@@ -66,7 +62,6 @@
     private Authorizations auths = Constants.NO_AUTHS;
     private Connector connector;
     private AccumuloRyaDAO ryaDAO;
-    private ValueFactory vf = new ValueFactoryImpl();
     private String namespace = "urn:test#";
     private AccumuloRdfConfiguration conf;
 
diff --git a/pom.xml b/pom.xml
index b3b9dbb..f31873a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -69,8 +69,7 @@
         <module>web</module>
     </modules>
     <properties>
-        <openrdf.sesame.version>2.7.6</openrdf.sesame.version> <!-- Newest: 4.0.0 -->
-        <!--Cannot upgrade to openrdf.sesame 2.7.6 until RYA-9 is resolved -->
+        <org.eclipse.rdf4j.version>2.3.1</org.eclipse.rdf4j.version> <!-- Newest: 2.3.1 -->
 
         <accumulo.version>1.6.4</accumulo.version> <!-- Newest: 1.7.0 -->
         <hadoop.version>2.5.0</hadoop.version> <!-- Newest: 2.7.1 -->
@@ -79,7 +78,7 @@
 
         <pig.version>0.9.2</pig.version> <!-- Newest: 0.15.0 -->
 
-        <lucene.version>3.6.2</lucene.version> <!-- Newest: 5.3.1 -->
+        <lucene.version>5.2.1</lucene.version> <!-- Newest: 5.3.1 -->
         <joda-time.version>2.1</joda-time.version> <!-- Newest: 2.9.1 -->
 
         <mongodb.version>3.3.0</mongodb.version>
@@ -479,104 +478,104 @@
                 <version>${accumulo.version}</version>
             </dependency>
            <dependency>
-                <groupId>org.apache.rya</groupId>
-                <artifactId>sesame-runtime-osgi</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-runtime-osgi</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-runtime</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-runtime</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-model</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-model</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-query</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-query</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryalgebra-model</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryalgebra-model</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryparser-sparql</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryparser-sparql</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryresultio-sparqlxml</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryresultio-sparqlxml</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryresultio-text</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryresultio-text</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-rio-nquads</artifactId>
-                <version>${openrdf.sesame.version}</version>
-            </dependency>
-           <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-rio-ntriples</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-rio-nquads</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-rio-rdfxml</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-rio-ntriples</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-rio-trig</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-rio-rdfxml</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-rio-turtle</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-rio-trig</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryrender</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-rio-turtle</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-runtime-osgi</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryrender</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-runtime-osgi</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
                 <exclusions>
                     <exclusion>
-                        <groupId>org.openrdf.sesame</groupId>
-                        <artifactId>sesame-http-client</artifactId>
+                        <groupId>org.eclipse.rdf4j</groupId>
+                        <artifactId>rdf4j-http-client</artifactId>
                     </exclusion>
                     <exclusion>
-                        <groupId>org.openrdf.sesame</groupId>
-                        <artifactId>sesame-http-server-spring</artifactId>
+                        <groupId>org.eclipse.rdf4j</groupId>
+                        <artifactId>rdf4j-http-server-spring</artifactId>
                     </exclusion>
                 </exclusions>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryalgebra-evaluation</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryalgebra-evaluation</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-queryresultio-sparqljson</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-queryresultio-sparqljson</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
             <dependency>
-                <groupId>org.openrdf.sesame</groupId>
-                <artifactId>sesame-repository-api</artifactId>
-                <version>${openrdf.sesame.version}</version>
+                <groupId>org.eclipse.rdf4j</groupId>
+                <artifactId>rdf4j-repository-api</artifactId>
+                <version>${org.eclipse.rdf4j.version}</version>
             </dependency>
 
             <dependency>
@@ -790,7 +789,7 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.lucene</groupId>
-                <artifactId>lucene-analyzers</artifactId>
+                <artifactId>lucene-analyzers-common</artifactId>
                 <version>${lucene.version}</version>
             </dependency>
 
diff --git a/sail/pom.xml b/sail/pom.xml
index aedca13..5fc159c 100644
--- a/sail/pom.xml
+++ b/sail/pom.xml
@@ -34,6 +34,13 @@
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.api</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-sail-api</artifactId>
+            <version>${org.eclipse.rdf4j.version}</version>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.provenance</artifactId>
@@ -59,8 +66,8 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-runtime</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-runtime</artifactId>
         </dependency>
 
         <!-- Test -->
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStore.java b/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStore.java
index a99fe66..e475fec 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStore.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStore.java
@@ -28,13 +28,13 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
 import org.apache.rya.rdftriplestore.provenance.ProvenanceCollector;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.sail.SailConnection;
-import org.openrdf.sail.SailException;
-import org.openrdf.sail.helpers.SailBase;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.sail.SailConnection;
+import org.eclipse.rdf4j.sail.SailException;
+import org.eclipse.rdf4j.sail.helpers.AbstractSail;
 
-public class RdfCloudTripleStore<C extends RdfCloudTripleStoreConfiguration> extends SailBase {
+public class RdfCloudTripleStore<C extends RdfCloudTripleStoreConfiguration> extends AbstractSail {
 
     private C conf;
 
@@ -45,7 +45,7 @@
     private NamespaceManager namespaceManager;
     protected ProvenanceCollector provenanceCollector;
 
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
     protected SailConnection getConnectionInternal() throws SailException {
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStoreConnection.java b/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStoreConnection.java
index ed9ad0b..e582321 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStoreConnection.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/RdfCloudTripleStoreConnection.java
@@ -69,44 +69,42 @@
 import org.apache.rya.rdftriplestore.provenance.ProvenanceCollectionException;
 import org.apache.rya.rdftriplestore.provenance.ProvenanceCollector;
 import org.apache.rya.rdftriplestore.utils.DefaultStatistics;
-import org.openrdf.model.Namespace;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ContextStatementImpl;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.EvaluationStrategy;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.evaluation.TripleSource;
-import org.openrdf.query.algebra.evaluation.impl.BindingAssigner;
-import org.openrdf.query.algebra.evaluation.impl.CompareOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.ConjunctiveConstraintSplitter;
-import org.openrdf.query.algebra.evaluation.impl.ConstantOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.DisjunctiveConstraintOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
-import org.openrdf.query.algebra.evaluation.impl.FilterOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.IterativeEvaluationOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.OrderLimitOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.QueryModelNormalizer;
-import org.openrdf.query.algebra.evaluation.impl.SameTermFilterOptimizer;
-import org.openrdf.query.impl.EmptyBindingSet;
-import org.openrdf.sail.SailException;
-import org.openrdf.sail.helpers.SailConnectionBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.TripleSource;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.BindingAssigner;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.CompareOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ConjunctiveConstraintSplitter;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.ConstantOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.DisjunctiveConstraintOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.IterativeEvaluationOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.OrderLimitOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.QueryModelNormalizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.SameTermFilterOptimizer;
+import org.eclipse.rdf4j.query.impl.EmptyBindingSet;
+import org.eclipse.rdf4j.sail.SailException;
+import org.eclipse.rdf4j.sail.helpers.AbstractSailConnection;
 
-import info.aduna.iteration.CloseableIteration;
-
-public class RdfCloudTripleStoreConnection<C extends RdfCloudTripleStoreConfiguration> extends SailConnectionBase {
+public class RdfCloudTripleStoreConnection<C extends RdfCloudTripleStoreConfiguration> extends AbstractSailConnection {
     private final RdfCloudTripleStore<C> store;
 
     private RdfEvalStatsDAO<C> rdfEvalStatsDAO;
@@ -150,7 +148,7 @@
     }
 
     @Override
-    protected void addStatementInternal(final Resource subject, final URI predicate,
+    protected void addStatementInternal(final Resource subject, final IRI predicate,
                                         final Value object, final Resource... contexts) throws SailException {
         try {
             final String cv_s = conf.getCv();
@@ -294,7 +292,7 @@
             if(pcjOptimizer != null) {
                 QueryOptimizer opt = null;
                 try {
-                    final Constructor<QueryOptimizer> construct = pcjOptimizer.getDeclaredConstructor(new Class[] {});
+                    final Constructor<QueryOptimizer> construct = pcjOptimizer.getDeclaredConstructor();
                     opt = construct.newInstance();
                 } catch (final Exception e) {
                 }
@@ -329,7 +327,7 @@
                 for (final Class<QueryOptimizer> optclz : optimizers) {
                     QueryOptimizer result = null;
                     try {
-                        final Constructor<QueryOptimizer> meth = optclz.getDeclaredConstructor(new Class[] {});
+                        final Constructor<QueryOptimizer> meth = optclz.getDeclaredConstructor();
                         result = meth.newInstance();
                     } catch (final Exception e) {
                     }
@@ -462,7 +460,7 @@
 
     @Override
     protected CloseableIteration<? extends Statement, SailException> getStatementsInternal(
-            final Resource subject, final URI predicate, final Value object, final boolean flag,
+            final Resource subject, final IRI predicate, final Value object, final boolean flag,
             final Resource... contexts) throws SailException {
 //        try {
         //have to do this to get the inferred values
@@ -509,15 +507,16 @@
                 try {
                     final BindingSet next = evaluate.next();
                     final Resource bs_subj = (Resource) ((subjVar.hasValue()) ? subjVar.getValue() : next.getBinding(subjVar.getName()).getValue());
-                    final URI bs_pred = (URI) ((predVar.hasValue()) ? predVar.getValue() : next.getBinding(predVar.getName()).getValue());
-                    final Value bs_obj = (objVar.hasValue()) ? objVar.getValue() : (Value) next.getBinding(objVar.getName()).getValue();
+                    final IRI bs_pred = (IRI) ((predVar.hasValue()) ? predVar.getValue() : next.getBinding(predVar.getName()).getValue());
+                    final Value bs_obj = (objVar.hasValue()) ? objVar.getValue() :
+                            next.getBinding(objVar.getName()).getValue();
                     final Binding b_cntxt = next.getBinding(cntxtVar.getName());
 
                     //convert BindingSet to Statement
                     if (b_cntxt != null) {
-                        return new ContextStatementImpl(bs_subj, bs_pred, bs_obj, (Resource) b_cntxt.getValue());
+                        return SimpleValueFactory.getInstance().createStatement(bs_subj, bs_pred, bs_obj, (Resource) b_cntxt.getValue());
                     } else {
-                        return new StatementImpl(bs_subj, bs_pred, bs_obj);
+                        return SimpleValueFactory.getInstance().createStatement(bs_subj, bs_pred, bs_obj);
                     }
                 } catch (final QueryEvaluationException e) {
                     throw new SailException(e);
@@ -552,16 +551,16 @@
     }
 
     @Override
-    protected void removeStatementsInternal(final Resource subject, final URI predicate,
+    protected void removeStatementsInternal(final Resource subject, final IRI predicate,
                                             final Value object, final Resource... contexts) throws SailException {
-        if (!(subject instanceof URI)) {
+        if (!(subject instanceof IRI)) {
             throw new SailException("Subject[" + subject + "] must be URI");
         }
 
         try {
             if (contexts != null && contexts.length > 0) {
                 for (final Resource context : contexts) {
-                    if (!(context instanceof URI)) {
+                    if (!(context instanceof IRI)) {
                         throw new SailException("Context[" + context + "] must be URI");
                     }
                     final RyaStatement statement = new RyaStatement(
@@ -609,6 +608,11 @@
         //TODO: ?
     }
 
+    @Override
+    public boolean pendingRemovals() {
+        return false;
+    }
+
     public static class StoreTripleSource<C extends RdfCloudTripleStoreConfiguration> implements TripleSource {
 
         private final C conf;
@@ -621,7 +625,7 @@
 
         @Override
         public CloseableIteration<Statement, QueryEvaluationException> getStatements(
-                final Resource subject, final URI predicate, final Value object,
+                final Resource subject, final IRI predicate, final Value object,
                 final Resource... contexts) throws QueryEvaluationException {
             return RyaDAOHelper.query(ryaDAO, subject, predicate, object, conf, contexts);
         }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepository.java b/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepository.java
index 402e5bb..ac45baa 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepository.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepository.java
@@ -19,13 +19,11 @@
  * under the License.
  */
 
-
-
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.sail.Sail;
-import org.openrdf.sail.SailException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.sail.Sail;
+import org.eclipse.rdf4j.sail.SailException;
 
 /**
  * Created by IntelliJ IDEA.
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepositoryConnection.java b/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepositoryConnection.java
index 5dfe5f3..145d2d0 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepositoryConnection.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/RyaSailRepositoryConnection.java
@@ -19,24 +19,21 @@
  * under the License.
  */
 
-
-
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Reader;
 
 import org.apache.rya.rdftriplestore.utils.CombineContextsRdfInserter;
-
-import org.openrdf.OpenRDFUtil;
-import org.openrdf.model.Resource;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.repository.util.RDFLoader;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.sail.SailConnection;
+import org.eclipse.rdf4j.OpenRDFUtil;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.repository.util.RDFLoader;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.sail.SailConnection;
 
 /**
  * The real reason for this is so that we can combine contexts from an input stream/reader and the given contexts in the add function
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalBatchingIterator.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalBatchingIterator.java
index 606c1fb..93f847d 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalBatchingIterator.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalBatchingIterator.java
@@ -19,14 +19,11 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-
 import java.util.Collection;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
 
 public interface ExternalBatchingIterator {
     public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(Collection<BindingSet> bindingset) throws QueryEvaluationException;
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalMultipleBindingSetsIterator.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalMultipleBindingSetsIterator.java
index c36ef68..812d2af 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalMultipleBindingSetsIterator.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ExternalMultipleBindingSetsIterator.java
@@ -19,18 +19,14 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.LookAheadIteration;
-
 import java.util.ArrayList;
 import java.util.Collection;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.LookAheadIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
 
 /**
  */
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/FilterRangeVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/FilterRangeVisitor.java
index 27b799f..6b049b9 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/FilterRangeVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/FilterRangeVisitor.java
@@ -1,11 +1,3 @@
-package org.apache.rya.rdftriplestore.evaluation;
-
-import static org.apache.rya.api.RdfCloudTripleStoreConstants.RANGE;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -24,29 +16,34 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.rdftriplestore.evaluation;
 
+import static org.apache.rya.api.RdfCloudTripleStoreConstants.RANGE;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.domain.RangeURI;
 import org.apache.rya.api.domain.RangeValue;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.BooleanLiteralImpl;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.FunctionCall;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.ValueConstant;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.impl.BooleanLiteral;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.FunctionCall;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.ValueConstant;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Class FilterTimeIndexVisitor
  * Date: Apr 11, 2011
  * Time: 10:16:15 PM
  */
-public class FilterRangeVisitor extends QueryModelVisitorBase<Exception> {
+public class FilterRangeVisitor extends AbstractQueryModelVisitor<Exception> {
 
     private final RdfCloudTripleStoreConfiguration conf;
     private final Map<Var, RangeValue> rangeValues = new HashMap<Var, RangeValue>();
@@ -74,7 +71,7 @@
                 final Value start = startVc.getValue();
                 final Value end = endVc.getValue();
                 rangeValues.put(var, new RangeValue(start, end));
-                node.setCondition(new ValueConstant(BooleanLiteralImpl.TRUE));
+                node.setCondition(new ValueConstant(BooleanLiteral.TRUE));
             }
         }
     }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/MultipleBindingSetsIterator.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/MultipleBindingSetsIterator.java
index 5d4d3c1..dd84e4d 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/MultipleBindingSetsIterator.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/MultipleBindingSetsIterator.java
@@ -19,18 +19,16 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.LookAheadIteration;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-
 import java.util.ArrayList;
 import java.util.Collection;
 
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.LookAheadIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+
 /**
  */
 public class MultipleBindingSetsIterator extends LookAheadIteration<BindingSet, QueryEvaluationException> {
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelEvaluationStrategyImpl.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelEvaluationStrategyImpl.java
index a3b70b6..47e5269 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelEvaluationStrategyImpl.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelEvaluationStrategyImpl.java
@@ -19,16 +19,6 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.ConvertingIteration;
-import info.aduna.iteration.EmptyIteration;
-import info.aduna.iteration.Iteration;
-import info.aduna.iteration.IteratorIteration;
-import info.aduna.iteration.LimitIteration;
-import info.aduna.iteration.OffsetIteration;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -38,6 +28,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 
+import org.apache.log4j.Logger;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
 import org.apache.rya.api.utils.NullableStatementImpl;
@@ -47,35 +38,37 @@
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
 import org.apache.rya.rdftriplestore.utils.TransitivePropertySP;
-
-import org.apache.log4j.Logger;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.QueryRoot;
-import org.openrdf.query.algebra.Slice;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.evaluation.ValueExprEvaluationException;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStrategyImpl;
-import org.openrdf.query.algebra.evaluation.iterator.FilterIterator;
-import org.openrdf.query.algebra.evaluation.iterator.JoinIterator;
-import org.openrdf.query.algebra.evaluation.util.QueryEvaluationUtil;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.ConvertingIteration;
+import org.eclipse.rdf4j.common.iteration.EmptyIteration;
+import org.eclipse.rdf4j.common.iteration.Iteration;
+import org.eclipse.rdf4j.common.iteration.IteratorIteration;
+import org.eclipse.rdf4j.common.iteration.LimitIteration;
+import org.eclipse.rdf4j.common.iteration.OffsetIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.QueryRoot;
+import org.eclipse.rdf4j.query.algebra.Slice;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.StrictEvaluationStrategy;
+import org.eclipse.rdf4j.query.algebra.evaluation.iterator.FilterIterator;
+import org.eclipse.rdf4j.query.algebra.evaluation.iterator.JoinIterator;
 
 import com.google.common.collect.Lists;
 
 /**
  */
-public class ParallelEvaluationStrategyImpl extends EvaluationStrategyImpl {
+public class ParallelEvaluationStrategyImpl extends StrictEvaluationStrategy {
     private static Logger logger = Logger.getLogger(ParallelEvaluationStrategyImpl.class);
     
     private int numOfThreads = 10;
@@ -86,7 +79,7 @@
 
     public ParallelEvaluationStrategyImpl(StoreTripleSource tripleSource, InferenceEngine inferenceEngine,
                                           Dataset dataset, RdfCloudTripleStoreConfiguration conf) {
-        super(tripleSource, dataset);
+        super(tripleSource, dataset, null);
         Integer nthreads = conf.getNumThreads();
         this.numOfThreads = (nthreads != null) ? nthreads : this.numOfThreads;
         Boolean val = conf.isPerformant();
@@ -185,7 +178,7 @@
             Set<Statement> sts = null;
             try {
                 sts = inferenceEngine.findTransitiveProperty((Resource) getVarValue(subjVar),
-                        (URI) getVarValue(predVar), getVarValue(objVar), (Resource) getVarValue(cntxtVar));
+                        (IRI) getVarValue(predVar), getVarValue(objVar), (Resource) getVarValue(cntxtVar));
             } catch (InferenceEngineException e) {
                 throw new QueryEvaluationException(e);
             }
@@ -203,11 +196,11 @@
                 Value objValue = getVarValue(objVar, binding);
                 Resource contxtValue = (Resource) getVarValue(cntxtVar, binding);
                 if ((subjValue != null && !(subjValue instanceof Resource)) ||
-                        (predValue != null && !(predValue instanceof URI))) {
+                        (predValue != null && !(predValue instanceof IRI))) {
                     continue;
                 }
                 stmts.add(new RdfCloudTripleStoreUtils.CustomEntry<Statement, BindingSet>(
-                        new NullableStatementImpl((Resource) subjValue, (URI) predValue, objValue, contxtValue), binding));
+                        new NullableStatementImpl((Resource) subjValue, (IRI) predValue, objValue, contxtValue), binding));
             }
             if (stmts.size() == 0) {
                 return new EmptyIteration();
@@ -259,14 +252,14 @@
         return super.evaluate(expr, bindings);
     }
 
-    public CloseableIteration evaluate(Slice slice, BindingSet bindings)
+    public CloseableIteration<BindingSet, QueryEvaluationException> evaluate(Slice slice, BindingSet bindings)
             throws QueryEvaluationException {
-        CloseableIteration result = evaluate(slice.getArg(), bindings);
+        CloseableIteration<BindingSet, QueryEvaluationException> result = evaluate(slice.getArg(), bindings);
         if (slice.hasOffset()) {
-            result = new OffsetIteration(result, slice.getOffset());
+            result = new OffsetIteration<BindingSet, QueryEvaluationException>(result, slice.getOffset());
         }
         if (slice.hasLimit()) {
-            result = new LimitIteration(result, slice.getLimit());
+            result = new LimitIteration<BindingSet, QueryEvaluationException>(result, slice.getLimit());
         }
         return result;
     }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelJoinIterator.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelJoinIterator.java
index 5ee9802..1ffeb4a 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelJoinIterator.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ParallelJoinIterator.java
@@ -19,22 +19,19 @@
  * under the License.
  */
 
-
-
-import info.aduna.iteration.CloseableIteration;
-import info.aduna.iteration.LookAheadIteration;
-
 import java.util.NoSuchElementException;
 import java.util.Queue;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
 
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.EvaluationStrategy;
-import org.openrdf.query.impl.EmptyBindingSet;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.common.iteration.LookAheadIteration;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.EvaluationStrategy;
+import org.eclipse.rdf4j.query.impl.EmptyBindingSet;
 
 /**
  */
@@ -85,7 +82,7 @@
                 try {
                     for (int i = 0; i < batch; i++) {
                         if (leftIter.hasNext()) {
-                            ParallelIteratorWork work = new ParallelIteratorWork((BindingSet) leftIter.next(), join.getRightArg());
+                            ParallelIteratorWork work = new ParallelIteratorWork(leftIter.next(), join.getRightArg());
                             workQueue.add(work);
                             executorService.execute(work);
                         } else
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/PushJoinDownVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/PushJoinDownVisitor.java
index ecf4c7b..2cff052 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/PushJoinDownVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/PushJoinDownVisitor.java
@@ -19,18 +19,16 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Class ReorderJoinVisitor
  * Date: Apr 11, 2011
  * Time: 10:16:15 PM
  */
-public class PushJoinDownVisitor extends QueryModelVisitorBase<Exception> {
+public class PushJoinDownVisitor extends AbstractQueryModelVisitor<Exception> {
     @Override
     public void meet(final Join node) throws Exception {
         super.meet(node);
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinOptimizer.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinOptimizer.java
index b5d5c43..ab7c8ad 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinOptimizer.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinOptimizer.java
@@ -1,3 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
 package org.apache.rya.rdftriplestore.evaluation;
 
 import java.util.ArrayList;
@@ -8,39 +26,17 @@
 import java.util.Set;
 
 import org.apache.rya.rdftriplestore.utils.DefaultStatistics;
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
-
-
-
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.LeftJoin;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.LeftJoin;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
 
 /**
  * A query optimizer that re-orders nested Joins.
@@ -72,7 +68,7 @@
         }
     }
 
-    protected class JoinVisitor extends QueryModelVisitorBase<RuntimeException> {
+    protected class JoinVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
         Set<String> boundVars = new HashSet<String>();
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizer.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizer.java
index 8fc437a..3553c8e 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizer.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizer.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -30,14 +28,13 @@
 import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.Dataset;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.QueryOptimizer;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.Dataset;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryOptimizer;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 public class QueryJoinSelectOptimizer implements QueryOptimizer {
 
@@ -61,7 +58,7 @@
     tupleExpr.visit(new JoinVisitor());
   }
 
-  protected class JoinVisitor extends QueryModelVisitorBase<RuntimeException> {
+  protected class JoinVisitor extends AbstractQueryModelVisitor<RuntimeException> {
 
     @Override
     public void meet(Join node) {
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreEvaluationStatistics.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreEvaluationStatistics.java
index b7698cf..f4abd7e 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreEvaluationStatistics.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreEvaluationStatistics.java
@@ -19,10 +19,7 @@
  * under the License.
  */
 
-
-
 import static com.google.common.base.Preconditions.checkNotNull;
-//import static RdfCloudTripleStoreUtils.getTtlValueConverter;
 
 import java.util.ArrayList;
 import java.util.Collection;
@@ -35,21 +32,21 @@
 import org.apache.rya.api.persist.RdfEvalStatsDAO.CARDINALITY_OF;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.BinaryTupleOperator;
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.Slice;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.UnaryTupleOperator;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.BinaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.Slice;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.UnaryTupleOperator;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
 
 /**
  * Class RdfCloudTripleStoreEvaluationStatistics
@@ -113,7 +110,7 @@
             final Var subjectVar = sp.getSubjectVar();
             final Resource subj = (Resource) getConstantValue(subjectVar);
             final Var predicateVar = sp.getPredicateVar();
-            final URI pred = (URI) getConstantValue(predicateVar);
+            final IRI pred = (IRI) getConstantValue(predicateVar);
             final Var objectVar = sp.getObjectVar();
             final Value obj = getConstantValue(objectVar);
             final Resource context = (Resource) getConstantValue(sp.getContextVar());
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatistics.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatistics.java
index 09435e7..27882f5 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatistics.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatistics.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static com.google.common.base.Preconditions.checkNotNull;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
@@ -28,8 +26,8 @@
 import org.apache.rya.api.persist.joinselect.SelectivityEvalDAO;
 import org.apache.rya.rdftriplestore.inference.DoNotExpandSP;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
 
 public class RdfCloudTripleStoreSelectivityEvaluationStatistics<C extends RdfCloudTripleStoreConfiguration> extends RdfCloudTripleStoreEvaluationStatistics {
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ReorderJoinVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ReorderJoinVisitor.java
index 2ae159f..03ef28f 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ReorderJoinVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/ReorderJoinVisitor.java
@@ -19,19 +19,17 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * Class ReorderJoinVisitor
  * Date: Apr 11, 2011
  * Time: 10:16:15 PM
  */
-public class ReorderJoinVisitor extends QueryModelVisitorBase<Exception> {
+public class ReorderJoinVisitor extends AbstractQueryModelVisitor<Exception> {
     @Override
     public void meet(final Join node) throws Exception {
         super.meet(node);
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/SeparateFilterJoinsVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/SeparateFilterJoinsVisitor.java
index 8f24220..d1f758b 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/SeparateFilterJoinsVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/evaluation/SeparateFilterJoinsVisitor.java
@@ -18,12 +18,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.ValueExpr;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.ValueExpr;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 /**
  * TODO: This might be a very bad thing. It may force all AND and not allow ORs?. Depends on how they do the bindings.
@@ -31,7 +32,7 @@
  * Date: Apr 11, 2011
  * Time: 10:16:15 PM
  */
-public class SeparateFilterJoinsVisitor extends QueryModelVisitorBase<Exception> {
+public class SeparateFilterJoinsVisitor extends AbstractQueryModelVisitor<Exception> {
     @Override
     public void meet(final Filter node) throws Exception {
         super.meet(node);
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AbstractInferVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AbstractInferVisitor.java
index b1c7eb5..90cdf6e 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AbstractInferVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AbstractInferVisitor.java
@@ -22,11 +22,11 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
 import org.apache.rya.rdftriplestore.utils.TransitivePropertySP;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
 
 import static com.google.common.base.Preconditions.checkNotNull;
 
@@ -35,7 +35,7 @@
  * Date: Mar 14, 2012
  * Time: 5:33:01 PM
  */
-public class AbstractInferVisitor extends QueryModelVisitorBase<Exception> {
+public class AbstractInferVisitor extends AbstractQueryModelVisitor<Exception> {
 
     static Var EXPANDED = new Var("infer-expanded");
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitor.java
index 26ae289..d609ac6 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitor.java
@@ -25,12 +25,12 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Expands the query tree to account for any universal class expressions (property restrictions
@@ -80,7 +80,7 @@
         // Only applies to type queries where the type is defined
         if (predVar != null && RDF.TYPE.equals(predVar.getValue()) && objVar != null && objVar.getValue() instanceof Resource) {
             final Resource typeToInfer = (Resource) objVar.getValue();
-            Map<Resource, Set<URI>> relevantAvfRestrictions = inferenceEngine.getAllValuesFromByValueType(typeToInfer);
+            Map<Resource, Set<IRI>> relevantAvfRestrictions = inferenceEngine.getAllValuesFromByValueType(typeToInfer);
             if (!relevantAvfRestrictions.isEmpty()) {
                 // We can infer the queried type if, for an allValuesFrom restriction type
                 // associated  with the queried type, some anonymous neighboring node belongs to the
@@ -99,7 +99,7 @@
                 final FixedStatementPattern avfPropertyTypes = new FixedStatementPattern(avfTypeVar,
                         new Var(OWL.ONPROPERTY.stringValue(), OWL.ONPROPERTY), avfPredVar);
                 for (Resource avfRestrictionType : relevantAvfRestrictions.keySet()) {
-                    for (URI avfProperty : relevantAvfRestrictions.get(avfRestrictionType)) {
+                    for (IRI avfProperty : relevantAvfRestrictions.get(avfRestrictionType)) {
                         avfPropertyTypes.statements.add(new NullableStatementImpl(avfRestrictionType,
                                 OWL.ONPROPERTY, avfProperty));
                     }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DoNotExpandSP.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DoNotExpandSP.java
index 717e48a..22e7313 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DoNotExpandSP.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DoNotExpandSP.java
@@ -19,10 +19,8 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Class DoNotExpandSP
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitor.java
index 6445286..b13398e 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitor.java
@@ -24,12 +24,12 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Expands the query tree to account for any relevant domain and range information known to the
@@ -72,12 +72,12 @@
         final Var contextVar = node.getContextVar();
         // Only applies to statement patterns that query for members of a defined type.
         if (predVar != null && RDF.TYPE.equals(predVar.getValue())
-                && objVar != null && objVar.getValue() instanceof URI) {
-            final URI inferredType = (URI) objVar.getValue();
+                && objVar != null && objVar.getValue() instanceof IRI) {
+            final IRI inferredType = (IRI) objVar.getValue();
             // Preserve the original node so explicit type assertions are still matched:
             TupleExpr currentNode = node.clone();
             // If there are any properties with this type as domain, check for appropriate triples:
-            final Set<URI> domainProperties = inferenceEngine.getPropertiesWithDomain(inferredType);
+            final Set<IRI> domainProperties = inferenceEngine.getPropertiesWithDomain(inferredType);
             if (!domainProperties.isEmpty()) {
                 Var domainPredVar = new Var("p-" + UUID.randomUUID());
                 Var domainObjVar = new Var("o-" + UUID.randomUUID());
@@ -86,14 +86,14 @@
                 StatementPattern domainSP = new DoNotExpandSP(subjVar, domainPredVar, domainObjVar, contextVar);
                 // Enumerate predicates having this type as domain
                 FixedStatementPattern domainFSP = new FixedStatementPattern(domainPredVar, domainVar, objVar);
-                for (URI property : domainProperties) {
+                for (IRI property : domainProperties) {
                     domainFSP.statements.add(new NullableStatementImpl(property, RDFS.DOMAIN, inferredType));
                 }
                 // For each such predicate, any triple <subjVar predicate _:any> implies the type
                 currentNode = new InferUnion(currentNode, new InferJoin(domainFSP, domainSP));
             }
             // If there are any properties with this type as range, check for appropriate triples:
-            final Set<URI> rangeProperties = inferenceEngine.getPropertiesWithRange(inferredType);
+            final Set<IRI> rangeProperties = inferenceEngine.getPropertiesWithRange(inferredType);
             if (!rangeProperties.isEmpty()) {
                 Var rangePredVar = new Var("p-" + UUID.randomUUID());
                 Var rangeSubjVar = new Var("s-" + UUID.randomUUID());
@@ -102,7 +102,7 @@
                 StatementPattern rangeSP = new DoNotExpandSP(rangeSubjVar, rangePredVar, subjVar, contextVar);
                 // Enumerate predicates having this type as range
                 FixedStatementPattern rangeFSP = new FixedStatementPattern(rangePredVar, rangeVar, objVar);
-                for (URI property : rangeProperties) {
+                for (IRI property : rangeProperties) {
                     rangeFSP.statements.add(new NullableStatementImpl(property, RDFS.RANGE, inferredType));
                 }
                 // For each such predicate, any triple <_:any predicate subjVar> implies the type
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitor.java
index 3077eb4..43eae4a 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitor.java
@@ -19,13 +19,13 @@
 package org.apache.rya.rdftriplestore.inference;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Expands the query tree to account for any relevant has-self class expressions
@@ -61,15 +61,15 @@
 
     @Override
     protected void meetSP(final StatementPattern node) throws Exception {
-        final URI pred = (URI) node.getPredicateVar().getValue();
+        final IRI pred = (IRI) node.getPredicateVar().getValue();
         final Var obj = node.getObjectVar();
         //if originalSP like (?s rdf:type :C1):  require that C1 is defined, i.e. not a variable
         // node <- originalSP
         final StatementPattern clone = node.clone();
         if (RDF.TYPE.equals(pred) && obj.isConstant()) {
             //for property in getHasSelfImplyingType(C1):
-            if (obj.getValue() instanceof URI) {
-                for (final URI property : inferenceEngine.getHasSelfImplyingType((URI) obj.getValue())) {
+            if (obj.getValue() instanceof IRI) {
+                for (final IRI property : inferenceEngine.getHasSelfImplyingType((IRI) obj.getValue())) {
                     //node <- InferUnion(node, StatementPattern(?s, property, ?s)).
                     final InferUnion union = new InferUnion(clone,
                             new StatementPattern(clone.getSubjectVar(),
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasValueVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasValueVisitor.java
index 43ca579..0bcbc6b 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasValueVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/HasValueVisitor.java
@@ -25,14 +25,14 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Expands the query tree to account for any relevant has-value class
@@ -94,17 +94,17 @@
         // { ?var rdf:type :Restriction } and { ?var :property ?value }
         // Both require defined predicate
         if (predVar != null && predVar.getValue() != null) {
-            final URI predURI = (URI) predVar.getValue();
+            final IRI predURI = (IRI) predVar.getValue();
             if (RDF.TYPE.equals(predURI) && objVar != null && objVar.getValue() != null
                     && objVar.getValue() instanceof Resource) {
                 // If the predicate is rdf:type and the type is specified, check whether it can be
                 // inferred using any hasValue restriction(s)
                 final Resource objType = (Resource) objVar.getValue();
-                final Map<URI, Set<Value>> sufficientValues = inferenceEngine.getHasValueByType(objType);
+                final Map<IRI, Set<Value>> sufficientValues = inferenceEngine.getHasValueByType(objType);
                 if (sufficientValues.size() > 0) {
                     final Var valueVar = new Var("v-" + UUID.randomUUID());
                     TupleExpr currentNode = node.clone();
-                    for (URI property : sufficientValues.keySet()) {
+                    for (IRI property : sufficientValues.keySet()) {
                         final Var propVar = new Var(property.toString(), property);
                         final TupleExpr valueSP = new DoNotExpandSP(subjVar, propVar, valueVar);
                         final FixedStatementPattern relevantValues = new FixedStatementPattern(objVar, propVar, valueVar);
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferJoin.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferJoin.java
index de18e14..4e1ea77 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferJoin.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferJoin.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.TupleExpr;
-
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+
 /**
  * Class InferJoin
  * Date: Apr 16, 2011
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferUnion.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferUnion.java
index f783881..10390df 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferUnion.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferUnion.java
@@ -19,14 +19,12 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+
 /**
  * Class InferUnion
  * Date: Mar 14, 2012
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferenceEngine.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferenceEngine.java
index 86359f0..8d6feb6 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferenceEngine.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InferenceEngine.java
@@ -52,24 +52,22 @@
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.helpers.RDFHandlerBase;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
 
 import com.google.common.collect.Sets;
 
-import info.aduna.iteration.CloseableIteration;
-
 /**
  * Will pull down inference relationships from dao every x seconds. <br>
  * Will infer extra relationships. <br>
@@ -77,9 +75,9 @@
  */
 public class InferenceEngine {
     private static final Logger log = Logger.getLogger(InferenceEngine.class);
-    private static final ValueFactory VF = ValueFactoryImpl.getInstance();
-    private static final URI HAS_SELF = VF.createURI(OWL.NAMESPACE, "hasSelf");
-    private static final URI REFLEXIVE_PROPERTY = VF.createURI(OWL.NAMESPACE, "ReflexiveProperty");
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final IRI HAS_SELF = VF.createIRI(OWL.NAMESPACE, "hasSelf");
+    private static final IRI REFLEXIVE_PROPERTY = VF.createIRI(OWL.NAMESPACE, "ReflexiveProperty");
     public static final String URI_PROP = "uri";
 
     private final ReentrantLock refreshLock = new ReentrantLock();
@@ -87,22 +85,22 @@
     private final AtomicReference<Graph> subClassOfGraph = new AtomicReference<>();
     private final AtomicReference<Graph> subPropertyOfGraph = new AtomicReference<>();
 
-    private final Set<URI> symmetricPropertySet = ConcurrentHashMap.newKeySet();;
-    private final Map<URI, URI> inverseOfMap = new ConcurrentHashMap<>();
-    private final Set<URI> transitivePropertySet = ConcurrentHashMap.newKeySet();;
-    private final Set<URI> reflexivePropertySet = ConcurrentHashMap.newKeySet();;
-    private final Map<URI, Set<URI>> domainByType = new ConcurrentHashMap<>();
-    private final Map<URI, Set<URI>> rangeByType = new ConcurrentHashMap<>();
-    private final Map<Resource, Map<URI, Value>> hasValueByType = new ConcurrentHashMap<>();
-    private final Map<URI, Map<Resource, Value>> hasValueByProperty = new ConcurrentHashMap<>();
-    private final Map<Resource, Map<Resource, URI>> someValuesFromByRestrictionType = new ConcurrentHashMap<>();
-    private final Map<Resource, Map<Resource, URI>> allValuesFromByValueType = new ConcurrentHashMap<>();
+    private final Set<IRI> symmetricPropertySet = ConcurrentHashMap.newKeySet();;
+    private final Map<IRI, IRI> inverseOfMap = new ConcurrentHashMap<>();
+    private final Set<IRI> transitivePropertySet = ConcurrentHashMap.newKeySet();;
+    private final Set<IRI> reflexivePropertySet = ConcurrentHashMap.newKeySet();;
+    private final Map<IRI, Set<IRI>> domainByType = new ConcurrentHashMap<>();
+    private final Map<IRI, Set<IRI>> rangeByType = new ConcurrentHashMap<>();
+    private final Map<Resource, Map<IRI, Value>> hasValueByType = new ConcurrentHashMap<>();
+    private final Map<IRI, Map<Resource, Value>> hasValueByProperty = new ConcurrentHashMap<>();
+    private final Map<Resource, Map<Resource, IRI>> someValuesFromByRestrictionType = new ConcurrentHashMap<>();
+    private final Map<Resource, Map<Resource, IRI>> allValuesFromByValueType = new ConcurrentHashMap<>();
     private final Map<Resource, List<Set<Resource>>> intersections = new ConcurrentHashMap<>();
     private final Map<Resource, Set<Resource>> enumerations = new ConcurrentHashMap<>();
-    private final Map<URI, List<URI>> propertyChainPropertyToChain = new ConcurrentHashMap<>();
+    private final Map<IRI, List<IRI>> propertyChainPropertyToChain = new ConcurrentHashMap<>();
     // hasSelf maps.
-    private final Map<URI, Set<Resource>> hasSelfByProperty = new ConcurrentHashMap<>();
-    private final Map<Resource, Set<URI>> hasSelfByType = new ConcurrentHashMap<>();
+    private final Map<IRI, Set<Resource>> hasSelfByProperty = new ConcurrentHashMap<>();
+    private final Map<Resource, Set<IRI>> hasSelfByType = new ConcurrentHashMap<>();
 
     private RyaDAO<?> ryaDAO;
     private RdfCloudTripleStoreConfiguration conf;
@@ -207,13 +205,13 @@
      * to have few members, such as ontology vocabulary terms, as instances will be collected in
      * memory.
      */
-    private Set<URI> fetchInstances(final URI type) throws QueryEvaluationException {
-        final Set<URI> instances = new HashSet<>();
-        ryaDaoQueryWrapper.queryAll(null, RDF.TYPE, type, new RDFHandlerBase() {
+    private Set<IRI> fetchInstances(final IRI type) throws QueryEvaluationException {
+        final Set<IRI> instances = new HashSet<>();
+        ryaDaoQueryWrapper.queryAll(null, RDF.TYPE, type, new AbstractRDFHandler() {
             @Override
             public void handleStatement(final Statement st) throws RDFHandlerException {
-                if (st.getSubject() instanceof URI) {
-                    instances.add((URI) st.getSubject());
+                if (st.getSubject() instanceof IRI) {
+                    instances.add((IRI) st.getSubject());
                 }
             }
         });
@@ -231,7 +229,7 @@
      * @param edgeName Label that will be given to all added edges
      * @throws QueryEvaluationException
      */
-    private void addPredicateEdges(final URI predicate, final Direction dir, final Graph graph, final String edgeName)
+    private void addPredicateEdges(final IRI predicate, final Direction dir, final Graph graph, final String edgeName)
             throws QueryEvaluationException {
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO,
                 null, predicate, null, conf);
@@ -242,7 +240,7 @@
                     addStatementEdge(graph, edgeName, st);
                 }
                 if (Direction.IN.equals(dir) || Direction.BOTH.equals(dir)) {
-                    addStatementEdge(graph, edgeName, new StatementImpl((Resource) st.getObject(),
+                    addStatementEdge(graph, edgeName, VF.createStatement((Resource) st.getObject(),
                             st.getPredicate(), st.getSubject()));
                 }
             }
@@ -309,12 +307,12 @@
 
     private void refreshInverseOf() throws QueryEvaluationException {
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, null, OWL.INVERSEOF, null, conf);
-        final Map<URI, URI> invProp = new HashMap<>();
+        final Map<IRI, IRI> invProp = new HashMap<>();
         try {
             while (iter.hasNext()) {
                 final Statement st = iter.next();
-                invProp.put((URI) st.getSubject(), (URI) st.getObject());
-                invProp.put((URI) st.getObject(), (URI) st.getSubject());
+                invProp.put((IRI) st.getSubject(), (IRI) st.getObject());
+                invProp.put((IRI) st.getObject(), (IRI) st.getSubject());
             }
         } finally {
             if (iter != null) {
@@ -329,14 +327,14 @@
 
     private void refreshPropertyChainPropertyToChain() throws QueryEvaluationException {
         CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, null,
-                VF.createURI("http://www.w3.org/2002/07/owl#propertyChainAxiom"),
+                VF.createIRI("http://www.w3.org/2002/07/owl#propertyChainAxiom"),
                 null, conf);
-        final Map<URI,URI> propertyChainPropertiesToBNodes = new HashMap<>();
-        final Map<URI, List<URI>> tempPropertyChainPropertyToChain = new HashMap<>();
+        final Map<IRI, IRI> propertyChainPropertiesToBNodes = new HashMap<>();
+        final Map<IRI, List<IRI>> tempPropertyChainPropertyToChain = new HashMap<>();
         try {
             while (iter.hasNext()){
                 final Statement st = iter.next();
-                propertyChainPropertiesToBNodes.put((URI)st.getSubject(), (URI)st.getObject());
+                propertyChainPropertiesToBNodes.put((IRI)st.getSubject(), (IRI)st.getObject());
             }
         } finally {
             if (iter != null) {
@@ -344,19 +342,19 @@
             }
         }
         // now for each property chain bNode, get the indexed list of properties associated with that chain
-        for (final URI propertyChainProperty : propertyChainPropertiesToBNodes.keySet()){
-            final URI bNode = propertyChainPropertiesToBNodes.get(propertyChainProperty);
+        for (final IRI propertyChainProperty : propertyChainPropertiesToBNodes.keySet()){
+            final IRI bNode = propertyChainPropertiesToBNodes.get(propertyChainProperty);
             // query for the list of indexed properties
-            iter = RyaDAOHelper.query(ryaDAO, bNode, VF.createURI("http://www.w3.org/2000/10/swap/list#index"),
+            iter = RyaDAOHelper.query(ryaDAO, bNode, VF.createIRI("http://www.w3.org/2000/10/swap/list#index"),
                     null, conf);
-            final TreeMap<Integer, URI> orderedProperties = new TreeMap<>();
+            final TreeMap<Integer, IRI> orderedProperties = new TreeMap<>();
             // TODO refactor this.  Wish I could execute sparql
             try {
                 while (iter.hasNext()){
                     final Statement st = iter.next();
                     final String indexedElement = st.getObject().stringValue();
                     log.info(indexedElement);
-                    CloseableIteration<Statement, QueryEvaluationException>  iter2 = RyaDAOHelper.query(ryaDAO, VF.createURI(st.getObject().stringValue()), RDF.FIRST,
+                    CloseableIteration<Statement, QueryEvaluationException>  iter2 = RyaDAOHelper.query(ryaDAO, VF.createIRI(st.getObject().stringValue()), RDF.FIRST,
                             null, conf);
                     String integerValue = "";
                     Value anonPropNode = null;
@@ -369,7 +367,7 @@
                         }
                         iter2.close();
                     }
-                    iter2 = RyaDAOHelper.query(ryaDAO, VF.createURI(st.getObject().stringValue()), RDF.REST,
+                    iter2 = RyaDAOHelper.query(ryaDAO, VF.createIRI(st.getObject().stringValue()), RDF.REST,
                             null, conf);
                     if (iter2 != null){
                         while (iter2.hasNext()){
@@ -379,7 +377,7 @@
                         }
                         iter2.close();
                         if (anonPropNode != null){
-                            iter2 = RyaDAOHelper.query(ryaDAO, VF.createURI(anonPropNode.stringValue()), RDF.FIRST,
+                            iter2 = RyaDAOHelper.query(ryaDAO, VF.createIRI(anonPropNode.stringValue()), RDF.FIRST,
                                     null, conf);
                             while (iter2.hasNext()){
                                 final Statement iter2Statement = iter2.next();
@@ -392,7 +390,7 @@
                     if (!integerValue.isEmpty() && propURI!=null) {
                         try {
                             final int indexValue = Integer.parseInt(integerValue);
-                            final URI chainPropURI = VF.createURI(propURI.stringValue());
+                            final IRI chainPropURI = VF.createIRI(propURI.stringValue());
                             orderedProperties.put(indexValue, chainPropURI);
                         }
                         catch (final Exception e){
@@ -405,44 +403,44 @@
                     iter.close();
                 }
             }
-            final List<URI> properties = new ArrayList<>();
-            for (final Map.Entry<Integer, URI> entry : orderedProperties.entrySet()){
+            final List<IRI> properties = new ArrayList<>();
+            for (final Map.Entry<Integer, IRI> entry : orderedProperties.entrySet()){
                 properties.add(entry.getValue());
             }
             tempPropertyChainPropertyToChain.put(propertyChainProperty, properties);
         }
 
         // could also be represented as a list of properties (some of which may be blank nodes)
-        for (final URI propertyChainProperty : propertyChainPropertiesToBNodes.keySet()){
-            final List<URI> existingChain = tempPropertyChainPropertyToChain.get(propertyChainProperty);
+        for (final IRI propertyChainProperty : propertyChainPropertiesToBNodes.keySet()){
+            final List<IRI> existingChain = tempPropertyChainPropertyToChain.get(propertyChainProperty);
             // if we didn't get a chain, try to get it through following the collection
             if ((existingChain == null) || existingChain.isEmpty()) {
 
                 CloseableIteration<Statement, QueryEvaluationException>  iter2 = RyaDAOHelper.query(ryaDAO, propertyChainPropertiesToBNodes.get(propertyChainProperty), RDF.FIRST,
                         null, conf);
-                final List<URI> properties = new ArrayList<>();
-                URI previousBNode = propertyChainPropertiesToBNodes.get(propertyChainProperty);
+                final List<IRI> properties = new ArrayList<>();
+                IRI previousBNode = propertyChainPropertiesToBNodes.get(propertyChainProperty);
                 if (iter2.hasNext()) {
                     Statement iter2Statement = iter2.next();
                     Value currentPropValue = iter2Statement.getObject();
                     while ((currentPropValue != null) && (!currentPropValue.stringValue().equalsIgnoreCase(RDF.NIL.stringValue()))){
-                        if (currentPropValue instanceof URI){
-                            iter2 = RyaDAOHelper.query(ryaDAO, VF.createURI(currentPropValue.stringValue()), RDF.FIRST,
+                        if (currentPropValue instanceof IRI){
+                            iter2 = RyaDAOHelper.query(ryaDAO, VF.createIRI(currentPropValue.stringValue()), RDF.FIRST,
                                     null, conf);
                             if (iter2.hasNext()){
                                 iter2Statement = iter2.next();
-                                if (iter2Statement.getObject() instanceof URI){
-                                    properties.add((URI)iter2Statement.getObject());
+                                if (iter2Statement.getObject() instanceof IRI){
+                                    properties.add((IRI)iter2Statement.getObject());
                                 }
                             }
                             // otherwise see if there is an inverse declaration
                             else {
-                                iter2 = RyaDAOHelper.query(ryaDAO, VF.createURI(currentPropValue.stringValue()), OWL.INVERSEOF,
+                                iter2 = RyaDAOHelper.query(ryaDAO, VF.createIRI(currentPropValue.stringValue()), OWL.INVERSEOF,
                                         null, conf);
                                 if (iter2.hasNext()){
                                     iter2Statement = iter2.next();
-                                    if (iter2Statement.getObject() instanceof URI){
-                                        properties.add(new InverseURI((URI)iter2Statement.getObject()));
+                                    if (iter2Statement.getObject() instanceof IRI){
+                                        properties.add(new InverseURI((IRI)iter2Statement.getObject()));
                                     }
                                 }
                             }
@@ -451,7 +449,7 @@
                                     null, conf);
                             if (iter2.hasNext()){
                                 iter2Statement = iter2.next();
-                                previousBNode = (URI)currentPropValue;
+                                previousBNode = (IRI)currentPropValue;
                                 currentPropValue = iter2Statement.getObject();
                             }
                             else {
@@ -490,8 +488,8 @@
      * @throws QueryEvaluationException
      */
     private void refreshDomainRange() throws QueryEvaluationException {
-        final Map<URI, Set<URI>> domainByTypePartial = new ConcurrentHashMap<>();
-        final Map<URI, Set<URI>> rangeByTypePartial = new ConcurrentHashMap<>();
+        final Map<IRI, Set<IRI>> domainByTypePartial = new ConcurrentHashMap<>();
+        final Map<IRI, Set<IRI>> rangeByTypePartial = new ConcurrentHashMap<>();
         // First, populate domain and range based on direct domain/range triples.
         CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, null, RDFS.DOMAIN, null, conf);
         try {
@@ -499,11 +497,11 @@
                 final Statement st = iter.next();
                 final Resource property = st.getSubject();
                 final Value domainType = st.getObject();
-                if (domainType instanceof URI && property instanceof URI) {
+                if (domainType instanceof IRI && property instanceof IRI) {
                     if (!domainByTypePartial.containsKey(domainType)) {
-                        domainByTypePartial.put((URI) domainType, new HashSet<>());
+                        domainByTypePartial.put((IRI) domainType, new HashSet<>());
                     }
-                    domainByTypePartial.get(domainType).add((URI) property);
+                    domainByTypePartial.get(domainType).add((IRI) property);
                 }
             }
         } finally {
@@ -517,11 +515,11 @@
                 final Statement st = iter.next();
                 final Resource property = st.getSubject();
                 final Value rangeType = st.getObject();
-                if (rangeType instanceof URI && property instanceof URI) {
+                if (rangeType instanceof IRI && property instanceof IRI) {
                     if (!rangeByTypePartial.containsKey(rangeType)) {
-                        rangeByTypePartial.put((URI) rangeType, new HashSet<>());
+                        rangeByTypePartial.put((IRI) rangeType, new HashSet<>());
                     }
-                    rangeByTypePartial.get(rangeType).add((URI) property);
+                    rangeByTypePartial.get(rangeType).add((IRI) property);
                 }
             }
         } finally {
@@ -531,26 +529,26 @@
         }
         // Then combine with the subclass/subproperty graphs and the inverse property map to compute
         // the closure of domain and range per class.
-        final Set<URI> domainRangeTypeSet = new HashSet<>(domainByTypePartial.keySet());
+        final Set<IRI> domainRangeTypeSet = new HashSet<>(domainByTypePartial.keySet());
         domainRangeTypeSet.addAll(rangeByTypePartial.keySet());
         // Extend to subproperties: make sure that using a more specific form of a property
         // still triggers its domain/range inferences.
         // Mirror for inverse properties: make sure that using the inverse form of a property
         // triggers the inverse domain/range inferences.
         // These two rules can recursively trigger one another.
-        for (final URI domainRangeType : domainRangeTypeSet) {
-            final Set<URI> propertiesWithDomain = domainByTypePartial.getOrDefault(domainRangeType, new HashSet<>());
-            final Set<URI> propertiesWithRange = rangeByTypePartial.getOrDefault(domainRangeType, new HashSet<>());
+        for (final IRI domainRangeType : domainRangeTypeSet) {
+            final Set<IRI> propertiesWithDomain = domainByTypePartial.getOrDefault(domainRangeType, new HashSet<>());
+            final Set<IRI> propertiesWithRange = rangeByTypePartial.getOrDefault(domainRangeType, new HashSet<>());
             // Since findParents will traverse the subproperty graph and find all indirect
             // subproperties, the subproperty rule does not need to trigger itself directly.
             // And since no more than one inverseOf relationship is stored for any property, the
             // inverse property rule does not need to trigger itself directly. However, each rule
             // can trigger the other, so keep track of how the inferred domains/ranges were
             // discovered so we can apply only those rules that might yield new information.
-            final Stack<URI> domainViaSuperProperty  = new Stack<>();
-            final Stack<URI> rangeViaSuperProperty  = new Stack<>();
-            final Stack<URI> domainViaInverseProperty  = new Stack<>();
-            final Stack<URI> rangeViaInverseProperty  = new Stack<>();
+            final Stack<IRI> domainViaSuperProperty  = new Stack<>();
+            final Stack<IRI> rangeViaSuperProperty  = new Stack<>();
+            final Stack<IRI> domainViaInverseProperty  = new Stack<>();
+            final Stack<IRI> rangeViaInverseProperty  = new Stack<>();
             // Start with the direct domain/range assertions, which can trigger any rule.
             domainViaSuperProperty.addAll(propertiesWithDomain);
             domainViaInverseProperty.addAll(propertiesWithDomain);
@@ -563,8 +561,8 @@
                 // For a type c and property p, if c is a domain of p, then c is the range of any
                 // inverse of p. Would be redundant for properties discovered via inverseOf.
                 while (!domainViaSuperProperty.isEmpty()) {
-                    final URI property = domainViaSuperProperty.pop();
-                    final URI inverseProperty = findInverseOf(property);
+                    final IRI property = domainViaSuperProperty.pop();
+                    final IRI inverseProperty = findInverseOf(property);
                     if (inverseProperty != null && propertiesWithRange.add(inverseProperty)) {
                         rangeViaInverseProperty.push(inverseProperty);
                     }
@@ -572,8 +570,8 @@
                 // For a type c and property p, if c is a range of p, then c is the domain of any
                 // inverse of p. Would be redundant for properties discovered via inverseOf.
                 while (!rangeViaSuperProperty.isEmpty()) {
-                    final URI property = rangeViaSuperProperty.pop();
-                    final URI inverseProperty = findInverseOf(property);
+                    final IRI property = rangeViaSuperProperty.pop();
+                    final IRI inverseProperty = findInverseOf(property);
                     if (inverseProperty != null && propertiesWithDomain.add(inverseProperty)) {
                         domainViaInverseProperty.push(inverseProperty);
                     }
@@ -581,8 +579,8 @@
                 // For a type c and property p, if c is a domain of p, then c is also a domain of
                 // p's subproperties. Would be redundant for properties discovered via this rule.
                 while (!domainViaInverseProperty.isEmpty()) {
-                    final URI property = domainViaInverseProperty.pop();
-                    final Set<URI> subProperties = getSubProperties(property);
+                    final IRI property = domainViaInverseProperty.pop();
+                    final Set<IRI> subProperties = getSubProperties(property);
                     subProperties.removeAll(propertiesWithDomain);
                     propertiesWithDomain.addAll(subProperties);
                     domainViaSuperProperty.addAll(subProperties);
@@ -590,8 +588,8 @@
                 // For a type c and property p, if c is a range of p, then c is also a range of
                 // p's subproperties. Would be redundant for properties discovered via this rule.
                 while (!rangeViaInverseProperty.isEmpty()) {
-                    final URI property = rangeViaInverseProperty.pop();
-                    final Set<URI> subProperties = getSubProperties(property);
+                    final IRI property = rangeViaInverseProperty.pop();
+                    final Set<IRI> subProperties = getSubProperties(property);
                     subProperties.removeAll(propertiesWithRange);
                     propertiesWithRange.addAll(subProperties);
                     rangeViaSuperProperty.addAll(subProperties);
@@ -607,23 +605,23 @@
         // Once all properties have been found for each domain/range class, extend to superclasses:
         // make sure that the consequent of a domain/range inference goes on to apply any more
         // general classes as well.
-        for (final URI subtype : domainRangeTypeSet) {
-            final Set<URI> supertypes = getSuperClasses(subtype);
-            final Set<URI> propertiesWithDomain = domainByTypePartial.getOrDefault(subtype, new HashSet<>());
-            final Set<URI> propertiesWithRange = rangeByTypePartial.getOrDefault(subtype, new HashSet<>());
-            for (final URI supertype : supertypes) {
+        for (final IRI subtype : domainRangeTypeSet) {
+            final Set<IRI> supertypes = getSuperClasses(subtype);
+            final Set<IRI> propertiesWithDomain = domainByTypePartial.getOrDefault(subtype, new HashSet<>());
+            final Set<IRI> propertiesWithRange = rangeByTypePartial.getOrDefault(subtype, new HashSet<>());
+            for (final IRI supertype : supertypes) {
                 // For a property p and its domain c: all of c's superclasses are also domains of p.
                 if (!propertiesWithDomain.isEmpty() && !domainByTypePartial.containsKey(supertype)) {
                     domainByTypePartial.put(supertype, new HashSet<>());
                 }
-                for (final URI property : propertiesWithDomain) {
+                for (final IRI property : propertiesWithDomain) {
                     domainByTypePartial.get(supertype).add(property);
                 }
                 // For a property p and its range c: all of c's superclasses are also ranges of p.
                 if (!propertiesWithRange.isEmpty() && !rangeByTypePartial.containsKey(supertype)) {
                     rangeByTypePartial.put(supertype, new HashSet<>());
                 }
-                for (final URI property : propertiesWithRange) {
+                for (final IRI property : propertiesWithRange) {
                     rangeByTypePartial.get(supertype).add(property);
                 }
             }
@@ -641,11 +639,11 @@
     private void refreshPropertyRestrictions() throws QueryEvaluationException {
         // Get a set of all property restrictions of any type
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, null, OWL.ONPROPERTY, null, conf);
-        final Map<Resource, URI> restrictions = new HashMap<>();
+        final Map<Resource, IRI> restrictions = new HashMap<>();
         try {
             while (iter.hasNext()) {
                 final Statement st = iter.next();
-                restrictions.put(st.getSubject(), (URI) st.getObject());
+                restrictions.put(st.getSubject(), (IRI) st.getObject());
             }
         } finally {
             if (iter != null) {
@@ -659,7 +657,7 @@
         refreshHasSelfRestrictions(restrictions);
     }
 
-    private void refreshHasValueRestrictions(final Map<Resource, URI> restrictions) throws QueryEvaluationException {
+    private void refreshHasValueRestrictions(final Map<Resource, IRI> restrictions) throws QueryEvaluationException {
         hasValueByType.clear();
         hasValueByProperty.clear();
         final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, null, OWL.HASVALUE, null, conf);
@@ -668,7 +666,7 @@
                 final Statement st = iter.next();
                 final Resource restrictionClass = st.getSubject();
                 if (restrictions.containsKey(restrictionClass)) {
-                    final URI property = restrictions.get(restrictionClass);
+                    final IRI property = restrictions.get(restrictionClass);
                     final Value value = st.getObject();
                     if (!hasValueByType.containsKey(restrictionClass)) {
                         hasValueByType.put(restrictionClass, new HashMap<>());
@@ -687,20 +685,20 @@
         }
     }
 
-    private void refreshSomeValuesFromRestrictions(final Map<Resource, URI> restrictions) throws QueryEvaluationException {
+    private void refreshSomeValuesFromRestrictions(final Map<Resource, IRI> restrictions) throws QueryEvaluationException {
         someValuesFromByRestrictionType.clear();
-        ryaDaoQueryWrapper.queryAll(null, OWL.SOMEVALUESFROM, null, new RDFHandlerBase() {
+        ryaDaoQueryWrapper.queryAll(null, OWL.SOMEVALUESFROM, null, new AbstractRDFHandler() {
             @Override
             public void handleStatement(final Statement statement) throws RDFHandlerException {
                 final Resource restrictionClass = statement.getSubject();
                 if (restrictions.containsKey(restrictionClass) && statement.getObject() instanceof Resource) {
-                    final URI property = restrictions.get(restrictionClass);
+                    final IRI property = restrictions.get(restrictionClass);
                     final Resource valueClass = (Resource) statement.getObject();
                     // Should also be triggered by subclasses of the value class
                     final Set<Resource> valueClasses = new HashSet<>();
                     valueClasses.add(valueClass);
-                    if (valueClass instanceof URI) {
-                        valueClasses.addAll(getSubClasses((URI) valueClass));
+                    if (valueClass instanceof IRI) {
+                        valueClasses.addAll(getSubClasses((IRI) valueClass));
                     }
                     for (final Resource valueSubClass : valueClasses) {
                         if (!someValuesFromByRestrictionType.containsKey(restrictionClass)) {
@@ -713,20 +711,20 @@
         });
     }
 
-    private void refreshAllValuesFromRestrictions(final Map<Resource, URI> restrictions) throws QueryEvaluationException {
+    private void refreshAllValuesFromRestrictions(final Map<Resource, IRI> restrictions) throws QueryEvaluationException {
         allValuesFromByValueType.clear();
-        ryaDaoQueryWrapper.queryAll(null, OWL.ALLVALUESFROM, null, new RDFHandlerBase() {
+        ryaDaoQueryWrapper.queryAll(null, OWL.ALLVALUESFROM, null, new AbstractRDFHandler() {
             @Override
             public void handleStatement(final Statement statement) throws RDFHandlerException {
                 final Resource directRestrictionClass = statement.getSubject();
                 if (restrictions.containsKey(directRestrictionClass) && statement.getObject() instanceof Resource) {
-                    final URI property = restrictions.get(directRestrictionClass);
+                    final IRI property = restrictions.get(directRestrictionClass);
                     final Resource valueClass = (Resource) statement.getObject();
                     // Should also be triggered by subclasses of the property restriction
                     final Set<Resource> restrictionClasses = new HashSet<>();
                     restrictionClasses.add(directRestrictionClass);
-                    if (directRestrictionClass instanceof URI) {
-                        restrictionClasses.addAll(getSubClasses((URI) directRestrictionClass));
+                    if (directRestrictionClass instanceof IRI) {
+                        restrictionClasses.addAll(getSubClasses((IRI) directRestrictionClass));
                     }
                     for (final Resource restrictionClass : restrictionClasses) {
                         if (!allValuesFromByValueType.containsKey(valueClass)) {
@@ -739,16 +737,16 @@
         });
     }
 
-    private void refreshHasSelfRestrictions(final Map<Resource, URI> restrictions) throws QueryEvaluationException {
+    private void refreshHasSelfRestrictions(final Map<Resource, IRI> restrictions) throws QueryEvaluationException {
         hasSelfByType.clear();
         hasSelfByProperty.clear();
 
         for(final Resource type : restrictions.keySet()) {
-            final URI property = restrictions.get(type);
+            final IRI property = restrictions.get(type);
             final CloseableIteration<Statement, QueryEvaluationException> iter = RyaDAOHelper.query(ryaDAO, type, HAS_SELF, null, conf);
             try {
                 if (iter.hasNext()) {
-                    Set<URI> typeSet = hasSelfByType.get(type);
+                    Set<IRI> typeSet = hasSelfByType.get(type);
                     Set<Resource> propSet = hasSelfByProperty.get(property);
 
                     if (typeSet == null) {
@@ -784,12 +782,12 @@
         //  _:bnode1 rdf:rest _:bnode2 .
         // _:bnode2 rdf:first <:C> .
         // _:bnode2 rdf:rest rdf:nil .
-        ryaDaoQueryWrapper.queryAll(null, OWL.INTERSECTIONOF, null, new RDFHandlerBase() {
+        ryaDaoQueryWrapper.queryAll(null, OWL.INTERSECTIONOF, null, new AbstractRDFHandler() {
             @Override
             public void handleStatement(final Statement statement) throws RDFHandlerException {
                 final Resource type = statement.getSubject();
                 // head will point to a type that is part of the intersection.
-                final URI head = (URI) statement.getObject();
+                final IRI head = (IRI) statement.getObject();
                 if (!intersectionsProp.containsKey(type)) {
                     intersectionsProp.put(type, new ArrayList<Set<Resource>>());
                 }
@@ -840,8 +838,8 @@
             final Resource type = entry.getKey();
             final List<Set<Resource>> intersectionList = entry.getValue();
 
-            final Set<URI> superClasses = getSuperClasses((URI) type);
-            for (final URI superClass : superClasses) {
+            final Set<IRI> superClasses = getSuperClasses((IRI) type);
+            for (final IRI superClass : superClasses) {
                 // Add intersections to super classes if applicable.
                 // IF:
                 // :A intersectionOf[:B, :C]
@@ -881,12 +879,12 @@
         //  _:bnode1 rdf:rest _:bnode2 .
         // _:bnode2 rdf:first <:C> .
         // _:bnode2 rdf:rest rdf:nil .
-        ryaDaoQueryWrapper.queryAll(null, OWL.ONEOF, null, new RDFHandlerBase() {
+        ryaDaoQueryWrapper.queryAll(null, OWL.ONEOF, null, new AbstractRDFHandler() {
             @Override
             public void handleStatement(final Statement statement) throws RDFHandlerException {
                 final Resource enumType = statement.getSubject();
                 // listHead will point to a type class of the enumeration.
-                final URI listHead = (URI) statement.getObject();
+                final IRI listHead = (IRI) statement.getObject();
                 if (!enumTypes.containsKey(enumType)) {
                     enumTypes.put(enumType, new LinkedHashSet<Resource>());
                 }
@@ -926,17 +924,17 @@
      *         resource has that value for that property, it is implied to
      *         belong to the type.
      */
-    public Set<URI> getHasSelfImplyingType(final Resource type){
+    public Set<IRI> getHasSelfImplyingType(final Resource type){
         // return properties that imply this type if reflexive
-        final Set<URI> properties = new HashSet<>();
-        Set<URI> tempProperties = hasSelfByType.get(type);
+        final Set<IRI> properties = new HashSet<>();
+        Set<IRI> tempProperties = hasSelfByType.get(type);
 
         if (tempProperties != null) {
             properties.addAll(tempProperties);
         }
         //findParent gets all subclasses, add self.
-        if (type instanceof URI) {
-            for (final URI subtype : findParents(subClassOfGraph.get(), (URI) type)) {
+        if (type instanceof IRI) {
+            for (final IRI subtype : findParents(subClassOfGraph.get(), (IRI) type)) {
                 tempProperties = hasSelfByType.get(subtype);
                 if (tempProperties != null) {
                     properties.addAll(tempProperties);
@@ -957,7 +955,7 @@
      * @param property The property whose owl:hasSelf restrictions to return
      * @return A set of types that possess the implied property.
      */
-    public Set<Resource> getHasSelfImplyingProperty(final URI property) {
+    public Set<Resource> getHasSelfImplyingProperty(final IRI property) {
         // return types that imply this type if reflexive
         final Set<Resource> types = new HashSet<>();
         final Set<Resource> baseTypes = hasSelfByProperty.get(property);
@@ -966,8 +964,8 @@
             types.addAll(baseTypes);
             // findParent gets all subclasses, add self.
             for (final Resource baseType : baseTypes) {
-                if (baseType instanceof URI) {
-                    types.addAll(findParents(subClassOfGraph.get(), (URI) baseType));
+                if (baseType instanceof IRI) {
+                    types.addAll(findParents(subClassOfGraph.get(), (IRI) baseType));
                 }
             }
         }
@@ -992,28 +990,28 @@
      * @return the {@link List} of {@link Resource}s.
      * @throws QueryEvaluationException
      */
-    private List<Resource> getList(final URI firstItem) throws QueryEvaluationException {
-        URI head = firstItem;
+    private List<Resource> getList(final IRI firstItem) throws QueryEvaluationException {
+        IRI head = firstItem;
         final List<Resource> list = new ArrayList<>();
         // Go through and find all bnodes that are part of the defined list.
         while (!RDF.NIL.equals(head)) {
             // rdf.first will point to a type item that is in the list.
-            ryaDaoQueryWrapper.queryFirst(head, RDF.FIRST, null, new RDFHandlerBase() {
+            ryaDaoQueryWrapper.queryFirst(head, RDF.FIRST, null, new AbstractRDFHandler() {
                 @Override
                 public void handleStatement(final Statement statement) throws RDFHandlerException {
                     // The object found in the query represents a type
                     // that should be included in the list.
-                    final URI object = (URI) statement.getObject();
+                    final IRI object = (IRI) statement.getObject();
                     list.add(object);
                 }
             });
-            final MutableObject<URI> headHolder = new MutableObject<>();
+            final MutableObject<IRI> headHolder = new MutableObject<>();
             // rdf.rest will point to the next bnode that's part of the list.
-            ryaDaoQueryWrapper.queryFirst(head, RDF.REST, null, new RDFHandlerBase() {
+            ryaDaoQueryWrapper.queryFirst(head, RDF.REST, null, new AbstractRDFHandler() {
                 @Override
                 public void handleStatement(final Statement statement) throws RDFHandlerException {
                     // This object is the next bnode head to look for.
-                    final URI object = (URI) statement.getObject();
+                    final IRI object = (IRI) statement.getObject();
                     headHolder.setValue(object);
                 }
             });
@@ -1029,7 +1027,7 @@
     }
 
     private void addSubClassOf(final Resource s, final Resource o) {
-        final Statement statement = new StatementImpl(s, RDFS.SUBCLASSOF, o);
+        final Statement statement = VF.createStatement(s, RDFS.SUBCLASSOF, o);
         final String edgeName = RDFS.SUBCLASSOF.stringValue();
 
         addStatementEdge(subClassOfGraph.get(), edgeName, statement);
@@ -1075,48 +1073,48 @@
     /**
      * Returns all super class types of the specified type based on the
      * internal subclass graph.
-     * @param type the type {@link URI} to find super classes for.
-     * @return the {@link Set} of {@link URI} types that are super classes types
+     * @param type the type {@link IRI} to find super classes for.
+     * @return the {@link Set} of {@link IRI} types that are super classes types
      * of the specified {@code type}. Returns an empty set if nothing was found,
      * or if either type or the subclass graph is {@code null}.
      */
-    public Set<URI> getSuperClasses(final URI type) {
+    public Set<IRI> getSuperClasses(final IRI type) {
         return findChildren(subClassOfGraph.get(), type);
     }
 
     /**
      * Returns all sub class types of the specified type based on the
      * internal subclass graph.
-     * @param type the type {@link URI} to find sub classes for.
-     * @return the {@link Set} of {@link URI} types that are sub classes types
+     * @param type the type {@link IRI} to find sub classes for.
+     * @return the {@link Set} of {@link IRI} types that are sub classes types
      * of the specified {@code type}. Returns an empty set if nothing was found,
      * or if either type or the subclass graph is {@code null}.
      */
-    public Set<URI> getSubClasses(final URI type) {
+    public Set<IRI> getSubClasses(final IRI type) {
         return findParents(subClassOfGraph.get(), type);
     }
 
     /**
      * Returns all superproperties of the specified property based on the
      * internal subproperty graph.
-     * @param property the property {@link URI} to find superproperties for.
-     * @return the {@link Set} of {@link URI} properties that are superproperties
+     * @param property the property {@link IRI} to find superproperties for.
+     * @return the {@link Set} of {@link IRI} properties that are superproperties
      * of the specified {@code property}. Returns an empty set if nothing was found,
      * or if either property or the subproperty graph is {@code null}.
      */
-    public Set<URI> getSuperProperties(final URI property) {
+    public Set<IRI> getSuperProperties(final IRI property) {
         return findChildren(subPropertyOfGraph.get(), property);
     }
 
     /**
      * Returns all subproperties of the specified property based on the
      * internal subproperty graph.
-     * @param property the property {@link URI} to find subproperties for.
-     * @return the {@link Set} of {@link URI} properties that are subproperties
+     * @param property the property {@link IRI} to find subproperties for.
+     * @return the {@link Set} of {@link IRI} properties that are subproperties
      * of the specified {@code property}. Returns an empty set if nothing was found,
      * or if either property or the subproperty graph is {@code null}.
      */
-    public Set<URI> getSubProperties(final URI property) {
+    public Set<IRI> getSubProperties(final IRI property) {
         return findParents(subPropertyOfGraph.get(), property);
     }
 
@@ -1128,7 +1126,7 @@
      * @return The set of predecessors, or an empty set if none are found or if
      *      either argument is {@code null}
      */
-    public static Set<URI> findParents(final Graph graph, final URI vertexId) {
+    public static Set<IRI> findParents(final Graph graph, final IRI vertexId) {
         return findParents(graph, vertexId, true);
     }
 
@@ -1141,7 +1139,7 @@
      * @return The set of predecessors, or an empty set if none are found or if
      *      either argument is {@code null}
      */
-    public static Set<URI> findParents(final Graph graph, final URI vertexId, final boolean isRecursive) {
+    public static Set<IRI> findParents(final Graph graph, final IRI vertexId, final boolean isRecursive) {
         return findConnected(graph, vertexId, Direction.IN, isRecursive);
     }
 
@@ -1153,7 +1151,7 @@
      * @return The set of successors, or an empty set if none are found or if
      *      either argument is {@code null}
      */
-    public static Set<URI> findChildren(final Graph graph, final URI vertexId) {
+    public static Set<IRI> findChildren(final Graph graph, final IRI vertexId) {
         return findChildren(graph, vertexId, true);
     }
 
@@ -1166,7 +1164,7 @@
      * @return The set of successors, or an empty set if none are found or if
      *      either argument is {@code null}
      */
-    public static Set<URI> findChildren(final Graph graph, final URI vertexId, final boolean isRecursive) {
+    public static Set<IRI> findChildren(final Graph graph, final IRI vertexId, final boolean isRecursive) {
         return findConnected(graph, vertexId, Direction.OUT, isRecursive);
     }
 
@@ -1182,8 +1180,8 @@
      * @return The set of connected nodes, or an empty set if none are found, or
      *      if either the graph or the starting vertex are {@code null}.
      */
-    private static Set<URI> findConnected(final Graph graph, final URI vertexId, final Direction traversal, final boolean isRecursive) {
-        final Set<URI> connected = new HashSet<>();
+    private static Set<IRI> findConnected(final Graph graph, final IRI vertexId, final Direction traversal, final boolean isRecursive) {
+        final Set<IRI> connected = new HashSet<>();
         if (graph == null || vertexId == null) {
             return connected;
         }
@@ -1195,14 +1193,14 @@
         return connected;
     }
 
-    private static void addConnected(final Vertex v, final Set<URI> connected, final Direction traversal, final boolean isRecursive) {
+    private static void addConnected(final Vertex v, final Set<IRI> connected, final Direction traversal, final boolean isRecursive) {
         v.edges(traversal).forEachRemaining(edge -> {
             final Vertex ov = edge.vertices(traversal.opposite()).next();
             final Object o = ov.property(URI_PROP).value();
-            if (o != null && o instanceof URI) {
+            if (o != null && o instanceof IRI) {
                 final boolean contains = connected.contains(o);
                 if (!contains) {
-                    connected.add((URI) o);
+                    connected.add((IRI) o);
                     if (isRecursive) {
                         addConnected(ov, connected, traversal, isRecursive);
                     }
@@ -1211,15 +1209,15 @@
         });
     }
 
-    public boolean isSymmetricProperty(final URI prop) {
+    public boolean isSymmetricProperty(final IRI prop) {
         return (symmetricPropertySet != null) && symmetricPropertySet.contains(prop);
     }
 
-    public URI findInverseOf(final URI prop) {
+    public IRI findInverseOf(final IRI prop) {
         return (inverseOfMap != null) ? inverseOfMap.get(prop) : (null);
     }
 
-    public boolean isTransitiveProperty(final URI prop) {
+    public boolean isTransitiveProperty(final IRI prop) {
         return (transitivePropertySet != null) && transitivePropertySet.contains(prop);
     }
 
@@ -1228,14 +1226,14 @@
      * @param prop A URI
      * @return True if the given URI corresponds to an owl:ReflexiveProperty
      */
-    public boolean isReflexiveProperty(final URI prop) {
+    public boolean isReflexiveProperty(final IRI prop) {
         return (reflexivePropertySet != null) && reflexivePropertySet.contains(prop);
     }
 
     /**
      * TODO: This chaining can be slow at query execution. the other option is to perform this in the query itself, but that will be constrained to how many levels we decide to go
      */
-    public Set<Statement> findTransitiveProperty(final Resource subj, final URI prop, final Value obj, final Resource... contxts) throws InferenceEngineException {
+    public Set<Statement> findTransitiveProperty(final Resource subj, final IRI prop, final Value obj, final Resource... contxts) throws InferenceEngineException {
         if (transitivePropertySet.contains(prop)) {
             final Set<Statement> sts = new HashSet<>();
             final boolean goUp = subj == null;
@@ -1256,7 +1254,7 @@
         return sameAs;
     }
 
-    public CloseableIteration<Statement, QueryEvaluationException> queryDao(final Resource subject, final URI predicate, final Value object, final Resource... contexts) throws QueryEvaluationException {
+    public CloseableIteration<Statement, QueryEvaluationException> queryDao(final Resource subject, final IRI predicate, final Value object, final Resource... contexts) throws QueryEvaluationException {
         return RyaDAOHelper.query(ryaDAO, subject, predicate, object, conf, contexts);
     }
 
@@ -1305,13 +1303,13 @@
         }
     }
 
-    protected void chainTransitiveProperty(final Resource subj, final URI prop, final Value obj, final Value core, final Set<Statement> sts, final boolean goUp, final Resource[] contxts) throws InferenceEngineException {
+    protected void chainTransitiveProperty(final Resource subj, final IRI prop, final Value obj, final Value core, final Set<Statement> sts, final boolean goUp, final Resource[] contxts) throws InferenceEngineException {
         CloseableIteration<Statement, QueryEvaluationException> iter = null;
         try {
             iter = queryDao(subj, prop, obj, contxts);
             while (iter.hasNext()) {
                 final Statement st = iter.next();
-                sts.add(new StatementImpl((goUp) ? (st.getSubject()) : (Resource) (core), prop, (!goUp) ? (st.getObject()) : (core)));
+                sts.add(VF.createStatement((goUp) ? (st.getSubject()) : (Resource) (core), prop, (!goUp) ? (st.getObject()) : (core)));
                 if (goUp) {
                     chainTransitiveProperty(null, prop, st.getSubject(), core, sts, goUp, contxts);
                 } else {
@@ -1360,15 +1358,15 @@
         return subClassOfGraph.get();
     }
 
-    public Map<URI, List<URI>> getPropertyChainMap() {
+    public Map<IRI, List<IRI>> getPropertyChainMap() {
         return propertyChainPropertyToChain;
     }
 
-    public List<URI> getPropertyChain(final URI chainProp) {
+    public List<IRI> getPropertyChain(final IRI chainProp) {
         if (propertyChainPropertyToChain.containsKey(chainProp)){
             return propertyChainPropertyToChain.get(chainProp);
         }
-        return new ArrayList<URI>();
+        return new ArrayList<IRI>();
     }
 
     public Graph getSubPropertyOfGraph() {
@@ -1383,15 +1381,15 @@
         this.refreshGraphSchedule.set(refreshGraphSchedule);
     }
 
-    public Set<URI> getSymmetricPropertySet() {
+    public Set<IRI> getSymmetricPropertySet() {
         return symmetricPropertySet;
     }
 
-    public Map<URI, URI> getInverseOfMap() {
+    public Map<IRI, IRI> getInverseOfMap() {
         return inverseOfMap;
     }
 
-    public Set<URI> getTransitivePropertySet() {
+    public Set<IRI> getTransitivePropertySet() {
         return transitivePropertySet;
     }
 
@@ -1413,17 +1411,17 @@
      * @return For each relevant property, a set of values such that whenever a resource has that
      *      value for that property, it is implied to belong to the type.
      */
-    public Map<URI, Set<Value>> getHasValueByType(final Resource type) {
-        final Map<URI, Set<Value>> implications = new HashMap<>();
+    public Map<IRI, Set<Value>> getHasValueByType(final Resource type) {
+        final Map<IRI, Set<Value>> implications = new HashMap<>();
         if (hasValueByType != null) {
             final Set<Resource> types = new HashSet<>();
             types.add(type);
-            if (type instanceof URI) {
-                types.addAll(getSubClasses((URI) type));
+            if (type instanceof IRI) {
+                types.addAll(getSubClasses((IRI) type));
             }
             for (final Resource relevantType : types) {
                 if (hasValueByType.containsKey(relevantType)) {
-                    for (final Map.Entry<URI, Value> propertyToValue : hasValueByType.get(relevantType).entrySet()) {
+                    for (final Map.Entry<IRI, Value> propertyToValue : hasValueByType.get(relevantType).entrySet()) {
                         if (!implications.containsKey(propertyToValue.getKey())) {
                             implications.put(propertyToValue.getKey(), new HashSet<>());
                         }
@@ -1446,7 +1444,7 @@
      * @return A mapping from type (URIs or bnodes) to the set of any values that belonging to that
      *      type implies.
      */
-    public Map<Resource, Set<Value>> getHasValueByProperty(final URI property) {
+    public Map<Resource, Set<Value>> getHasValueByProperty(final IRI property) {
         final Map<Resource, Set<Value>> implications = new HashMap<>();
         if (hasValueByProperty != null && hasValueByProperty.containsKey(property)) {
             for (final Map.Entry<Resource, Value> typeToValue : hasValueByProperty.get(property).entrySet()) {
@@ -1455,8 +1453,8 @@
                     implications.put(type, new HashSet<>());
                 }
                 implications.get(type).add(typeToValue.getValue());
-                if (type instanceof URI) {
-                    for (final URI subtype : getSubClasses((URI) type)) {
+                if (type instanceof IRI) {
+                    for (final IRI subtype : getSubClasses((IRI) type)) {
                         if (!implications.containsKey(subtype)) {
                             implications.put(subtype, new HashSet<>());
                         }
@@ -1478,8 +1476,8 @@
      * @return The set of properties with domain of that type, meaning that any triple whose
      *      predicate belongs to that set implies that the triple's subject belongs to the type.
      */
-    public Set<URI> getPropertiesWithDomain(final URI domainType) {
-        final Set<URI> properties = new HashSet<>();
+    public Set<IRI> getPropertiesWithDomain(final IRI domainType) {
+        final Set<IRI> properties = new HashSet<>();
         if (domainByType.containsKey(domainType)) {
             properties.addAll(domainByType.get(domainType));
         }
@@ -1496,8 +1494,8 @@
      * @return The set of properties with range of that type, meaning that any triple whose
      *      predicate belongs to that set implies that the triple's object belongs to the type.
      */
-    public Set<URI> getPropertiesWithRange(final URI rangeType) {
-        final Set<URI> properties = new HashSet<>();
+    public Set<IRI> getPropertiesWithRange(final IRI rangeType) {
+        final Set<IRI> properties = new HashSet<>();
         if (rangeByType.containsKey(rangeType)) {
             properties.addAll(rangeByType.get(rangeType));
         }
@@ -1520,23 +1518,23 @@
      *      individual type/property combination is sufficient. Returns an empty map if either
      *      parameter is {@code null}.
      */
-    private Map<Resource, Set<URI>> getTypePropertyImplyingType(final Resource queryType, final Map<Resource, Map<Resource, URI>> schemaMap) {
-        final Map<Resource, Set<URI>> implications = new HashMap<>();
+    private Map<Resource, Set<IRI>> getTypePropertyImplyingType(final Resource queryType, final Map<Resource, Map<Resource, IRI>> schemaMap) {
+        final Map<Resource, Set<IRI>> implications = new HashMap<>();
         if (schemaMap != null && queryType != null) {
             // Check for any subtypes which would in turn imply the type being queried for
             final HashSet<Resource> queryTypes = new HashSet<>();
             queryTypes.add(queryType);
-            if (queryType instanceof URI) {
-                queryTypes.addAll(getSubClasses((URI) queryType));
+            if (queryType instanceof IRI) {
+                queryTypes.addAll(getSubClasses((IRI) queryType));
             }
             for (final Resource querySubType : queryTypes) {
                 if (schemaMap.containsKey(querySubType)) {
-                    final Map<Resource, URI> otherTypeToProperty = schemaMap.get(querySubType);
+                    final Map<Resource, IRI> otherTypeToProperty = schemaMap.get(querySubType);
                     for (final Resource otherType : otherTypeToProperty.keySet()) {
                         if (!implications.containsKey(otherType)) {
                             implications.put(otherType, new HashSet<>());
                         }
-                        final URI property = otherTypeToProperty.get(otherType);
+                        final IRI property = otherTypeToProperty.get(otherType);
                         if (property != null) {
                             implications.get(otherType).add(property);
                             // Also add subproperties that would in turn imply the property
@@ -1569,7 +1567,7 @@
      *      to the restriction type. Empty map if the parameter is {@code null} or if the
      *      someValuesFrom schema has not been populated.
      */
-    public Map<Resource, Set<URI>> getSomeValuesFromByRestrictionType(final Resource restrictionType) {
+    public Map<Resource, Set<IRI>> getSomeValuesFromByRestrictionType(final Resource restrictionType) {
         return getTypePropertyImplyingType(restrictionType, someValuesFromByRestrictionType);
     }
 
@@ -1590,7 +1588,7 @@
      *      values it has for any of those properties belong to the value type. Empty map if the
      *      parameter is {@code null} or if the allValuesFrom schema has not been populated.
      */
-    public Map<Resource, Set<URI>> getAllValuesFromByValueType(final Resource valueType) {
+    public Map<Resource, Set<IRI>> getAllValuesFromByValueType(final Resource valueType) {
         return getTypePropertyImplyingType(valueType, allValuesFromByValueType);
     }
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitor.java
index b4853c0..0208d68 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitor.java
@@ -26,13 +26,14 @@
 
 import org.apache.log4j.Logger;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Visitor for handling owl:intersectionOf inferencing on a node.
@@ -58,7 +59,7 @@
         final Var objVar = node.getObjectVar();
         final Var conVar = node.getContextVar();
         if (predVar != null && objVar != null && objVar.getValue() != null && RDF.TYPE.equals(predVar.getValue()) && !EXPANDED.equals(conVar)) {
-            final List<Set<Resource>> intersections = inferenceEngine.getIntersectionsImplying((URI) objVar.getValue());
+            final List<Set<Resource>> intersections = inferenceEngine.getIntersectionsImplying((IRI) objVar.getValue());
             if (intersections != null && !intersections.isEmpty()) {
                 final List<TupleExpr> joins = new ArrayList<>();
                 for (final Set<Resource> intersection : intersections) {
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseOfVisitor.java
index 2f026fc..e3a74d5 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseOfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseOfVisitor.java
@@ -19,16 +19,14 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -48,7 +46,7 @@
         StatementPattern sp = node.clone();
         final Var predVar = sp.getPredicateVar();
 
-        URI pred = (URI) predVar.getValue();
+        IRI pred = (IRI) predVar.getValue();
         String predNamespace = pred.getNamespace();
 
         final Var objVar = sp.getObjectVar();
@@ -65,8 +63,8 @@
              "      { ?b ?pred ?a }
              */
 
-            URI predUri = (URI) predVar.getValue();
-            URI invPropUri = inferenceEngine.findInverseOf(predUri);
+            IRI predUri = (IRI) predVar.getValue();
+            IRI invPropUri = inferenceEngine.findInverseOf(predUri);
             if (invPropUri != null) {
                 Var subjVar = sp.getSubjectVar();
                 Union union = new InferUnion();
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseURI.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseURI.java
index 13c068a..2a96ae6 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseURI.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/InverseURI.java
@@ -18,14 +18,14 @@
  */
 package org.apache.rya.rdftriplestore.inference;
 
-import org.openrdf.model.URI;
+import org.eclipse.rdf4j.model.IRI;
 
-public class InverseURI implements URI {
+public class InverseURI implements IRI {
     private static final long serialVersionUID = 1L;
 
-    private final URI impl;
+    private final IRI impl;
 
-    public InverseURI(final URI uri) {
+    public InverseURI(final IRI uri) {
         this.impl = uri;
     }
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/OneOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/OneOfVisitor.java
index 004a4b0..5a5c2c7 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/OneOfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/OneOfVisitor.java
@@ -23,13 +23,13 @@
 
 import org.apache.log4j.Logger;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.Resource;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 
 /**
  * Visitor for handling owl:oneOf inferencing on a node.
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java
index ae7e059..2df3461 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/PropertyChainVisitor.java
@@ -23,14 +23,14 @@
 import java.util.UUID;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -51,7 +51,7 @@
         final StatementPattern sp = node.clone();
         final Var predVar = sp.getPredicateVar();
 
-        final URI pred = (URI) predVar.getValue();
+        final IRI pred = (IRI) predVar.getValue();
         final String predNamespace = pred.getNamespace();
 
         final Var objVar = sp.getObjectVar();
@@ -62,8 +62,8 @@
                 !RDFS.NAMESPACE.equals(predNamespace)
                 && !EXPANDED.equals(cntxtVar)) {
 
-            final URI chainPropURI = (URI) predVar.getValue();
-            final List<URI> chain = inferenceEngine.getPropertyChain(chainPropURI);
+            final IRI chainPropURI = (IRI) predVar.getValue();
+            final List<IRI> chain = inferenceEngine.getPropertyChain(chainPropURI);
             final List<StatementPattern> expandedPatterns = new ArrayList<StatementPattern>();
             if (chain.size() > 0) {
                 final Var originalSubj = sp.getSubjectVar();
@@ -71,7 +71,7 @@
 
                 Var nextSubj = originalSubj;
                 StatementPattern lastStatementPatternAdded = null;
-                for (final URI chainElement : chain ){
+                for (final IRI chainElement : chain ){
                     final String s = UUID.randomUUID().toString();
                     final Var currentObj = new Var("c-" + s);
                     StatementPattern statementPattern = new StatementPattern(nextSubj, new Var(chainElement.stringValue()), currentObj, sp.getContextVar());
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitor.java
index d515bcf..23df2a4 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitor.java
@@ -19,10 +19,10 @@
  */
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.ZeroLengthPath;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.ZeroLengthPath;
 
 /**
  * Expands the query tree to account for any relevant reflexive properties
@@ -59,7 +59,7 @@
     protected void meetSP(StatementPattern node) throws Exception {
         // Only applies when the predicate is defined and reflexive
         final Var predVar = node.getPredicateVar();
-        if (predVar.getValue() != null && inferenceEngine.isReflexiveProperty((URI) predVar.getValue())) {
+        if (predVar.getValue() != null && inferenceEngine.isReflexiveProperty((IRI) predVar.getValue())) {
             final StatementPattern originalSP = node.clone();
             // The reflexive solution is a ZeroLengthPath between subject and
             // object: they can be matched to one another, whether constants or
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SameAsVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SameAsVisitor.java
index c616419..a71aaaa 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SameAsVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SameAsVisitor.java
@@ -19,25 +19,23 @@
  * under the License.
  */
 
-
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
 import org.apache.rya.rdftriplestore.utils.TransitivePropertySP;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-
-import java.util.HashSet;
-import java.util.Set;
-import java.util.UUID;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -74,7 +72,7 @@
 
         boolean shouldExpand = true;
         if (predVar.hasValue()){
-            URI pred = (URI) predVar.getValue();
+            IRI pred = (IRI) predVar.getValue();
             String predNamespace = pred.getNamespace();
             shouldExpand = !pred.equals(OWL.SAMEAS) && 
             !RDF.NAMESPACE.equals(predNamespace) &&
@@ -136,7 +134,8 @@
             			StatementPattern origDummyStatement = new DoNotExpandSP(origStatement.getSubjectVar(), origStatement.getPredicateVar(), dummyVar, cntxtVar);
             	        FixedStatementPattern fsp = new FixedStatementPattern(dummyVar, new Var("c-" + s, OWL.SAMEAS), objVar, cntxtVar);
             	        for (Resource sameAs : objURIs){
-            	    		NullableStatementImpl newStatement = new NullableStatementImpl(sameAs, OWL.SAMEAS, (Resource)objVar.getValue(), getVarValue(cntxtVar));
+            	    		NullableStatementImpl newStatement = new NullableStatementImpl(sameAs, OWL.SAMEAS,
+                                    objVar.getValue(), getVarValue(cntxtVar));
             	            fsp.statements.add(newStatement);        		
             	    	}
             	        InferJoin interimJoin = new InferJoin(fsp, origDummyStatement);
@@ -169,7 +168,8 @@
        }
         FixedStatementPattern fsp = new FixedStatementPattern(dummyVar, new Var("c-" + s, OWL.SAMEAS), subVar, cntxtVar);
         for (Resource sameAs : uris){
-    		NullableStatementImpl newStatement = new NullableStatementImpl(sameAs, OWL.SAMEAS, (Resource)subVar.getValue(), getVarValue(cntxtVar));
+    		NullableStatementImpl newStatement = new NullableStatementImpl(sameAs, OWL.SAMEAS,
+                    subVar.getValue(), getVarValue(cntxtVar));
             fsp.statements.add(newStatement);        		
     	}
         InferJoin join = new InferJoin(fsp, origStatement);
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitor.java
index 16a315e..bd03f54 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitor.java
@@ -25,12 +25,12 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Expands the query tree to account for any existential class expressions (property restrictions
@@ -78,7 +78,7 @@
         // Only applies to type queries where the type is defined
         if (predVar != null && RDF.TYPE.equals(predVar.getValue()) && objVar != null && objVar.getValue() instanceof Resource) {
             final Resource typeToInfer = (Resource) objVar.getValue();
-            Map<Resource, Set<URI>> relevantSvfRestrictions = inferenceEngine.getSomeValuesFromByRestrictionType(typeToInfer);
+            Map<Resource, Set<IRI>> relevantSvfRestrictions = inferenceEngine.getSomeValuesFromByRestrictionType(typeToInfer);
             if (!relevantSvfRestrictions.isEmpty()) {
                 // We can infer the queried type if it is to a someValuesFrom restriction (or a
                 // supertype of one), and the node in question (subjVar) is the subject of a triple
@@ -97,7 +97,7 @@
                 final FixedStatementPattern svfPropertyTypes = new FixedStatementPattern(svfPredVar,
                         new Var(OWL.SOMEVALUESFROM.stringValue(), OWL.SOMEVALUESFROM), valueTypeVar);
                 for (Resource svfValueType : relevantSvfRestrictions.keySet()) {
-                    for (URI svfProperty : relevantSvfRestrictions.get(svfValueType)) {
+                    for (IRI svfProperty : relevantSvfRestrictions.get(svfValueType)) {
                         svfPropertyTypes.statements.add(new NullableStatementImpl(svfProperty,
                                 OWL.SOMEVALUESFROM, svfValueType));
                     }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java
index 1f2fd27..0d11918 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubClassOfVisitor.java
@@ -24,11 +24,11 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Class SubClassOfVisitor
@@ -61,14 +61,14 @@
 //            join.getProperties().put(InferConstants.INFERRED, InferConstants.TRUE);
 //            node.replaceWith(join);
 
-            final URI subclassof_uri = (URI) objVar.getValue();
-            final Collection<URI> parents = InferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), subclassof_uri);
+            final IRI subclassof_uri = (IRI) objVar.getValue();
+            final Collection<IRI> parents = InferenceEngine.findParents(inferenceEngine.getSubClassOfGraph(), subclassof_uri);
             if (parents != null && parents.size() > 0) {
                 final String s = UUID.randomUUID().toString();
                 final Var typeVar = new Var(s);
                 final FixedStatementPattern fsp = new FixedStatementPattern(typeVar, new Var("c-" + s, RDFS.SUBCLASSOF), objVar, conVar);
                 parents.add(subclassof_uri);
-                for (final URI u : parents) {
+                for (final IRI u : parents) {
                     fsp.statements.add(new NullableStatementImpl(u, RDFS.SUBCLASSOF, subclassof_uri));
                 }
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java
index f3a40ab..102c0b2 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SubPropertyOfVisitor.java
@@ -24,12 +24,12 @@
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -49,7 +49,7 @@
         final StatementPattern sp = node.clone();
         final Var predVar = sp.getPredicateVar();
 
-        final URI pred = (URI) predVar.getValue();
+        final IRI pred = (IRI) predVar.getValue();
         final String predNamespace = pred.getNamespace();
 
         final Var objVar = sp.getObjectVar();
@@ -94,8 +94,8 @@
 //                node.replaceWith(new StatementPattern(subjVar, vc, objVar, node.getContextVar()));
 //            }
 
-            final URI subprop_uri = (URI) predVar.getValue();
-            final Set<URI> parents = InferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), subprop_uri);
+            final IRI subprop_uri = (IRI) predVar.getValue();
+            final Set<IRI> parents = InferenceEngine.findParents(inferenceEngine.getSubPropertyOfGraph(), subprop_uri);
             if (parents != null && parents.size() > 0) {
                 final String s = UUID.randomUUID().toString();
                 final Var typeVar = new Var(s);
@@ -103,7 +103,7 @@
 //                fsp.statements.add(new NullableStatementImpl(subprop_uri, RDFS.SUBPROPERTYOF, subprop_uri));
                 //add self
                 parents.add(subprop_uri);
-                for (final URI u : parents) {
+                for (final IRI u : parents) {
                     fsp.statements.add(new NullableStatementImpl(u, RDFS.SUBPROPERTYOF, subprop_uri));
                 }
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SymmetricPropertyVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SymmetricPropertyVisitor.java
index 7195ccd..c8e1a7d 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SymmetricPropertyVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/SymmetricPropertyVisitor.java
@@ -19,16 +19,14 @@
  * under the License.
  */
 
-
-
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -48,7 +46,7 @@
         StatementPattern sp = node.clone();
 
         final Var predVar = sp.getPredicateVar();
-        URI pred = (URI) predVar.getValue();
+        IRI pred = (IRI) predVar.getValue();
         String predNamespace = pred.getNamespace();
 
         final Var objVar = sp.getObjectVar();
@@ -65,7 +63,7 @@
              "      { ?b ?pred ?a }
              */
 
-            URI symmPropUri = (URI) predVar.getValue();
+            IRI symmPropUri = (IRI) predVar.getValue();
             if(inferenceEngine.isSymmetricProperty(symmPropUri)) {
                 Var subjVar = sp.getSubjectVar();
                 Union union = new InferUnion();
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java
index 45f74ed..666bbd8 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/inference/TransitivePropertyVisitor.java
@@ -20,12 +20,12 @@
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
 import org.apache.rya.rdftriplestore.utils.TransitivePropertySP;
-import org.openrdf.model.URI;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.model.vocabulary.SESAME;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.model.vocabulary.SESAME;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * All predicates are changed
@@ -45,7 +45,7 @@
         final StatementPattern sp = node.clone();
         final Var predVar = sp.getPredicateVar();
 
-        final URI pred = (URI) predVar.getValue();
+        final IRI pred = (IRI) predVar.getValue();
         final String predNamespace = pred.getNamespace();
 
         final Var objVar = sp.getObjectVar();
@@ -56,7 +56,7 @@
                 !RDFS.NAMESPACE.equals(predNamespace)
                 && !EXPANDED.equals(cntxtVar)) {
 
-            final URI transPropUri = (URI) predVar.getValue();
+            final IRI transPropUri = (IRI) predVar.getValue();
             if (inferenceEngine.isTransitiveProperty(transPropUri)) {
                 node.replaceWith(new TransitivePropertySP(sp.getSubjectVar(), sp.getPredicateVar(), sp.getObjectVar(), sp.getContextVar()));
             }
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/namespace/NamespaceManager.java b/sail/src/main/java/org/apache/rya/rdftriplestore/namespace/NamespaceManager.java
index 3d8526f..86cc991 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/namespace/NamespaceManager.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/namespace/NamespaceManager.java
@@ -1,14 +1,3 @@
-package org.apache.rya.rdftriplestore.namespace;
-
-import java.io.InputStream;
-
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.persist.RdfDAOException;
-import org.apache.rya.api.persist.RyaDAO;
-import org.apache.rya.api.persist.RyaNamespaceManager;
-import org.openrdf.model.Namespace;
-import org.openrdf.sail.SailException;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -27,10 +16,18 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.rdftriplestore.namespace;
 
+import java.io.InputStream;
 
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.persist.RdfDAOException;
+import org.apache.rya.api.persist.RyaDAO;
+import org.apache.rya.api.persist.RyaNamespaceManager;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.sail.SailException;
 
-import info.aduna.iteration.CloseableIteration;
 import net.sf.ehcache.Cache;
 import net.sf.ehcache.CacheManager;
 import net.sf.ehcache.Element;
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/CombineContextsRdfInserter.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/CombineContextsRdfInserter.java
index 6a61201..8a9b9a1 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/CombineContextsRdfInserter.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/CombineContextsRdfInserter.java
@@ -1,5 +1,3 @@
-package org.apache.rya.rdftriplestore.utils;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,19 +16,22 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
-
-import org.openrdf.OpenRDFUtil;
-import org.openrdf.model.*;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.helpers.RDFHandlerBase;
+package org.apache.rya.rdftriplestore.utils;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import org.eclipse.rdf4j.OpenRDFUtil;
+import org.eclipse.rdf4j.model.BNode;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.helpers.AbstractRDFHandler;
+
 /**
  * Created by IntelliJ IDEA.
  * User: RoshanP
@@ -38,7 +39,7 @@
  * Time: 9:50 AM
  * To change this template use File | Settings | File Templates.
  */
-public class CombineContextsRdfInserter extends RDFHandlerBase {
+public class CombineContextsRdfInserter extends AbstractRDFHandler {
 
     private final RepositoryConnection con;
     private Resource[] contexts = new Resource[0];
@@ -108,7 +109,7 @@
     public void handleStatement(Statement st)
             throws RDFHandlerException {
         Resource subj = st.getSubject();
-        URI pred = st.getPredicate();
+        IRI pred = st.getPredicate();
         Value obj = st.getObject();
         Resource ctxt = st.getContext();
 
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/DefaultStatistics.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/DefaultStatistics.java
index 94c32d2..a23920a 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/DefaultStatistics.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/DefaultStatistics.java
@@ -19,10 +19,8 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.impl.EvaluationStatistics;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.EvaluationStatistics;
 
 /**
  * Class DefaultStatistics
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java
index ee63213..bcd46fd 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/FixedStatementPattern.java
@@ -21,9 +21,9 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
-import org.openrdf.model.Statement;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * StatementPattern gives fixed statements back
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/RdfFormatUtils.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/RdfFormatUtils.java
new file mode 100644
index 0000000..78f2335
--- /dev/null
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/RdfFormatUtils.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+package org.apache.rya.rdftriplestore.utils;
+
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.eclipse.rdf4j.common.lang.FileFormat;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParserRegistry;
+
+import com.google.common.collect.ImmutableSet;
+
+/**
+ * Utility methods for {@link RDFFormat}.
+ */
+public final class RdfFormatUtils {
+    /**
+     * Holds all supported {@link RDFFormat} types.
+     */
+    public static final Set<RDFFormat> RDF_FORMATS = RDFParserRegistry.getInstance().getKeys();
+
+    /**
+     * The set of all supported file extensions from {@link #RDF_FORMATS}.
+     */
+    public static final Set<String> SUPPORTED_FILE_EXTENSIONS = buildSupportedFileExtensions();
+
+    /**
+     * Private constructor to prevent instantiation.
+     */
+    private RdfFormatUtils() {
+    }
+
+    /**
+     * Gets the RDF format whose name matches the specified name.
+     * @param formatName The format name.
+     * @return The {@link RDFFormat} whose name matches the specified name, or
+     * {@code null} if there is no such format.
+     */
+    public static RDFFormat getRdfFormatFromName(final String formatName) {
+        for (final RDFFormat rdfFormat : RDF_FORMATS) {
+            if (rdfFormat.getName().equalsIgnoreCase(formatName)) {
+                return rdfFormat;
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Tries to determine the appropriate RDF file format based on the extension
+     * of a file name.
+     * @param fileName A file name.
+     * @return An {@link RDFFormat} object if the file extension was recognized,
+     * or {@code null} otherwise.
+     */
+    public static RDFFormat forFileName(final String fileName) {
+        return forFileName(fileName, null);
+    }
+
+    /**
+     * Tries to determine the appropriate RDF file format based on the extension
+     * of a file name. The supplied fallback format will be returned when the
+     * file name extension was not recognized.
+     * @param fileName A file name.
+     * @return An {@link RDFFormat} that matches the file name extension, or the
+     * fallback format if the extension was not recognized.
+     */
+    public static RDFFormat forFileName(final String fileName, final RDFFormat fallback) {
+        final Optional<RDFFormat> match = FileFormat.matchFileName(fileName, RDF_FORMATS);
+        if (match.isPresent()) {
+            return match.get();
+        } else {
+            return fallback;
+        }
+    }
+
+    /**
+     * @return the set of all supported file extensions from
+     * {@link #RDF_FORMATS}.
+     */
+    private static Set<String> buildSupportedFileExtensions() {
+        return ImmutableSet.copyOf(RDF_FORMATS.stream().flatMap(rdfFormat -> rdfFormat.getFileExtensions().stream()).collect(Collectors.toList()));
+    }
+}
\ No newline at end of file
diff --git a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/TransitivePropertySP.java b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/TransitivePropertySP.java
index 9cdb113..89e2d90 100644
--- a/sail/src/main/java/org/apache/rya/rdftriplestore/utils/TransitivePropertySP.java
+++ b/sail/src/main/java/org/apache/rya/rdftriplestore/utils/TransitivePropertySP.java
@@ -19,10 +19,8 @@
  * under the License.
  */
 
-
-
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
 
 /**
  * Class TransitivePropertySP
diff --git a/sail/src/test/java/org/apache/rya/ArbitraryLengthQueryTest.java b/sail/src/test/java/org/apache/rya/ArbitraryLengthQueryTest.java
index 3b6056f..e4e3fb6 100644
--- a/sail/src/test/java/org/apache/rya/ArbitraryLengthQueryTest.java
+++ b/sail/src/test/java/org/apache/rya/ArbitraryLengthQueryTest.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -28,25 +26,23 @@
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Instance;
 import org.apache.accumulo.core.client.mock.MockInstance;
-import org.openrdf.model.Resource;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.resultio.text.tsv.SPARQLResultsTSVWriter;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFParseException;
-
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFParseException;
+
 import junit.framework.TestCase;
 
 /**
@@ -160,12 +156,12 @@
         // T-Box
         String ttlString = MODEL_TTL;
         InputStream stringInput = new ByteArrayInputStream(ttlString.getBytes());
-        conn.add(stringInput, "http://dragon-research.com/cham/model/model1", RDFFormat.TURTLE, new Resource[]{});
+        conn.add(stringInput, "http://dragon-research.com/cham/model/model1", RDFFormat.TURTLE);
 
         // A-Box
         ttlString = BUCKET_TTL;
         stringInput = new ByteArrayInputStream(ttlString.getBytes());
-        conn.add(stringInput, "http://dragon-research.com/cham/bucket/bucket1", RDFFormat.TURTLE, new Resource[]{});
+        conn.add(stringInput, "http://dragon-research.com/cham/bucket/bucket1", RDFFormat.TURTLE);
 
         conn.commit();
         conn.close();
diff --git a/sail/src/test/java/org/apache/rya/HashJoinTest.java b/sail/src/test/java/org/apache/rya/HashJoinTest.java
index f011d00..e0463c9 100644
--- a/sail/src/test/java/org/apache/rya/HashJoinTest.java
+++ b/sail/src/test/java/org/apache/rya/HashJoinTest.java
@@ -19,10 +19,15 @@
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
+import java.util.HashSet;
+import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
-import junit.framework.TestCase;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
@@ -31,19 +36,11 @@
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.query.join.HashJoin;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.mock.MockInstance;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
-
 /**
  * Date: 7/24/12
  * Time: 5:51 PM
diff --git a/sail/src/test/java/org/apache/rya/IterativeJoinTest.java b/sail/src/test/java/org/apache/rya/IterativeJoinTest.java
index c84919e..8e40e2d 100644
--- a/sail/src/test/java/org/apache/rya/IterativeJoinTest.java
+++ b/sail/src/test/java/org/apache/rya/IterativeJoinTest.java
@@ -19,10 +19,15 @@
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
+import java.util.HashSet;
+import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
-import junit.framework.TestCase;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
@@ -31,17 +36,11 @@
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.query.join.IterativeJoin;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.mock.MockInstance;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import static junit.framework.Assert.*;
-
 /**
  * Date: 7/24/12
  * Time: 5:51 PM
diff --git a/sail/src/test/java/org/apache/rya/MergeJoinTest.java b/sail/src/test/java/org/apache/rya/MergeJoinTest.java
index d7ac948..efc44c3 100644
--- a/sail/src/test/java/org/apache/rya/MergeJoinTest.java
+++ b/sail/src/test/java/org/apache/rya/MergeJoinTest.java
@@ -19,29 +19,28 @@
  * under the License.
  */
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
+import java.util.HashSet;
+import java.util.Set;
 
-import info.aduna.iteration.CloseableIteration;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreUtils.CustomEntry;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaURI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.query.join.MergeJoin;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.mock.MockInstance;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.junit.After;
 import org.junit.Before;
-import org.junit.Ignore;
 import org.junit.Test;
 
-import java.util.HashSet;
-import java.util.Set;
-
-import static junit.framework.Assert.*;
-import static org.apache.rya.api.RdfCloudTripleStoreUtils.CustomEntry;
-
 /**
  * TODO: Move to rya.api when we have proper mock ryaDao
  *
diff --git a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreConnectionTest.java b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreConnectionTest.java
index 8c926db..d40972c 100644
--- a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreConnectionTest.java
+++ b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreConnectionTest.java
@@ -34,31 +34,28 @@
 import org.apache.rya.rdftriplestore.RyaSailRepository;
 import org.apache.rya.rdftriplestore.inference.InferenceEngine;
 import org.apache.rya.rdftriplestore.namespace.NamespaceManager;
-import org.openrdf.model.Literal;
-import org.openrdf.model.Model;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryResult;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.Rio;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.Model;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryResult;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.Rio;
 
 import junit.framework.TestCase;
 
@@ -69,11 +66,11 @@
  */
 public class RdfCloudTripleStoreConnectionTest extends TestCase {
     private Repository repository;
-    ValueFactoryImpl vf = new ValueFactoryImpl();
+    private static final SimpleValueFactory VF = SimpleValueFactory.getInstance();
     private InferenceEngine internalInferenceEngine;
 
     static String litdupsNS = "urn:test:litdups#";
-    URI cpu = vf.createURI(litdupsNS, "cpu");
+    IRI cpu = VF.createIRI(litdupsNS, "cpu");
     protected RdfCloudTripleStore store;
 
     @Override
@@ -97,8 +94,8 @@
     public void testAddStatement() throws Exception {
         RepositoryConnection conn = repository.getConnection();
 
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
         conn.add(cpu, loadPerc, uri1);
         conn.commit();
 
@@ -115,7 +112,7 @@
         conn.remove(cpu, loadPerc, uri1);
 
 //        //test removal
-        result = conn.getStatements(cpu, loadPerc, null, true, new Resource[0]);
+        result = conn.getStatements(cpu, loadPerc, null, true);
         count = 0;
         while (result.hasNext()) {
             count++;
@@ -129,14 +126,14 @@
 
 //    public void testAddAuth() throws Exception {
 //        RepositoryConnection conn = repository.getConnection();
-//        URI cpu = vf.createURI(litdupsNS, "cpu");
-//        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-//        URI uri1 = vf.createURI(litdupsNS, "uri1");
-//        URI uri2 = vf.createURI(litdupsNS, "uri2");
-//        URI uri3 = vf.createURI(litdupsNS, "uri3");
-//        URI auth1 = vf.createURI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "1");
-//        URI auth2 = vf.createURI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "2");
-//        URI auth3 = vf.createURI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "3");
+//        URI cpu = vf.createIRI(litdupsNS, "cpu");
+//        URI loadPerc = vf.createIRI(litdupsNS, "loadPerc");
+//        URI uri1 = vf.createIRI(litdupsNS, "uri1");
+//        URI uri2 = vf.createIRI(litdupsNS, "uri2");
+//        URI uri3 = vf.createIRI(litdupsNS, "uri3");
+//        URI auth1 = vf.createIRI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "1");
+//        URI auth2 = vf.createIRI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "2");
+//        URI auth3 = vf.createIRI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "3");
 //        conn.add(cpu, loadPerc, uri1, auth1, auth2, auth3);
 //        conn.add(cpu, loadPerc, uri2, auth2, auth3);
 //        conn.add(cpu, loadPerc, uri3, auth3);
@@ -166,8 +163,8 @@
 
     public void testEvaluate() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
         conn.add(cpu, loadPerc, uri1);
         conn.commit();
 
@@ -183,10 +180,10 @@
 
     public void testEvaluateMultiLine() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
-        URI pred2 = vf.createURI(litdupsNS, "pred2");
-        URI uri2 = vf.createURI(litdupsNS, "uri2");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
+        IRI pred2 = VF.createIRI(litdupsNS, "pred2");
+        IRI uri2 = VF.createIRI(litdupsNS, "uri2");
         conn.add(cpu, loadPerc, uri1);
         conn.add(cpu, pred2, uri2);
         conn.commit();
@@ -205,10 +202,10 @@
 
     public void testPOObjRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc, sev);
         conn.add(cpu, loadPerc, ten);
@@ -228,13 +225,13 @@
 
     public void testPOPredRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc1");
-        URI loadPerc2 = vf.createURI(litdupsNS, "loadPerc2");
-        URI loadPerc3 = vf.createURI(litdupsNS, "loadPerc3");
-        URI loadPerc4 = vf.createURI(litdupsNS, "loadPerc4");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc1");
+        IRI loadPerc2 = VF.createIRI(litdupsNS, "loadPerc2");
+        IRI loadPerc3 = VF.createIRI(litdupsNS, "loadPerc3");
+        IRI loadPerc4 = VF.createIRI(litdupsNS, "loadPerc4");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc2, sev);
         conn.add(cpu, loadPerc4, ten);
@@ -254,13 +251,13 @@
 
     public void testSPOPredRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc1");
-        URI loadPerc2 = vf.createURI(litdupsNS, "loadPerc2");
-        URI loadPerc3 = vf.createURI(litdupsNS, "loadPerc3");
-        URI loadPerc4 = vf.createURI(litdupsNS, "loadPerc4");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc1");
+        IRI loadPerc2 = VF.createIRI(litdupsNS, "loadPerc2");
+        IRI loadPerc3 = VF.createIRI(litdupsNS, "loadPerc3");
+        IRI loadPerc4 = VF.createIRI(litdupsNS, "loadPerc4");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc2, sev);
         conn.add(cpu, loadPerc4, ten);
@@ -280,12 +277,12 @@
 
     public void testSPOSubjRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI cpu2 = vf.createURI(litdupsNS, "cpu2");
-        URI cpu3 = vf.createURI(litdupsNS, "cpu3");
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI cpu2 = VF.createIRI(litdupsNS, "cpu2");
+        IRI cpu3 = VF.createIRI(litdupsNS, "cpu3");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu2, loadPerc, sev);
         conn.add(cpu3, loadPerc, ten);
@@ -305,10 +302,10 @@
 
     public void testSPOObjRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc, sev);
         conn.add(cpu, loadPerc, ten);
@@ -328,10 +325,10 @@
 
     public void testOSPObjRange() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc, sev);
         conn.add(cpu, loadPerc, ten);
@@ -351,11 +348,11 @@
 
     public void testRegexFilter() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI testClass = vf.createURI(litdupsNS, "test");
-        Literal six = vf.createLiteral("6");
-        Literal sev = vf.createLiteral("7");
-        Literal ten = vf.createLiteral("10");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI testClass = VF.createIRI(litdupsNS, "test");
+        Literal six = VF.createLiteral("6");
+        Literal sev = VF.createLiteral("7");
+        Literal ten = VF.createLiteral("10");
         conn.add(cpu, loadPerc, six);
         conn.add(cpu, loadPerc, sev);
         conn.add(cpu, loadPerc, ten);
@@ -376,12 +373,12 @@
 
     public void testMMRTS152() throws Exception {
         RepositoryConnection conn = repository.getConnection();
-        URI loadPerc = vf.createURI(litdupsNS, "testPred");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
+        IRI loadPerc = VF.createIRI(litdupsNS, "testPred");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
         conn.add(cpu, loadPerc, uri1);
         conn.commit();
 
-        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, false, new Resource[0]);
+        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, false);
 //        RdfCloudTripleStoreCollectionStatementsIterator iterator = new RdfCloudTripleStoreCollectionStatementsIterator(
 //                cpu, loadPerc, null, store.connector,
 //                vf, new Configuration(), null);
@@ -397,17 +394,17 @@
     public void testDuplicateLiterals() throws Exception {
         RepositoryConnection conn = repository.getConnection();
 
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        Literal lit1 = vf.createLiteral(0.0);
-        Literal lit2 = vf.createLiteral(0.0);
-        Literal lit3 = vf.createLiteral(0.0);
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        Literal lit1 = VF.createLiteral(0.0);
+        Literal lit2 = VF.createLiteral(0.0);
+        Literal lit3 = VF.createLiteral(0.0);
 
         conn.add(cpu, loadPerc, lit1);
         conn.add(cpu, loadPerc, lit2);
         conn.add(cpu, loadPerc, lit3);
         conn.commit();
 
-        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, true, new Resource[0]);
+        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, true);
         int count = 0;
         while (result.hasNext()) {
             count++;
@@ -424,17 +421,17 @@
     public void testNotDuplicateUris() throws Exception {
         RepositoryConnection conn = repository.getConnection();
 
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        URI uri1 = vf.createURI(litdupsNS, "uri1");
-        URI uri2 = vf.createURI(litdupsNS, "uri1");
-        URI uri3 = vf.createURI(litdupsNS, "uri1");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        IRI uri1 = VF.createIRI(litdupsNS, "uri1");
+        IRI uri2 = VF.createIRI(litdupsNS, "uri1");
+        IRI uri3 = VF.createIRI(litdupsNS, "uri1");
 
         conn.add(cpu, loadPerc, uri1);
         conn.add(cpu, loadPerc, uri2);
         conn.add(cpu, loadPerc, uri3);
         conn.commit();
 
-        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, true, new Resource[0]);
+        RepositoryResult<Statement> result = conn.getStatements(cpu, loadPerc, null, true);
         int count = 0;
         while (result.hasNext()) {
             count++;
@@ -451,8 +448,8 @@
     public void testNamespaceUsage() throws Exception {
         RepositoryConnection conn = repository.getConnection();
         conn.setNamespace("lit", litdupsNS);
-        URI loadPerc = vf.createURI(litdupsNS, "loadPerc");
-        final URI uri1 = vf.createURI(litdupsNS, "uri1");
+        IRI loadPerc = VF.createIRI(litdupsNS, "loadPerc");
+        final IRI uri1 = VF.createIRI(litdupsNS, "uri1");
         conn.add(cpu, loadPerc, uri1);
         conn.commit();
 
@@ -493,13 +490,13 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "undergradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "degreeFrom")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "gradDegreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "degreeFrom")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "degreeFrom"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "memberOf")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "memberOf"), RDFS.SUBPROPERTYOF, vf.createURI(litdupsNS, "associatedWith")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), vf.createURI(litdupsNS, "undergradDegreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradB"), vf.createURI(litdupsNS, "gradDegreeFrom"), vf.createURI(litdupsNS, "Yale")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "ProfessorC"), vf.createURI(litdupsNS, "memberOf"), vf.createURI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "undergradDegreeFrom"), RDFS.SUBPROPERTYOF, VF.createIRI(litdupsNS, "degreeFrom")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "gradDegreeFrom"), RDFS.SUBPROPERTYOF, VF.createIRI(litdupsNS, "degreeFrom")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "degreeFrom"), RDFS.SUBPROPERTYOF, VF.createIRI(litdupsNS, "memberOf")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "memberOf"), RDFS.SUBPROPERTYOF, VF.createIRI(litdupsNS, "associatedWith")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "UgradA"), VF.createIRI(litdupsNS, "undergradDegreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "GradB"), VF.createIRI(litdupsNS, "gradDegreeFrom"), VF.createIRI(litdupsNS, "Yale")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "ProfessorC"), VF.createIRI(litdupsNS, "memberOf"), VF.createIRI(litdupsNS, "Harvard")));
         conn.commit();
         conn.close();
 
@@ -557,10 +554,10 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "undergradDegreeFrom"), OWL.EQUIVALENTPROPERTY, vf.createURI(litdupsNS, "ugradDegreeFrom")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), vf.createURI(litdupsNS, "undergradDegreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradB"), vf.createURI(litdupsNS, "ugradDegreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradC"), vf.createURI(litdupsNS, "ugraduateDegreeFrom"), vf.createURI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "undergradDegreeFrom"), OWL.EQUIVALENTPROPERTY, VF.createIRI(litdupsNS, "ugradDegreeFrom")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "UgradA"), VF.createIRI(litdupsNS, "undergradDegreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "GradB"), VF.createIRI(litdupsNS, "ugradDegreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "GradC"), VF.createIRI(litdupsNS, "ugraduateDegreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
         conn.commit();
         conn.close();
 
@@ -588,9 +585,9 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "friendOf"), RDF.TYPE, OWL.SYMMETRICPROPERTY));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "Bob"), vf.createURI(litdupsNS, "friendOf"), vf.createURI(litdupsNS, "Jeff")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "James"), vf.createURI(litdupsNS, "friendOf"), vf.createURI(litdupsNS, "Jeff")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "friendOf"), RDF.TYPE, OWL.SYMMETRICPROPERTY));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "Bob"), VF.createIRI(litdupsNS, "friendOf"), VF.createIRI(litdupsNS, "Jeff")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "James"), VF.createIRI(litdupsNS, "friendOf"), VF.createIRI(litdupsNS, "Jeff")));
         conn.commit();
         conn.close();
 
@@ -638,12 +635,12 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "subRegionOf"), RDF.TYPE, OWL.TRANSITIVEPROPERTY));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "Queens"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NYC")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "NYC"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NY")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "NY"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "US")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "US"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "NorthAmerica")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "NorthAmerica"), vf.createURI(litdupsNS, "subRegionOf"), vf.createURI(litdupsNS, "World")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "subRegionOf"), RDF.TYPE, OWL.TRANSITIVEPROPERTY));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "Queens"), VF.createIRI(litdupsNS, "subRegionOf"), VF.createIRI(litdupsNS, "NYC")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "NYC"), VF.createIRI(litdupsNS, "subRegionOf"), VF.createIRI(litdupsNS, "NY")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "NY"), VF.createIRI(litdupsNS, "subRegionOf"), VF.createIRI(litdupsNS, "US")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "US"), VF.createIRI(litdupsNS, "subRegionOf"), VF.createIRI(litdupsNS, "NorthAmerica")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "NorthAmerica"), VF.createIRI(litdupsNS, "subRegionOf"), VF.createIRI(litdupsNS, "World")));
         conn.commit();
         conn.close();
 
@@ -701,10 +698,10 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "degreeFrom"), OWL.INVERSEOF, vf.createURI(litdupsNS, "hasAlumnus")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), vf.createURI(litdupsNS, "degreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "GradB"), vf.createURI(litdupsNS, "degreeFrom"), vf.createURI(litdupsNS, "Harvard")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "Harvard"), vf.createURI(litdupsNS, "hasAlumnus"), vf.createURI(litdupsNS, "AlumC")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "degreeFrom"), OWL.INVERSEOF, VF.createIRI(litdupsNS, "hasAlumnus")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "UgradA"), VF.createIRI(litdupsNS, "degreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "GradB"), VF.createIRI(litdupsNS, "degreeFrom"), VF.createIRI(litdupsNS, "Harvard")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "Harvard"), VF.createIRI(litdupsNS, "hasAlumnus"), VF.createIRI(litdupsNS, "AlumC")));
         conn.commit();
         conn.close();
 
@@ -742,11 +739,11 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "UndergraduateStudent"), RDFS.SUBCLASSOF, vf.createURI(litdupsNS, "Student")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "Student"), RDFS.SUBCLASSOF, vf.createURI(litdupsNS, "Person")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "UgradA"), RDF.TYPE, vf.createURI(litdupsNS, "UndergraduateStudent")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentB"), RDF.TYPE, vf.createURI(litdupsNS, "Student")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "PersonC"), RDF.TYPE, vf.createURI(litdupsNS, "Person")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "UndergraduateStudent"), RDFS.SUBCLASSOF, VF.createIRI(litdupsNS, "Student")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "Student"), RDFS.SUBCLASSOF, VF.createIRI(litdupsNS, "Person")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "UgradA"), RDF.TYPE, VF.createIRI(litdupsNS, "UndergraduateStudent")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentB"), RDF.TYPE, VF.createIRI(litdupsNS, "Student")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "PersonC"), RDF.TYPE, VF.createIRI(litdupsNS, "Person")));
         conn.commit();
         conn.close();
 
@@ -755,7 +752,7 @@
         conn = repository.getConnection();
 
         //simple api first
-        RepositoryResult<Statement> person = conn.getStatements(null, RDF.TYPE, vf.createURI(litdupsNS, "Person"), true);
+        RepositoryResult<Statement> person = conn.getStatements(null, RDF.TYPE, VF.createIRI(litdupsNS, "Person"), true);
         int count = 0;
         while (person.hasNext()) {
             count++;
@@ -804,12 +801,12 @@
 		}
 
         RepositoryConnection conn = repository.getConnection();
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentA1"), OWL.SAMEAS, vf.createURI(litdupsNS, "StudentA2")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentA2"), OWL.SAMEAS, vf.createURI(litdupsNS, "StudentA3")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentB1"), OWL.SAMEAS, vf.createURI(litdupsNS, "StudentB2")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentB2"), OWL.SAMEAS, vf.createURI(litdupsNS, "StudentB3")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentA1"), vf.createURI(litdupsNS, "pred1"), vf.createURI(litdupsNS, "StudentB3")));
-        conn.add(new StatementImpl(vf.createURI(litdupsNS, "StudentB1"), vf.createURI(litdupsNS, "pred2"), vf.createURI(litdupsNS, "StudentA3")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentA1"), OWL.SAMEAS, VF.createIRI(litdupsNS, "StudentA2")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentA2"), OWL.SAMEAS, VF.createIRI(litdupsNS, "StudentA3")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentB1"), OWL.SAMEAS, VF.createIRI(litdupsNS, "StudentB2")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentB2"), OWL.SAMEAS, VF.createIRI(litdupsNS, "StudentB3")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentA1"), VF.createIRI(litdupsNS, "pred1"), VF.createIRI(litdupsNS, "StudentB3")));
+        conn.add(VF.createStatement(VF.createIRI(litdupsNS, "StudentB1"), VF.createIRI(litdupsNS, "pred2"), VF.createIRI(litdupsNS, "StudentA3")));
         conn.commit();
         conn.close();
 
@@ -963,7 +960,7 @@
         conn.add(stream, "", RDFFormat.TRIG);
         conn.commit();
 
-        RepositoryResult<Statement> statements = conn.getStatements(null, vf.createURI("http://www.example.org/vocabulary#name"), null, true, vf.createURI("http://www.example.org/exampleDocument#G1"));
+        RepositoryResult<Statement> statements = conn.getStatements(null, VF.createIRI("http://www.example.org/vocabulary#name"), null, true, VF.createIRI("http://www.example.org/exampleDocument#G1"));
         int count = 0;
         while (statements.hasNext()) {
             statements.next();
@@ -978,7 +975,7 @@
 //    public void testNamedGraphLoadWInlineAuth() throws Exception {
 //        InputStream stream = Thread.currentThread().getContextClassLoader().getResourceAsStream("namedgraphs.trig");
 //        assertNotNull(stream);
-//        URI auth1 = vf.createURI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "1");
+//        URI auth1 = vf.createIRI(RdfCloudTripleStoreConstants.AUTH_NAMESPACE, "1");
 //        RepositoryConnection conn = repository.getConnection();
 //        conn.add(stream, "", RDFFormat.TRIG, auth1);
 //        conn.commit();
@@ -1036,7 +1033,7 @@
 //    }
 
     private static String escape(Value r) {
-        if (r instanceof URI) {
+        if (r instanceof IRI) {
 			return "<" + r.toString() +">";
 		}
         return r.toString();
@@ -1107,7 +1104,7 @@
                 "  } .\n" +
                 "}";
         TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
-        tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH, vf.createLiteral("2"));
+        tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH, VF.createLiteral("2"));
         CountTupleHandler tupleHandler = new CountTupleHandler();
         tupleQuery.evaluate(tupleHandler);
         assertEquals(1, tupleHandler.getCount());
@@ -1157,7 +1154,7 @@
                 "  } .\n" +
                 "}";
         TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, query);
-        tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH, vf.createLiteral("2"));
+        tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERY_AUTH, VF.createLiteral("2"));
         CountTupleHandler tupleHandler = new CountTupleHandler();
         tupleQuery.evaluate(tupleHandler);
         assertEquals(1, tupleHandler.getCount());
@@ -1287,12 +1284,12 @@
         assertEquals(4, tupleHandler.getCount());
 
         tupleHandler = new CountTupleHandler();
-        conn.clear(new URIImpl("http://example/addresses#G2"));
+        conn.clear(VF.createIRI("http://example/addresses#G2"));
         tupleQuery.evaluate(tupleHandler);
         assertEquals(2, tupleHandler.getCount());
 
         tupleHandler = new CountTupleHandler();
-        conn.clear(new URIImpl("http://example/addresses#G1"));
+        conn.clear(VF.createIRI("http://example/addresses#G1"));
         tupleQuery.evaluate(tupleHandler);
         assertEquals(0, tupleHandler.getCount());
 
diff --git a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreTest.java b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreTest.java
index fa8e6f5..99d400d 100644
--- a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreTest.java
+++ b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,32 +16,36 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya;
 
+import java.util.GregorianCalendar;
+import java.util.List;
 
+import javax.xml.datatype.DatatypeConfigurationException;
+import javax.xml.datatype.DatatypeFactory;
 
-import junit.framework.TestCase;
+import org.apache.accumulo.core.client.Connector;
+import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.accumulo.core.client.Connector;
-import org.apache.accumulo.core.client.mock.MockInstance;
-import org.openrdf.model.Namespace;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.*;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.RepositoryResult;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.model.Namespace;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.RepositoryResult;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 
-import javax.xml.datatype.DatatypeConfigurationException;
-import javax.xml.datatype.DatatypeFactory;
-import java.util.GregorianCalendar;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
+import junit.framework.TestCase;
 
 /**
  * Class PartitionConnectionTest
@@ -59,7 +61,7 @@
     private SailRepository repository;
     private SailRepositoryConnection connection;
 
-    ValueFactory vf = ValueFactoryImpl.getInstance();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private String objectUuid = "objectuuid1";
     private String ancestor = "ancestor1";
@@ -90,113 +92,113 @@
     }
 
     private void loadData() throws RepositoryException, DatatypeConfigurationException {
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, objectUuid), vf.createURI(NAMESPACE, "name"), vf.createLiteral("objUuid")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, objectUuid), VF.createIRI(NAMESPACE, "name"), VF.createLiteral("objUuid")));
         //created
         String uuid = "uuid1";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Created")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "createdItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:A")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit1")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit2")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit3")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "stringLit"), vf.createLiteral("stringLit4")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit1")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit2")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "strLit1"), vf.createLiteral("strLit3")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 0, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 1, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Created")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "createdItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:A")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "stringLit"), VF.createLiteral("stringLit1")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "stringLit"), VF.createLiteral("stringLit2")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "stringLit"), VF.createLiteral("stringLit3")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "stringLit"), VF.createLiteral("stringLit4")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "strLit1"), VF.createLiteral("strLit1")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "strLit1"), VF.createLiteral("strLit2")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "strLit1"), VF.createLiteral("strLit3")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 0, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 1, 0, 0, 0))));
         //clicked
         uuid = "uuid2";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Clicked")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "clickedItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:B")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 2, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 3, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Clicked")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "clickedItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:B")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 2, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 3, 0, 0, 0))));
         //deleted
         uuid = "uuid3";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Deleted")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "deletedItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:C")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 4, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 5, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Deleted")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "deletedItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:C")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 4, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 5, 0, 0, 0))));
         //dropped
         uuid = "uuid4";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Dropped")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "droppedItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:D")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 6, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 7, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Dropped")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "droppedItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:D")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 6, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 7, 0, 0, 0))));
         //received
         uuid = "uuid5";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Received")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "receivedItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:E")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 8, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 9, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Received")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "receivedItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:E")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 8, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 9, 0, 0, 0))));
         //sent
         uuid = "uuid6";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Sent")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "sentItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:F")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 10, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 11, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Sent")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "sentItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:F")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 10, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 11, 0, 0, 0))));
         //stored
         uuid = "uuid7";
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(RDF_NS, "type"), vf.createURI(NAMESPACE, "Stored")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "storedItem"), vf.createURI(NAMESPACE, objectUuid)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedBy"), vf.createURI("urn:system:G")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "performedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 12, 0, 0, 0))));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, uuid), vf.createURI(NAMESPACE, "reportedAt"), vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 13, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(NAMESPACE, "Stored")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "storedItem"), VF.createIRI(NAMESPACE, objectUuid)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedBy"), VF.createIRI("urn:system:G")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "performedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 12, 0, 0, 0))));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, uuid), VF.createIRI(NAMESPACE, "reportedAt"), VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(2011, 7, 12, 6, 13, 0, 0, 0))));
 
         //derivedFrom
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, descendant), vf.createURI(NAMESPACE, "derivedFrom"), vf.createURI(NAMESPACE, ancestor)));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, descendant), vf.createURI(NAMESPACE, "name"), vf.createLiteral("descendantOne")));
-        connection.add(new StatementImpl(vf.createURI(NAMESPACE, ancestor), vf.createURI(NAMESPACE, "name"), vf.createLiteral("ancestor1")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, descendant), VF.createIRI(NAMESPACE, "derivedFrom"), VF.createIRI(NAMESPACE, ancestor)));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, descendant), VF.createIRI(NAMESPACE, "name"), VF.createLiteral("descendantOne")));
+        connection.add(VF.createStatement(VF.createIRI(NAMESPACE, ancestor), VF.createIRI(NAMESPACE, "name"), VF.createLiteral("ancestor1")));
 
         //heartbeats
         String hbuuid = "hbuuid1";
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 1) + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(1 + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:A")));
-        connection.add(new StatementImpl(vf.createURI("urn:system:A"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HB_TIMESTAMP), VF.createLiteral((START + 1) + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "count"), VF.createLiteral(1 + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "systemName"), VF.createIRI("urn:system:A")));
+        connection.add(VF.createStatement(VF.createIRI("urn:system:A"), VF.createIRI(HBNAMESPACE, "heartbeat"), VF.createIRI(HBNAMESPACE, hbuuid)));
 
         hbuuid = "hbuuid2";
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 2) + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(2 + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:B")));
-        connection.add(new StatementImpl(vf.createURI("urn:system:B"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HB_TIMESTAMP), VF.createLiteral((START + 2) + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "count"), VF.createLiteral(2 + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "systemName"), VF.createIRI("urn:system:B")));
+        connection.add(VF.createStatement(VF.createIRI("urn:system:B"), VF.createIRI(HBNAMESPACE, "heartbeat"), VF.createIRI(HBNAMESPACE, hbuuid)));
 
         hbuuid = "hbuuid3";
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(RDF_NS, "type"), vf.createURI(HBNAMESPACE, "HeartbeatMeasurement")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HB_TIMESTAMP), vf.createLiteral((START + 3) + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "count"), vf.createLiteral(3 + "")));
-        connection.add(new StatementImpl(vf.createURI(HBNAMESPACE, hbuuid), vf.createURI(HBNAMESPACE, "systemName"), vf.createURI("urn:system:C")));
-        connection.add(new StatementImpl(vf.createURI("urn:system:C"), vf.createURI(HBNAMESPACE, "heartbeat"), vf.createURI(HBNAMESPACE, hbuuid)));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(RDF_NS, "type"), VF.createIRI(HBNAMESPACE, "HeartbeatMeasurement")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HB_TIMESTAMP), VF.createLiteral((START + 3) + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "count"), VF.createLiteral(3 + "")));
+        connection.add(VF.createStatement(VF.createIRI(HBNAMESPACE, hbuuid), VF.createIRI(HBNAMESPACE, "systemName"), VF.createIRI("urn:system:C")));
+        connection.add(VF.createStatement(VF.createIRI("urn:system:C"), VF.createIRI(HBNAMESPACE, "heartbeat"), VF.createIRI(HBNAMESPACE, hbuuid)));
 
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj2")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj3")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj2")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj3")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral("obj1")));
-        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral("obj4")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral("obj1")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral("obj2")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral("obj3")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral("obj4")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral("obj1")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral("obj2")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral("obj3")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral("obj4")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj3"), VF.createIRI("urn:pred"), VF.createLiteral("obj1")));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj3"), VF.createIRI("urn:pred"), VF.createLiteral("obj4")));
 
         //Foreign Chars
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM))); 
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD))); 
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_TH))); 
-        connection.add(new StatementImpl(vf.createURI("urn:subj1"), vf.createURI("urn:pred"), vf.createLiteral(FAN_RN))); 
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM)));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD)));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_TH)));
-        connection.add(new StatementImpl(vf.createURI("urn:subj2"), vf.createURI("urn:pred"), vf.createLiteral(FAN_RN)));
-        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_SIM)));
-        connection.add(new StatementImpl(vf.createURI("urn:subj3"), vf.createURI("urn:pred"), vf.createLiteral(FAN_CH_TRAD)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_SIM)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_TRAD)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_TH)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj1"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_RN)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_SIM)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_TRAD)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_TH)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj2"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_RN)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj3"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_SIM)));
+        connection.add(VF.createStatement(VF.createIRI("urn:subj3"), VF.createIRI("urn:pred"), VF.createLiteral(FAN_CH_TRAD)));
         
         connection.commit();
     }
@@ -217,7 +219,7 @@
         GregorianCalendar gregorianCalendar = new GregorianCalendar();
         gregorianCalendar.setTimeInMillis(ts);
         //"2011-07-12T05:12:00.000Z"^^xsd:dateTime
-        return "\"" + vf.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar)).stringValue() + "\"^^xsd:dateTime";
+        return "\"" + VF.createLiteral(DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar)).stringValue() + "\"^^xsd:dateTime";
     }
 
 //    public void testScanAll() throws Exception {
@@ -263,7 +265,7 @@
     }
 
     public void testAddCommitStatement() throws Exception {
-        StatementImpl stmt = new StatementImpl(vf.createURI("urn:namespace#subj"), vf.createURI("urn:namespace#pred"), vf.createLiteral("object"));
+        Statement stmt = VF.createStatement(VF.createIRI("urn:namespace#subj"), VF.createIRI("urn:namespace#pred"), VF.createLiteral("object"));
         connection.add(stmt);
         connection.commit();
     }
@@ -404,7 +406,7 @@
         TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
 //        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
 //        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
-//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createIRI(NAMESPACE, "performedAt"));
 //                tupleQuery.evaluate(new PrintTupleHandler());
         CountTupleHandler tupleHandler = new CountTupleHandler();
         tupleQuery.evaluate(tupleHandler);
@@ -464,7 +466,7 @@
         TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
 //        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
 //        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
-//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createIRI(NAMESPACE, "performedAt"));
 //                tupleQuery.evaluate(new PrintTupleHandler());
         CountTupleHandler tupleHandler = new CountTupleHandler();
         tupleQuery.evaluate(tupleHandler);
@@ -494,7 +496,7 @@
         TupleQuery tupleQuery = connection.prepareTupleQuery(QueryLanguage.SPARQL, query);
 //        tupleQuery.setBinding(START_BINDING, vf.createLiteral(START));
 //        tupleQuery.setBinding(END_BINDING, vf.createLiteral(END));
-//        tupleQuery.setBinding(TIME_PREDICATE, vf.createURI(NAMESPACE, "performedAt"));
+//        tupleQuery.setBinding(TIME_PREDICATE, vf.createIRI(NAMESPACE, "performedAt"));
 //        tupleQuery.evaluate(new PrintTupleHandler());
         CountTupleHandler tupleHandler = new CountTupleHandler();
         tupleQuery.evaluate(tupleHandler);
diff --git a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreUtilsTest.java b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreUtilsTest.java
index c80c6c4..b1ba3fc 100644
--- a/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreUtilsTest.java
+++ b/sail/src/test/java/org/apache/rya/RdfCloudTripleStoreUtilsTest.java
@@ -24,11 +24,11 @@
 //
 //import junit.framework.TestCase;
 //
-//import org.openrdf.model.BNode;
-//import org.openrdf.model.Resource;
-//import org.openrdf.model.URI;
-//import org.openrdf.model.Value;
-//import org.openrdf.model.impl.ValueFactoryImpl;
+//import org.eclipse.rdf4j.model.BNode;
+//import org.eclipse.rdf4j.model.Resource;
+//import org.eclipse.rdf4j.model.IRI;
+//import org.eclipse.rdf4j.model.Value;
+//import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
 //
 //import com.google.common.io.ByteStreams;
 //
@@ -37,8 +37,8 @@
 //public class RdfCloudTripleStoreUtilsTest extends TestCase {
 //
 //	public void testWriteReadURI() throws Exception {
-//		final ValueFactoryImpl vf = new ValueFactoryImpl();
-//		URI uri = vf.createURI("http://www.example.org/test/rel");
+//		final ValueFactoryImpl vf = SimpleValueFactory.getInstance();
+//		URI uri = vf.createIRI("http://www.example.org/test/rel");
 //		byte[] value = writeValue(uri);
 //
 //		Value readValue = readValue(ByteStreams
@@ -47,7 +47,7 @@
 //	}
 //
 //	public void testWriteReadBNode() throws Exception {
-//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		final ValueFactoryImpl vf = SimpleValueFactory.getInstance();
 //		Value val = vf.createBNode("bnodeid");
 //		byte[] value = writeValue(val);
 //
@@ -57,7 +57,7 @@
 //	}
 //
 //	public void testWriteReadLiteral() throws Exception {
-//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		final ValueFactoryImpl vf = SimpleValueFactory.getInstance();
 //		Value val = vf.createLiteral("myliteral");
 //		byte[] value = writeValue(val);
 //
@@ -67,7 +67,7 @@
 //	}
 //
 //	public void testContexts() throws Exception {
-//		final ValueFactoryImpl vf = new ValueFactoryImpl();
+//		final ValueFactoryImpl vf = SimpleValueFactory.getInstance();
 //		BNode cont1 = vf.createBNode("cont1");
 //		BNode cont2 = vf.createBNode("cont2");
 //		BNode cont3 = vf.createBNode("cont3");
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
index 63c5d13..5be8e7e 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/QueryJoinSelectOptimizerTest.java
@@ -19,23 +19,12 @@
  * under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
-import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
-import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
-import org.apache.rya.rdftriplestore.evaluation.QueryJoinSelectOptimizer;
-import org.apache.rya.rdftriplestore.evaluation.RdfCloudTripleStoreSelectivityEvaluationStatistics;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchWriter;
@@ -53,14 +42,20 @@
 import org.apache.accumulo.core.data.Value;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.api.persist.RdfEvalStatsDAO;
+import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
+import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.evaluation.impl.FilterOptimizer;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.evaluation.impl.FilterOptimizer;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class QueryJoinSelectOptimizerTest {
 
@@ -950,7 +945,7 @@
     }
 
     TupleExpr te = getTupleExpr(q6);
-    TupleExpr te2 = (TupleExpr) te.clone();
+    TupleExpr te2 = te.clone();
     System.out.println("Bindings are " + te.getBindingNames());
     RdfCloudTripleStoreSelectivityEvaluationStatistics ars = new RdfCloudTripleStoreSelectivityEvaluationStatistics(arc, res, accc);
     QueryJoinSelectOptimizer qjs = new QueryJoinSelectOptimizer(ars, accc);
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatisticsTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatisticsTest.java
index bac1b11..77598e7 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatisticsTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/RdfCloudTripleStoreSelectivityEvaluationStatisticsTest.java
@@ -19,45 +19,37 @@
  * under the License.
  */
 
-
-
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
-import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
-import org.apache.rya.api.persist.RdfEvalStatsDAO;
-import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
-import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
-
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
 import org.apache.accumulo.core.client.BatchWriter;
 import org.apache.accumulo.core.client.BatchWriterConfig;
 import org.apache.accumulo.core.client.Connector;
 import org.apache.accumulo.core.client.Instance;
-import org.apache.accumulo.core.client.Scanner;
 import org.apache.accumulo.core.client.TableExistsException;
 import org.apache.accumulo.core.client.TableNotFoundException;
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.client.security.tokens.PasswordToken;
-import org.apache.accumulo.core.data.Key;
 import org.apache.accumulo.core.data.Mutation;
-import org.apache.accumulo.core.data.Range;
 import org.apache.accumulo.core.data.Value;
-import org.apache.accumulo.core.security.Authorizations;
 import org.apache.hadoop.io.Text;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.apache.rya.api.layout.TablePrefixLayoutStrategy;
+import org.apache.rya.api.persist.RdfEvalStatsDAO;
+import org.apache.rya.joinselect.AccumuloSelectivityEvalDAO;
+import org.apache.rya.prospector.service.ProspectorServiceEvalStatsDAO;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
 
 public class RdfCloudTripleStoreSelectivityEvaluationStatisticsTest {
 
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/StatementPatternEvalTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/StatementPatternEvalTest.java
index c1e7d10..f40b4e9 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/StatementPatternEvalTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/evaluation/StatementPatternEvalTest.java
@@ -37,23 +37,24 @@
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStoreConnection.StoreTripleSource;
+import org.eclipse.rdf4j.common.iteration.CloseableIteration;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
+import org.eclipse.rdf4j.query.algebra.helpers.StatementPatternCollector;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.openrdf.model.impl.URIImpl;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
-import org.openrdf.query.algebra.helpers.StatementPatternCollector;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
-
-import info.aduna.iteration.CloseableIteration;
 
 public class StatementPatternEvalTest {
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private AccumuloRyaDAO dao;
     private AccumuloRdfConfiguration conf;
@@ -109,16 +110,16 @@
         Assert.assertEquals(3, bsList.size());
         
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new URIImpl("uri:Joe"));
-        expected1.addBinding("c", new URIImpl("uri:context1"));
+        expected1.addBinding("x", VF.createIRI("uri:Joe"));
+        expected1.addBinding("c", VF.createIRI("uri:context1"));
 
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new URIImpl("uri:Doug"));
-        expected2.addBinding("c", new URIImpl("uri:context2"));
+        expected2.addBinding("x", VF.createIRI("uri:Doug"));
+        expected2.addBinding("c", VF.createIRI("uri:context2"));
         
         QueryBindingSet expected3 = new QueryBindingSet();
-        expected3.addBinding("x", new URIImpl("uri:Eric"));
-        expected3.addBinding("c", new URIImpl("uri:context3"));
+        expected3.addBinding("x", VF.createIRI("uri:Eric"));
+        expected3.addBinding("c", VF.createIRI("uri:context3"));
         
         Set<BindingSet> expected = new HashSet<>(Arrays.asList(expected1, expected2, expected3));
         Set<BindingSet> actual = new HashSet<>(bsList);
@@ -149,10 +150,10 @@
         dao.add(statement3);
 
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("c", new URIImpl("uri:context2"));
+        bsConstraint1.addBinding("c", VF.createIRI("uri:context2"));
         
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("c", new URIImpl("uri:context1"));
+        bsConstraint2.addBinding("c", VF.createIRI("uri:context1"));
 
         
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = eval.evaluate(spList.get(0), Arrays.asList(bsConstraint1, bsConstraint2));
@@ -165,12 +166,12 @@
         Assert.assertEquals(2, bsList.size());
         
         QueryBindingSet expected1 = new QueryBindingSet();
-        expected1.addBinding("x", new URIImpl("uri:Joe"));
-        expected1.addBinding("c", new URIImpl("uri:context1"));
+        expected1.addBinding("x", VF.createIRI("uri:Joe"));
+        expected1.addBinding("c", VF.createIRI("uri:context1"));
 
         QueryBindingSet expected2 = new QueryBindingSet();
-        expected2.addBinding("x", new URIImpl("uri:Doug"));
-        expected2.addBinding("c", new URIImpl("uri:context2"));
+        expected2.addBinding("x", VF.createIRI("uri:Doug"));
+        expected2.addBinding("c", VF.createIRI("uri:context2"));
         
         Set<BindingSet> expected = new HashSet<>(Arrays.asList(expected1, expected2));
         Set<BindingSet> actual = new HashSet<>(bsList);
@@ -203,10 +204,10 @@
         dao.add(statement3);
 
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("c", new URIImpl("uri:context1"));
+        bsConstraint1.addBinding("c", VF.createIRI("uri:context1"));
         
         QueryBindingSet bsConstraint2 = new QueryBindingSet();
-        bsConstraint2.addBinding("c", new URIImpl("uri:context1"));
+        bsConstraint2.addBinding("c", VF.createIRI("uri:context1"));
 
         
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = eval.evaluate(spList.get(0), Arrays.asList(bsConstraint1, bsConstraint2));
@@ -219,8 +220,8 @@
         Assert.assertEquals(1, bsList.size());
         
         QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("x", new URIImpl("uri:Joe"));
-        expected.addBinding("c", new URIImpl("uri:context1"));
+        expected.addBinding("x", VF.createIRI("uri:Joe"));
+        expected.addBinding("c", VF.createIRI("uri:context1"));
         
         Assert.assertEquals(expected, bsList.get(0));
 
@@ -260,7 +261,7 @@
         Assert.assertEquals(1, bsList.size());
        
         QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("x", new URIImpl("uri:Joe"));
+        expected.addBinding("x", VF.createIRI("uri:Joe"));
         
         Assert.assertEquals(expected, bsList.get(0));
         
@@ -289,7 +290,7 @@
         dao.add(statement3);
 
         QueryBindingSet bsConstraint1 = new QueryBindingSet();
-        bsConstraint1.addBinding("x", new URIImpl("uri:Doug"));
+        bsConstraint1.addBinding("x", VF.createIRI("uri:Doug"));
         
         CloseableIteration<BindingSet, QueryEvaluationException> iteration = eval.evaluate(spList.get(0), Arrays.asList(bsConstraint1));
 
@@ -301,7 +302,7 @@
         Assert.assertEquals(1, bsList.size());
         
         QueryBindingSet expected = new QueryBindingSet();
-        expected.addBinding("x", new URIImpl("uri:Doug"));
+        expected.addBinding("x", VF.createIRI("uri:Doug"));
 
         Assert.assertEquals(expected, bsList.get(0));
         
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitorTest.java
index d239577..9c08468 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/AllValuesFromVisitorTest.java
@@ -29,44 +29,44 @@
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 public class AllValuesFromVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     // Value types
-    private final URI person = vf.createURI("urn:Person");
-    private final URI dog = vf.createURI("urn:Dog");
+    private final IRI person = VF.createIRI("urn:Person");
+    private final IRI dog = VF.createIRI("urn:Dog");
     // Predicates
-    private final URI parent = vf.createURI("urn:parent");
-    private final URI relative = vf.createURI("urn:relative");
+    private final IRI parent = VF.createIRI("urn:parent");
+    private final IRI relative = VF.createIRI("urn:relative");
     // Restriction types
-    private final URI parentsAreTallPeople = vf.createURI("urn:parentsAreTallPeople");
-    private final URI parentsArePeople = vf.createURI("urn:parentsArePeople");
-    private final URI relativesArePeople = vf.createURI("urn:relativesArePeople");
-    private final URI parentsAreDogs = vf.createURI("urn:parentsAreDogs");
+    private final IRI parentsAreTallPeople = VF.createIRI("urn:parentsAreTallPeople");
+    private final IRI parentsArePeople = VF.createIRI("urn:parentsArePeople");
+    private final IRI relativesArePeople = VF.createIRI("urn:relativesArePeople");
+    private final IRI parentsAreDogs = VF.createIRI("urn:parentsAreDogs");
 
     @Test
     public void testRewriteTypePattern() throws Exception {
         // Configure a mock instance engine with an ontology:
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        Map<Resource, Set<URI>> personAVF = new HashMap<>();
+        Map<Resource, Set<IRI>> personAVF = new HashMap<>();
         personAVF.put(parentsAreTallPeople, new HashSet<>());
         personAVF.put(parentsArePeople, new HashSet<>());
         personAVF.put(relativesArePeople, new HashSet<>());
@@ -74,7 +74,7 @@
         personAVF.get(parentsArePeople).add(parent);
         personAVF.get(relativesArePeople).add(relative);
         personAVF.get(relativesArePeople).add(parent);
-        Map<Resource, Set<URI>> dogAVF = new HashMap<>();
+        Map<Resource, Set<IRI>> dogAVF = new HashMap<>();
         dogAVF.put(parentsAreDogs, new HashSet<>());
         dogAVF.get(parentsAreDogs).add(parent);
         when(inferenceEngine.getAllValuesFromByValueType(person)).thenReturn(personAVF);
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitorTest.java
index 40f9098..0c5542e 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/DomainRangeVisitorTest.java
@@ -27,36 +27,36 @@
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.model.vocabulary.RDFS;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.model.vocabulary.RDFS;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 public class DomainRangeVisitorTest {
     private static final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory vf = new ValueFactoryImpl();
-    private static final URI person = vf.createURI("lubm:Person");
-    private static final URI advisor = vf.createURI("lubm:advisor");
-    private static final URI takesCourse = vf.createURI("lubm:takesCourse");
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
+    private static final IRI person = VF.createIRI("lubm:Person");
+    private static final IRI advisor = VF.createIRI("lubm:advisor");
+    private static final IRI takesCourse = VF.createIRI("lubm:takesCourse");
 
     @Test
     public void testRewriteTypePattern() throws Exception {
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        final Set<URI> domainPredicates = new HashSet<>();
-        final Set<URI> rangePredicates = new HashSet<>();
+        final Set<IRI> domainPredicates = new HashSet<>();
+        final Set<IRI> rangePredicates = new HashSet<>();
         domainPredicates.add(advisor);
         domainPredicates.add(takesCourse);
         rangePredicates.add(advisor);
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitorTest.java
index ba6b7da..3ce93c0 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasSelfVisitorTest.java
@@ -25,34 +25,34 @@
 import java.util.Set;
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Extension;
+import org.eclipse.rdf4j.query.algebra.ExtensionElem;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Extension;
-import org.openrdf.query.algebra.ExtensionElem;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 public class HasSelfVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    private static final URI narcissist = VF.createURI("urn:Narcissist");
-    private static final URI love = VF.createURI("urn:love");
-    private static final URI self = VF.createURI("urn:self");
+    private static final IRI narcissist = VF.createIRI("urn:Narcissist");
+    private static final IRI love = VF.createIRI("urn:love");
+    private static final IRI self = VF.createIRI("urn:self");
 
     @Test
     public void testTypePattern() throws Exception {
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        final Set<URI> narcissistProps = new HashSet<>();
+        final Set<IRI> narcissistProps = new HashSet<>();
         narcissistProps.add(love);
         when(inferenceEngine.getHasSelfImplyingType(narcissist)).thenReturn(narcissistProps);
         final Var subj = new Var("s");
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasValueVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasValueVisitorTest.java
index c5f2a90..483d593 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasValueVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/HasValueVisitorTest.java
@@ -23,50 +23,51 @@
 
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.rdftriplestore.inference.HasValueVisitor;
-import org.apache.rya.rdftriplestore.inference.InferenceEngine;
+import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 public class HasValueVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    private final URI chordate = vf.createURI("urn:Chordate");
-    private final URI vertebrate = vf.createURI("urn:Vertebrate");
-    private final URI mammal = vf.createURI("urn:Mammal");
-    private final URI tunicate = vf.createURI("urn:Tunicate");
-    private final URI hasCharacteristic = vf.createURI("urn:anatomicalCharacteristic");
-    private final URI notochord = vf.createURI("urn:notochord");
-    private final URI skull = vf.createURI("urn:skull");
-    private final URI belongsTo = vf.createURI("urn:belongsToTaxon");
-    private final URI chordata = vf.createURI("urn:Chordata");
+    private final IRI chordate = VF.createIRI("urn:Chordate");
+    private final IRI vertebrate = VF.createIRI("urn:Vertebrate");
+    private final IRI mammal = VF.createIRI("urn:Mammal");
+    private final IRI tunicate = VF.createIRI("urn:Tunicate");
+    private final IRI hasCharacteristic = VF.createIRI("urn:anatomicalCharacteristic");
+    private final IRI notochord = VF.createIRI("urn:notochord");
+    private final IRI skull = VF.createIRI("urn:skull");
+    private final IRI belongsTo = VF.createIRI("urn:belongsToTaxon");
+    private final IRI chordata = VF.createIRI("urn:Chordata");
 
     @Test
     public void testRewriteTypePattern() throws Exception {
         // Configure a mock instance engine with an ontology:
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        Map<URI, Set<Value>> vertebrateValues = new HashMap<>();
+        Map<IRI, Set<Value>> vertebrateValues = new HashMap<>();
         vertebrateValues.put(hasCharacteristic, new HashSet<>());
         vertebrateValues.put(belongsTo, new HashSet<>());
         vertebrateValues.get(hasCharacteristic).add(notochord);
@@ -133,10 +134,10 @@
         Assert.assertNotNull(belongsToFSP);
         // Verify the expected FSPs for the appropriate properties:
         Assert.assertEquals(2, hasCharacteristicFSP.statements.size());
-        Assert.assertTrue(hasCharacteristicFSP.statements.contains(vf.createStatement(vertebrate, hasCharacteristic, skull)));
-        Assert.assertTrue(hasCharacteristicFSP.statements.contains(vf.createStatement(vertebrate, hasCharacteristic, notochord)));
+        Assert.assertTrue(hasCharacteristicFSP.statements.contains(VF.createStatement(vertebrate, hasCharacteristic, skull)));
+        Assert.assertTrue(hasCharacteristicFSP.statements.contains(VF.createStatement(vertebrate, hasCharacteristic, notochord)));
         Assert.assertEquals(1, belongsToFSP.statements.size());
-        Assert.assertTrue(belongsToFSP.statements.contains(vf.createStatement(vertebrate, belongsTo, chordata)));
+        Assert.assertTrue(belongsToFSP.statements.contains(VF.createStatement(vertebrate, belongsTo, chordata)));
     }
 
     @Test
@@ -183,15 +184,24 @@
         Assert.assertEquals(fsp.getSubjectVar(), sp.getObjectVar());
         Assert.assertEquals(originalSP.getObjectVar(), fsp.getObjectVar());
         // Verify FSP: should provide (type, value) pairs
-        final Set<Statement> expectedStatements = new HashSet<>();
-        final URI fspPred = (URI) fsp.getPredicateVar().getValue();
-        expectedStatements.add(vf.createStatement(chordate, fspPred, notochord));
-        expectedStatements.add(vf.createStatement(tunicate, fspPred, notochord));
-        expectedStatements.add(vf.createStatement(vertebrate, fspPred, notochord));
-        expectedStatements.add(vf.createStatement(mammal, fspPred, notochord));
-        expectedStatements.add(vf.createStatement(vertebrate, fspPred, skull));
-        expectedStatements.add(vf.createStatement(mammal, fspPred, skull));
-        final Set<Statement> actualStatements = new HashSet<>(fsp.statements);
-        Assert.assertEquals(expectedStatements, actualStatements);
+        final List<Statement> expectedStatements = new LinkedList<>();
+        final IRI fspPred = (IRI) fsp.getPredicateVar().getValue();
+        expectedStatements.add(new NullableStatementImpl(chordate, fspPred, notochord));
+        expectedStatements.add(new NullableStatementImpl(tunicate, fspPred, notochord));
+        expectedStatements.add(new NullableStatementImpl(vertebrate, fspPred, notochord));
+        expectedStatements.add(new NullableStatementImpl(mammal, fspPred, notochord));
+        expectedStatements.add(new NullableStatementImpl(vertebrate, fspPred, skull));
+        expectedStatements.add(new NullableStatementImpl(mammal, fspPred, skull));
+        final List<Statement> actualStatements = new LinkedList<>(fsp.statements);
+        Assert.assertTrue(containsAll(expectedStatements, actualStatements));
+
+    }
+    private boolean containsAll(List<Statement> expected, List<Statement> actual){
+        for( Statement a : actual){
+            if (!expected.contains(a)){
+                return false;
+            }
+        }
+        return true;
     }
 }
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java
index b3eb900..3ef9e96 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceEngineTest.java
@@ -32,17 +32,17 @@
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import com.google.common.collect.Sets;
 
@@ -51,7 +51,7 @@
 public class InferenceEngineTest extends TestCase {
     private Connector connector;
     private AccumuloRyaDAO dao;
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private AccumuloRdfConfiguration conf;
     private RdfCloudTripleStore store;
     private InferenceEngine inferenceEngine;
@@ -102,19 +102,19 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
-        final URI a = vf.createURI("urn:A");
-        final URI b = vf.createURI("urn:B");
-        final URI c = vf.createURI("urn:C");
-        final URI d = vf.createURI("urn:D");
-        final URI e = vf.createURI("urn:E");
-        final URI f = vf.createURI("urn:F");
-        final URI g = vf.createURI("urn:G");
-        final URI z = vf.createURI("urn:Z");
-        final URI missing = vf.createURI("urn:Missing");
-        final Set<URI> empty = new HashSet<>();
-        final Set<URI> belowLevel2 = new HashSet<>(Arrays.asList(new URI[] { a, b }));
-        final Set<URI> belowLevel3 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e }));
-        final Set<URI> belowLevel4 = new HashSet<>(Arrays.asList(new URI[] { a, b, c, d, e, f, g }));
+        final IRI a = VF.createIRI("urn:A");
+        final IRI b = VF.createIRI("urn:B");
+        final IRI c = VF.createIRI("urn:C");
+        final IRI d = VF.createIRI("urn:D");
+        final IRI e = VF.createIRI("urn:E");
+        final IRI f = VF.createIRI("urn:F");
+        final IRI g = VF.createIRI("urn:G");
+        final IRI z = VF.createIRI("urn:Z");
+        final IRI missing = VF.createIRI("urn:Missing");
+        final Set<IRI> empty = new HashSet<>();
+        final Set<IRI> belowLevel2 = new HashSet<>(Arrays.asList(a, b));
+        final Set<IRI> belowLevel3 = new HashSet<>(Arrays.asList(a, b, c, d, e));
+        final Set<IRI> belowLevel4 = new HashSet<>(Arrays.asList(a, b, c, d, e, f, g));
         Assert.assertEquals(empty, inferenceEngine.getSubClasses(a));
         Assert.assertEquals(empty, inferenceEngine.getSubClasses(b));
         Assert.assertEquals(empty, inferenceEngine.getSubClasses(z));
@@ -141,20 +141,20 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
         final Graph graph = inferenceEngine.getSubPropertyOfGraph();
-        final URI p = vf.createURI("urn:p");
-        final URI q = vf.createURI("urn:q");
-        final URI r = vf.createURI("urn:r");
-        final URI s = vf.createURI("urn:s");
-        final URI t = vf.createURI("urn:t");
-        final URI u = vf.createURI("urn:u");
-        final URI v = vf.createURI("urn:v");
-        final URI w = vf.createURI("urn:w");
-        final URI missing = vf.createURI("urn:Missing");
-        final Set<URI> empty = new HashSet<>();
-        final Set<URI> belowQ = new HashSet<>(Arrays.asList(new URI[] { p }));
-        final Set<URI> belowR = new HashSet<>(Arrays.asList(new URI[] { p, r, s }));
-        final Set<URI> belowT = new HashSet<>(Arrays.asList(new URI[] { p, q }));
-        final Set<URI> belowU = new HashSet<>(Arrays.asList(new URI[] { p, q, r, s, t, u, v }));
+        final IRI p = VF.createIRI("urn:p");
+        final IRI q = VF.createIRI("urn:q");
+        final IRI r = VF.createIRI("urn:r");
+        final IRI s = VF.createIRI("urn:s");
+        final IRI t = VF.createIRI("urn:t");
+        final IRI u = VF.createIRI("urn:u");
+        final IRI v = VF.createIRI("urn:v");
+        final IRI w = VF.createIRI("urn:w");
+        final IRI missing = VF.createIRI("urn:Missing");
+        final Set<IRI> empty = new HashSet<>();
+        final Set<IRI> belowQ = new HashSet<>(Arrays.asList(p));
+        final Set<IRI> belowR = new HashSet<>(Arrays.asList(p, r, s));
+        final Set<IRI> belowT = new HashSet<>(Arrays.asList(p, q));
+        final Set<IRI> belowU = new HashSet<>(Arrays.asList(p, q, r, s, t, u, v));
         Assert.assertEquals(empty, InferenceEngine.findParents(graph, p));
         Assert.assertEquals(empty, InferenceEngine.findParents(graph, w));
         Assert.assertEquals(empty, InferenceEngine.findParents(graph, missing));
@@ -189,29 +189,29 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
-        final Set<URI> hasDomainD1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D1"));
-        final Set<URI> hasDomainD2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D2"));
-        final Set<URI> hasDomainD3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:D3"));
-        final Set<URI> hasRangeD1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D1"));
-        final Set<URI> hasRangeD2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D2"));
-        final Set<URI> hasRangeD3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:D3"));
-        final Set<URI> hasDomainR1 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R1"));
-        final Set<URI> hasDomainR2 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R2"));
-        final Set<URI> hasDomainR3 = inferenceEngine.getPropertiesWithDomain(vf.createURI("urn:R3"));
-        final Set<URI> hasRangeR1 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R1"));
-        final Set<URI> hasRangeR2 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R2"));
-        final Set<URI> hasRangeR3 = inferenceEngine.getPropertiesWithRange(vf.createURI("urn:R3"));
-        final Set<URI> empty = new HashSet<>();
-        final Set<URI> expectedForward = new HashSet<>();
-        expectedForward.add(vf.createURI("urn:p2"));
-        expectedForward.add(vf.createURI("urn:p1"));
-        expectedForward.add(vf.createURI("urn:q2"));
-        expectedForward.add(vf.createURI("urn:q1"));
-        final Set<URI> expectedInverse = new HashSet<>();
-        expectedInverse.add(vf.createURI("urn:i1"));
-        expectedInverse.add(vf.createURI("urn:i2"));
-        expectedInverse.add(vf.createURI("urn:j1"));
-        expectedInverse.add(vf.createURI("urn:j2"));
+        final Set<IRI> hasDomainD1 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:D1"));
+        final Set<IRI> hasDomainD2 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:D2"));
+        final Set<IRI> hasDomainD3 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:D3"));
+        final Set<IRI> hasRangeD1 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:D1"));
+        final Set<IRI> hasRangeD2 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:D2"));
+        final Set<IRI> hasRangeD3 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:D3"));
+        final Set<IRI> hasDomainR1 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:R1"));
+        final Set<IRI> hasDomainR2 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:R2"));
+        final Set<IRI> hasDomainR3 = inferenceEngine.getPropertiesWithDomain(VF.createIRI("urn:R3"));
+        final Set<IRI> hasRangeR1 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:R1"));
+        final Set<IRI> hasRangeR2 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:R2"));
+        final Set<IRI> hasRangeR3 = inferenceEngine.getPropertiesWithRange(VF.createIRI("urn:R3"));
+        final Set<IRI> empty = new HashSet<>();
+        final Set<IRI> expectedForward = new HashSet<>();
+        expectedForward.add(VF.createIRI("urn:p2"));
+        expectedForward.add(VF.createIRI("urn:p1"));
+        expectedForward.add(VF.createIRI("urn:q2"));
+        expectedForward.add(VF.createIRI("urn:q1"));
+        final Set<IRI> expectedInverse = new HashSet<>();
+        expectedInverse.add(VF.createIRI("urn:i1"));
+        expectedInverse.add(VF.createIRI("urn:i2"));
+        expectedInverse.add(VF.createIRI("urn:j1"));
+        expectedInverse.add(VF.createIRI("urn:j2"));
         Assert.assertEquals(empty, hasDomainD1);
         Assert.assertEquals(empty, hasRangeD1);
         Assert.assertEquals(empty, hasDomainR1);
@@ -248,24 +248,24 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
-        final Set<URI> properties = new HashSet<>();
-        properties.add(vf.createURI("urn:headOf"));
-        properties.add(vf.createURI("urn:temporaryHeadOf"));
-        final Map<Resource, Set<URI>> chairDerivations = new HashMap<>();
-        chairDerivations.put(vf.createURI("urn:Department"), properties);
-        chairDerivations.put(vf.createURI("urn:ScienceDepartment"), properties);
-        chairDerivations.put(vf.createURI("urn:HumanitiesDepartment"), properties);
-        final Map<Resource, Set<URI>> deanDerivations = new HashMap<>();
-        deanDerivations.put(vf.createURI("urn:College"), properties);
-        final Map<Resource, Set<URI>> combinedDerivations = new HashMap<>(chairDerivations);
-        combinedDerivations.put(vf.createURI("urn:College"), properties);
+        final Set<IRI> properties = new HashSet<>();
+        properties.add(VF.createIRI("urn:headOf"));
+        properties.add(VF.createIRI("urn:temporaryHeadOf"));
+        final Map<Resource, Set<IRI>> chairDerivations = new HashMap<>();
+        chairDerivations.put(VF.createIRI("urn:Department"), properties);
+        chairDerivations.put(VF.createIRI("urn:ScienceDepartment"), properties);
+        chairDerivations.put(VF.createIRI("urn:HumanitiesDepartment"), properties);
+        final Map<Resource, Set<IRI>> deanDerivations = new HashMap<>();
+        deanDerivations.put(VF.createIRI("urn:College"), properties);
+        final Map<Resource, Set<IRI>> combinedDerivations = new HashMap<>(chairDerivations);
+        combinedDerivations.put(VF.createIRI("urn:College"), properties);
         // Get someValuesFrom restrictions given the direct types
-        Assert.assertEquals(deanDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(vf.createURI("urn:Dean")));
-        Assert.assertEquals(chairDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(vf.createURI("urn:Chair")));
+        Assert.assertEquals(deanDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(VF.createIRI("urn:Dean")));
+        Assert.assertEquals(chairDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(VF.createIRI("urn:Chair")));
         // Finds the subtype's restrictions given the supertype
-        Assert.assertEquals(combinedDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(vf.createURI("urn:Person")));
+        Assert.assertEquals(combinedDerivations, inferenceEngine.getSomeValuesFromByRestrictionType(VF.createIRI("urn:Person")));
         // Finds nothing if given a subtype which is not a restriction
-        Assert.assertEquals(new HashMap<>(), inferenceEngine.getSomeValuesFromByRestrictionType(vf.createURI("urn:ScienceDepartmentChair")));
+        Assert.assertEquals(new HashMap<>(), inferenceEngine.getSomeValuesFromByRestrictionType(VF.createIRI("urn:ScienceDepartmentChair")));
     }
 
     @Test
@@ -283,20 +283,20 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
-        final Map<Resource, Set<URI>> restrictionsImplyingTerrier = new HashMap<>();
-        final Set<URI> properties = new HashSet<>();
-        properties.add(vf.createURI("urn:parent"));
-        properties.add(vf.createURI("urn:relative"));
-        restrictionsImplyingTerrier.put(vf.createURI("urn:Terrier"), properties);
-        restrictionsImplyingTerrier.put(vf.createURI("urn:Cairn_Terrier"), properties);
-        Assert.assertEquals(restrictionsImplyingTerrier, inferenceEngine.getAllValuesFromByValueType(vf.createURI("urn:Terrier")));
-        final Map<Resource, Set<URI>> restrictionsImplyingDog = new HashMap<>(restrictionsImplyingTerrier);
-        restrictionsImplyingDog.put(vf.createURI("urn:Dog"), properties);
-        restrictionsImplyingDog.put(vf.createURI("urn:Retriever"), properties);
-        Assert.assertEquals(restrictionsImplyingDog, inferenceEngine.getAllValuesFromByValueType(vf.createURI("urn:Dog")));
-        final Map<Resource, Set<URI>> restrictionsImplyingMammal = new HashMap<>(restrictionsImplyingDog);
-        restrictionsImplyingMammal.put(vf.createURI("urn:Person"), properties);
-        Assert.assertEquals(restrictionsImplyingMammal, inferenceEngine.getAllValuesFromByValueType(vf.createURI("urn:Mammal")));
+        final Map<Resource, Set<IRI>> restrictionsImplyingTerrier = new HashMap<>();
+        final Set<IRI> properties = new HashSet<>();
+        properties.add(VF.createIRI("urn:parent"));
+        properties.add(VF.createIRI("urn:relative"));
+        restrictionsImplyingTerrier.put(VF.createIRI("urn:Terrier"), properties);
+        restrictionsImplyingTerrier.put(VF.createIRI("urn:Cairn_Terrier"), properties);
+        Assert.assertEquals(restrictionsImplyingTerrier, inferenceEngine.getAllValuesFromByValueType(VF.createIRI("urn:Terrier")));
+        final Map<Resource, Set<IRI>> restrictionsImplyingDog = new HashMap<>(restrictionsImplyingTerrier);
+        restrictionsImplyingDog.put(VF.createIRI("urn:Dog"), properties);
+        restrictionsImplyingDog.put(VF.createIRI("urn:Retriever"), properties);
+        Assert.assertEquals(restrictionsImplyingDog, inferenceEngine.getAllValuesFromByValueType(VF.createIRI("urn:Dog")));
+        final Map<Resource, Set<IRI>> restrictionsImplyingMammal = new HashMap<>(restrictionsImplyingDog);
+        restrictionsImplyingMammal.put(VF.createIRI("urn:Person"), properties);
+        Assert.assertEquals(restrictionsImplyingMammal, inferenceEngine.getAllValuesFromByValueType(VF.createIRI("urn:Mammal")));
     }
 
     @Test
@@ -320,14 +320,14 @@
         final Map<Resource, Set<Value>> typeToValueImplications = new HashMap<>();
         final Set<Value> vertebrateTaxa = new HashSet<>();
         final Set<Value> tunicateTaxa = new HashSet<>();
-        vertebrateTaxa.add(vf.createURI("urn:Vertebrata"));
-        tunicateTaxa.add(vf.createURI("urn:Tunicata"));
+        vertebrateTaxa.add(VF.createIRI("urn:Vertebrata"));
+        tunicateTaxa.add(VF.createIRI("urn:Tunicata"));
         final Set<Value> mammalTaxa = new HashSet<>(vertebrateTaxa);
-        mammalTaxa.add(vf.createURI("urn:Mammalia"));
-        typeToValueImplications.put(vf.createURI("urn:Vertebrate"), vertebrateTaxa);
-        typeToValueImplications.put(vf.createURI("urn:Tunicate"), tunicateTaxa);
-        typeToValueImplications.put(vf.createURI("urn:Mammal"), mammalTaxa);
-        Assert.assertEquals(typeToValueImplications, inferenceEngine.getHasValueByProperty(vf.createURI("urn:taxon")));
+        mammalTaxa.add(VF.createIRI("urn:Mammalia"));
+        typeToValueImplications.put(VF.createIRI("urn:Vertebrate"), vertebrateTaxa);
+        typeToValueImplications.put(VF.createIRI("urn:Tunicate"), tunicateTaxa);
+        typeToValueImplications.put(VF.createIRI("urn:Mammal"), mammalTaxa);
+        Assert.assertEquals(typeToValueImplications, inferenceEngine.getHasValueByProperty(VF.createIRI("urn:taxon")));
     }
 
     @Test
@@ -350,35 +350,35 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, insert).execute();
         inferenceEngine.refreshGraph();
-        final URI legs = vf.createURI("urn:walksUsingLegs");
-        final URI taxon = vf.createURI("urn:taxon");
+        final IRI legs = VF.createIRI("urn:walksUsingLegs");
+        final IRI taxon = VF.createIRI("urn:taxon");
         // Verify direct restrictions:
-        final Map<URI, Set<Value>> valuesImplyingBiped = new HashMap<>();
+        final Map<IRI, Set<Value>> valuesImplyingBiped = new HashMap<>();
         valuesImplyingBiped.put(legs, new HashSet<>());
-        valuesImplyingBiped.get(legs).add(vf.createLiteral("2"));
-        Assert.assertEquals(valuesImplyingBiped, inferenceEngine.getHasValueByType(vf.createURI("urn:Biped")));
-        final Map<URI, Set<Value>> valuesImplyingMammal = new HashMap<>();
+        valuesImplyingBiped.get(legs).add(VF.createLiteral("2"));
+        Assert.assertEquals(valuesImplyingBiped, inferenceEngine.getHasValueByType(VF.createIRI("urn:Biped")));
+        final Map<IRI, Set<Value>> valuesImplyingMammal = new HashMap<>();
         valuesImplyingMammal.put(taxon, new HashSet<>());
-        valuesImplyingMammal.get(taxon).add(vf.createURI("urn:Mammalia"));
-        Assert.assertEquals(valuesImplyingMammal, inferenceEngine.getHasValueByType(vf.createURI("urn:Mammal")));
-        final Map<URI, Set<Value>> valuesImplyingTunicate = new HashMap<>();
+        valuesImplyingMammal.get(taxon).add(VF.createIRI("urn:Mammalia"));
+        Assert.assertEquals(valuesImplyingMammal, inferenceEngine.getHasValueByType(VF.createIRI("urn:Mammal")));
+        final Map<IRI, Set<Value>> valuesImplyingTunicate = new HashMap<>();
         valuesImplyingTunicate.put(taxon, new HashSet<>());
-        valuesImplyingTunicate.get(taxon).add(vf.createURI("urn:Tunicata"));
-        Assert.assertEquals(valuesImplyingTunicate, inferenceEngine.getHasValueByType(vf.createURI("urn:Tunicate")));
-        final Map<URI, Set<Value>> valuesImplyingPlant = new HashMap<>();
+        valuesImplyingTunicate.get(taxon).add(VF.createIRI("urn:Tunicata"));
+        Assert.assertEquals(valuesImplyingTunicate, inferenceEngine.getHasValueByType(VF.createIRI("urn:Tunicate")));
+        final Map<IRI, Set<Value>> valuesImplyingPlant = new HashMap<>();
         valuesImplyingPlant.put(taxon, new HashSet<>());
-        valuesImplyingPlant.get(taxon).add(vf.createURI("urn:Plantae"));
-        Assert.assertEquals(valuesImplyingPlant, inferenceEngine.getHasValueByType(vf.createURI("urn:Plant")));
+        valuesImplyingPlant.get(taxon).add(VF.createIRI("urn:Plantae"));
+        Assert.assertEquals(valuesImplyingPlant, inferenceEngine.getHasValueByType(VF.createIRI("urn:Plant")));
         // Verify indirect restrictions given a supertype, including multiple properties where relevant:
-        final Map<URI, Set<Value>> valuesImplyingVertebrate = new HashMap<>();
+        final Map<IRI, Set<Value>> valuesImplyingVertebrate = new HashMap<>();
         valuesImplyingVertebrate.put(taxon, new HashSet<>(valuesImplyingMammal.get(taxon)));
-        valuesImplyingVertebrate.get(taxon).add(vf.createURI("urn:Vertebrata"));
-        Assert.assertEquals(valuesImplyingVertebrate, inferenceEngine.getHasValueByType(vf.createURI("urn:Vertebrate")));
-        final Map<URI, Set<Value>> valuesImplyingAnimal = new HashMap<>();
+        valuesImplyingVertebrate.get(taxon).add(VF.createIRI("urn:Vertebrata"));
+        Assert.assertEquals(valuesImplyingVertebrate, inferenceEngine.getHasValueByType(VF.createIRI("urn:Vertebrate")));
+        final Map<IRI, Set<Value>> valuesImplyingAnimal = new HashMap<>();
         valuesImplyingAnimal.put(legs, valuesImplyingBiped.get(legs));
         valuesImplyingAnimal.put(taxon, new HashSet<>(valuesImplyingVertebrate.get(taxon)));
         valuesImplyingAnimal.get(taxon).addAll(valuesImplyingTunicate.get(taxon));
-        Assert.assertEquals(valuesImplyingAnimal, inferenceEngine.getHasValueByType(vf.createURI("urn:Animal")));
+        Assert.assertEquals(valuesImplyingAnimal, inferenceEngine.getHasValueByType(VF.createIRI("urn:Animal")));
     }
 
     @Test
@@ -396,15 +396,15 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         inferenceEngine.refreshGraph();
-        final Set<URI> subClassesA = inferenceEngine.getSubClasses(vf.createURI("urn:A"));
-        final Set<URI> subClassesB = inferenceEngine.getSubClasses(vf.createURI("urn:B"));
-        final Set<URI> expectedA = new HashSet<>();
-        final Set<URI> expectedB = new HashSet<>();
-        expectedB.add(vf.createURI("urn:Y"));
-        expectedB.add(vf.createURI("urn:SubY"));
-        expectedB.add(vf.createURI("urn:Z"));
+        final Set<IRI> subClassesA = inferenceEngine.getSubClasses(VF.createIRI("urn:A"));
+        final Set<IRI> subClassesB = inferenceEngine.getSubClasses(VF.createIRI("urn:B"));
+        final Set<IRI> expectedA = new HashSet<>();
+        final Set<IRI> expectedB = new HashSet<>();
+        expectedB.add(VF.createIRI("urn:Y"));
+        expectedB.add(VF.createIRI("urn:SubY"));
+        expectedB.add(VF.createIRI("urn:Z"));
         expectedA.addAll(expectedB);
-        expectedA.add(vf.createURI("urn:X"));
+        expectedA.add(VF.createIRI("urn:X"));
         Assert.assertEquals(expectedA, subClassesA);
         Assert.assertEquals(expectedB, subClassesB);
     }
@@ -433,14 +433,14 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         inferenceEngine.refreshGraph();
 
-        final URI mother = vf.createURI("urn:Mother");
-        final URI father = vf.createURI("urn:Father");
-        final URI woman = vf.createURI("urn:Woman");
-        final URI parent = vf.createURI("urn:Parent");
-        final URI man = vf.createURI("urn:Man");
-        final URI mom = vf.createURI("urn:Mom");
-        final URI immediateFamilyMember = vf.createURI("urn:ImmediateFamilyMember");
-        final URI relative = vf.createURI("urn:Relative");
+        final IRI mother = VF.createIRI("urn:Mother");
+        final IRI father = VF.createIRI("urn:Father");
+        final IRI woman = VF.createIRI("urn:Woman");
+        final IRI parent = VF.createIRI("urn:Parent");
+        final IRI man = VF.createIRI("urn:Man");
+        final IRI mom = VF.createIRI("urn:Mom");
+        final IRI immediateFamilyMember = VF.createIRI("urn:ImmediateFamilyMember");
+        final IRI relative = VF.createIRI("urn:Relative");
 
         final List<Set<Resource>> intersectionsImplyingMother = Arrays.asList(Sets.newHashSet(woman, parent));
         Assert.assertEquals(intersectionsImplyingMother, inferenceEngine.getIntersectionsImplying(mother));
@@ -450,7 +450,7 @@
         // Check that Mother is a subclassOf Parent and Woman and
         // ImmediateFamilyMember and Relative. Also, Mother is a subclassOf
         // Mother and Mom through inferring equivalentClass.
-        final Set<URI> motherSuperClassUris = inferenceEngine.getSuperClasses(mother);
+        final Set<IRI> motherSuperClassUris = inferenceEngine.getSuperClasses(mother);
         Assert.assertNotNull(motherSuperClassUris);
         Assert.assertEquals(6, motherSuperClassUris.size());
         Assert.assertTrue(motherSuperClassUris.contains(parent));
@@ -460,7 +460,7 @@
         Assert.assertTrue(motherSuperClassUris.contains(mother));
         Assert.assertTrue(motherSuperClassUris.contains(mom));
         // Check that Father is a subclassOf Parent and Man
-        final Set<URI> fatherSuperClassUris = inferenceEngine.getSuperClasses(father);
+        final Set<IRI> fatherSuperClassUris = inferenceEngine.getSuperClasses(father);
         Assert.assertNotNull(fatherSuperClassUris);
         Assert.assertEquals(2, fatherSuperClassUris.size());
         Assert.assertTrue(fatherSuperClassUris.contains(parent));
@@ -470,7 +470,7 @@
         // ImmediateFamilyMember and Relative. The last 2 should be inferred
         // from having the same intersection as Mother. Also, Mom is a
         // subclassOf Mother and Mom through inferring equivalentClass.
-        final Set<URI> momSuperClassUris = inferenceEngine.getSuperClasses(mom);
+        final Set<IRI> momSuperClassUris = inferenceEngine.getSuperClasses(mom);
         Assert.assertNotNull(momSuperClassUris);
         Assert.assertEquals(6, momSuperClassUris.size());
         Assert.assertTrue(momSuperClassUris.contains(parent));
@@ -525,29 +525,29 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         inferenceEngine.refreshGraph();
 
-        final URI suits = vf.createURI("urn:Suits");
-        final URI ranks = vf.createURI("urn:Ranks");
+        final IRI suits = VF.createIRI("urn:Suits");
+        final IRI ranks = VF.createIRI("urn:Ranks");
 
-        final URI clubs = vf.createURI("urn:Clubs");
-        final URI diamonds = vf.createURI("urn:Diamonds");
-        final URI hearts = vf.createURI("urn:Hearts");
-        final URI spades = vf.createURI("urn:Spades");
+        final IRI clubs = VF.createIRI("urn:Clubs");
+        final IRI diamonds = VF.createIRI("urn:Diamonds");
+        final IRI hearts = VF.createIRI("urn:Hearts");
+        final IRI spades = VF.createIRI("urn:Spades");
 
-        final URI ace = vf.createURI("urn:Ace");
-        final URI two = vf.createURI("urn:2");
-        final URI three = vf.createURI("urn:3");
-        final URI four = vf.createURI("urn:4");
-        final URI five = vf.createURI("urn:5");
-        final URI six = vf.createURI("urn:6");
-        final URI seven = vf.createURI("urn:7");
-        final URI eight = vf.createURI("urn:8");
-        final URI nine = vf.createURI("urn:9");
-        final URI ten = vf.createURI("urn:10");
-        final URI jack = vf.createURI("urn:Jack");
-        final URI queen = vf.createURI("urn:Queen");
-        final URI king = vf.createURI("urn:King");
+        final IRI ace = VF.createIRI("urn:Ace");
+        final IRI two = VF.createIRI("urn:2");
+        final IRI three = VF.createIRI("urn:3");
+        final IRI four = VF.createIRI("urn:4");
+        final IRI five = VF.createIRI("urn:5");
+        final IRI six = VF.createIRI("urn:6");
+        final IRI seven = VF.createIRI("urn:7");
+        final IRI eight = VF.createIRI("urn:8");
+        final IRI nine = VF.createIRI("urn:9");
+        final IRI ten = VF.createIRI("urn:10");
+        final IRI jack = VF.createIRI("urn:Jack");
+        final IRI queen = VF.createIRI("urn:Queen");
+        final IRI king = VF.createIRI("urn:King");
 
-        final URI joker = vf.createURI("urn:Joker");
+        final IRI joker = VF.createIRI("urn:Joker");
 
         final boolean isJokerEnumeratedType = inferenceEngine.isEnumeratedType(joker);
         Assert.assertFalse(isJokerEnumeratedType);
@@ -572,12 +572,12 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         inferenceEngine.refreshGraph();
         final Set<Resource> expectedTypes = new HashSet<>();
-        expectedTypes.add(vf.createURI("urn:Narcissist"));
-        Assert.assertEquals(expectedTypes, inferenceEngine.getHasSelfImplyingProperty(vf.createURI("urn:love")));
+        expectedTypes.add(VF.createIRI("urn:Narcissist"));
+        Assert.assertEquals(expectedTypes, inferenceEngine.getHasSelfImplyingProperty(VF.createIRI("urn:love")));
 
-        final Set<URI> expectedProperties = new HashSet<>();
-        expectedProperties.add(vf.createURI("urn:love"));
-        Assert.assertEquals(expectedProperties, inferenceEngine.getHasSelfImplyingType(vf.createURI("urn:Narcissist")));
+        final Set<IRI> expectedProperties = new HashSet<>();
+        expectedProperties.add(VF.createIRI("urn:love"));
+        Assert.assertEquals(expectedProperties, inferenceEngine.getHasSelfImplyingType(VF.createIRI("urn:Narcissist")));
     }
 
     @Test
@@ -592,12 +592,12 @@
                 + "}}";
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         inferenceEngine.refreshGraph();
-        final URI comment = vf.createURI("urn:comment"); // none of the three supported types
-        final URI older = vf.createURI("urn:olderThan"); // transitive only
-        final URI notYounger = vf.createURI("urn:notYoungerThan"); // transitive and reflexive
-        final URI related = vf.createURI("urn:related"); // transitive and symmetric
-        final URI knows = vf.createURI("urn:knows"); // reflexive and symmetric
-        final URI sameAge = vf.createURI("urn:sameAgeAs"); // all three
+        final IRI comment = VF.createIRI("urn:comment"); // none of the three supported types
+        final IRI older = VF.createIRI("urn:olderThan"); // transitive only
+        final IRI notYounger = VF.createIRI("urn:notYoungerThan"); // transitive and reflexive
+        final IRI related = VF.createIRI("urn:related"); // transitive and symmetric
+        final IRI knows = VF.createIRI("urn:knows"); // reflexive and symmetric
+        final IRI sameAge = VF.createIRI("urn:sameAgeAs"); // all three
         // symmetry
         Assert.assertFalse(inferenceEngine.isSymmetricProperty(comment));
         Assert.assertFalse(inferenceEngine.isSymmetricProperty(older));
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java
index 375db4a..b53f5ee 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/InferenceIT.java
@@ -32,23 +32,23 @@
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.FOAF;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.impl.ListBindingSet;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.FOAF;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.impl.ListBindingSet;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
 
 import junit.framework.TestCase;
 
@@ -57,7 +57,7 @@
 
     private Connector connector;
     private AccumuloRyaDAO dao;
-    private final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private AccumuloRdfConfiguration conf;
     private RdfCloudTripleStore store;
     private InferenceEngine inferenceEngine;
@@ -142,9 +142,9 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler);
         final Set<Value> expected = new HashSet<>();
-        expected.add(vf.createURI("urn:Alice"));
-        expected.add(vf.createURI("urn:Bob"));
-        expected.add(vf.createURI("urn:Eve"));
+        expected.add(VF.createIRI("urn:Alice"));
+        expected.add(VF.createIRI("urn:Bob"));
+        expected.add(VF.createIRI("urn:Eve"));
         final Set<Value> returned = new HashSet<>();
         for (final BindingSet bs : solutions) {
             returned.add(bs.getBinding("x").getValue());
@@ -185,10 +185,10 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler);
         final Set<Value> expected = new HashSet<>();
-        expected.add(vf.createURI("urn:Professor1"));
-        expected.add(vf.createURI("urn:Professor2"));
-        expected.add(vf.createURI("urn:Professor3"));
-        expected.add(vf.createURI("urn:Professor4"));
+        expected.add(VF.createIRI("urn:Professor1"));
+        expected.add(VF.createIRI("urn:Professor2"));
+        expected.add(VF.createIRI("urn:Professor3"));
+        expected.add(VF.createIRI("urn:Professor4"));
         final Set<Value> returned = new HashSet<>();
         for (final BindingSet bs : solutions) {
             returned.add(bs.getBinding("x").getValue());
@@ -244,9 +244,9 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler);
         Map<Value, Integer> expected = new HashMap<>();
-        expected.put(vf.createURI("urn:Alice"), 2); // from both courses
-        expected.put(vf.createURI("urn:Bob"), 1); // from course
-        expected.put(vf.createURI("urn:Carol"), 2); // from course and explicit type
+        expected.put(VF.createIRI("urn:Alice"), 2); // from both courses
+        expected.put(VF.createIRI("urn:Bob"), 1); // from course
+        expected.put(VF.createIRI("urn:Carol"), 2); // from course and explicit type
         Map<Value, Integer> returned = new HashMap<>();
         for (BindingSet bs : solutions) {
             Value v = bs.getBinding("individual").getValue();
@@ -281,15 +281,15 @@
         for (final BindingSet solution : solutions) {
             answers.add(solution.getBinding("x").getValue());
         }
-        Assert.assertTrue(answers.contains(vf.createURI("urn:Terry")));
-        Assert.assertTrue(answers.contains(vf.createURI("urn:Rommy")));
+        Assert.assertTrue(answers.contains(VF.createIRI("urn:Terry")));
+        Assert.assertTrue(answers.contains(VF.createIRI("urn:Rommy")));
         // If allValuesFrom inference were applied recursively, this triple wouldn't be needed:
         conn.prepareUpdate(QueryLanguage.SPARQL, "INSERT DATA { GRAPH <http://updated/test> {\n"
                 + "  <urn:Terry> a <urn:Cairn_Terrier> .\n"
                 + "}}").execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, "SELECT ?x { ?x a <urn:FictionalDog> }").evaluate(resultHandler);
         Assert.assertEquals(1, solutions.size());
-        Assert.assertEquals(vf.createURI("urn:Toto"), solutions.get(0).getBinding("x").getValue());
+        Assert.assertEquals(VF.createIRI("urn:Toto"), solutions.get(0).getBinding("x").getValue());
     }
 
     @Test
@@ -318,11 +318,11 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler);
         final Set<Value> expected = new HashSet<>();
-        expected.add(vf.createURI("urn:Alice"));
-        expected.add(vf.createURI("urn:Bob"));
-        expected.add(vf.createURI("urn:Carol"));
-        expected.add(vf.createURI("urn:Dan"));
-        expected.add(vf.createURI("urn:Lucy"));
+        expected.add(VF.createIRI("urn:Alice"));
+        expected.add(VF.createIRI("urn:Bob"));
+        expected.add(VF.createIRI("urn:Carol"));
+        expected.add(VF.createIRI("urn:Dan"));
+        expected.add(VF.createIRI("urn:Lucy"));
         final Set<Value> returned = new HashSet<>();
         for (final BindingSet bs : solutions) {
             returned.add(bs.getBinding("x").getValue());
@@ -358,12 +358,12 @@
         final List<String> varNames = new LinkedList<>();
         varNames.add("individual");
         varNames.add("taxon");
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice"), vf.createURI("urn:Hominidae")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice"), vf.createURI("urn:Mammalia")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Bigfoot"), vf.createURI("urn:Mammalia")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Carol"), vf.createURI("urn:Hominidae")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Hank"), vf.createURI("urn:Carnivora")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Hank"), vf.createURI("urn:Mammalia")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice"), VF.createIRI("urn:Hominidae")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice"), VF.createIRI("urn:Mammalia")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Bigfoot"), VF.createIRI("urn:Mammalia")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Carol"), VF.createIRI("urn:Hominidae")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Hank"), VF.createIRI("urn:Carnivora")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Hank"), VF.createIRI("urn:Mammalia")));
         Assert.assertEquals(expected, new HashSet<>(solutions));
     }
 
@@ -393,9 +393,9 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         conn.prepareTupleQuery(QueryLanguage.SPARQL, query).evaluate(resultHandler);
         final Set<Value> expected = new HashSet<>();
-        expected.add(vf.createURI("urn:Bob"));
-        expected.add(vf.createURI("urn:Carol"));
-        expected.add(vf.createURI("urn:Eve"));
+        expected.add(VF.createIRI("urn:Bob"));
+        expected.add(VF.createIRI("urn:Carol"));
+        expected.add(VF.createIRI("urn:Eve"));
         final Set<Value> returned = new HashSet<>();
         for (final BindingSet bs : solutions) {
             returned.add(bs.getBinding("x").getValue());
@@ -433,36 +433,36 @@
         final String motherQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Mother> } } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, motherQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedMothers = new HashSet<>();
-        expectedMothers.add(new ListBindingSet(varNames, vf.createURI("urn:Susan")));
+        expectedMothers.add(new ListBindingSet(varNames, VF.createIRI("urn:Susan")));
         Assert.assertEquals(expectedMothers, new HashSet<>(solutions));
 
         // Find all <urn:Father> types (expect 1 result)
         final String fatherQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Father> } } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, fatherQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedFathers = new HashSet<>();
-        expectedFathers.add(new ListBindingSet(varNames, vf.createURI("urn:Bob")));
+        expectedFathers.add(new ListBindingSet(varNames, VF.createIRI("urn:Bob")));
         Assert.assertEquals(expectedFathers, new HashSet<>(solutions));
 
         // Find all <urn:Parent> types (expect 2 results)
         final String parentQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Parent> } } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, parentQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedParents = new HashSet<>();
-        expectedParents.add(new ListBindingSet(varNames, vf.createURI("urn:Bob")));
-        expectedParents.add(new ListBindingSet(varNames, vf.createURI("urn:Susan")));
+        expectedParents.add(new ListBindingSet(varNames, VF.createIRI("urn:Bob")));
+        expectedParents.add(new ListBindingSet(varNames, VF.createIRI("urn:Susan")));
         Assert.assertEquals(expectedParents, new HashSet<>(solutions));
 
         // Find all <urn:Woman> types (expect 1 result)
         final String womanQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Woman> } } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, womanQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedWomen = new HashSet<>();
-        expectedWomen.add(new ListBindingSet(varNames, vf.createURI("urn:Susan")));
+        expectedWomen.add(new ListBindingSet(varNames, VF.createIRI("urn:Susan")));
         Assert.assertEquals(expectedWomen, new HashSet<>(solutions));
 
         // Find all <urn:Man> types (expect 1 result)
         final String manQuery = "SELECT ?individual { GRAPH <http://updated/test> { ?individual rdf:type <urn:Man> } } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, manQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedMen = new HashSet<>();
-        expectedMen.add(new ListBindingSet(varNames, vf.createURI("urn:Bob")));
+        expectedMen.add(new ListBindingSet(varNames, VF.createIRI("urn:Bob")));
         Assert.assertEquals(expectedMen, new HashSet<>(solutions));
     }
 
@@ -540,11 +540,11 @@
         final String cardSuitQuery = "SELECT ?card { GRAPH <http://updated/test> { ?card a <urn:Card> . ?suit a <urn:Suits> . ?card <urn:HasSuit> ?suit} } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, cardSuitQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedCardSuits = new HashSet<>();
-        expectedCardSuits.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard1")));
-        expectedCardSuits.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard2")));
-        expectedCardSuits.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard3")));
-        expectedCardSuits.add(new ListBindingSet(varNames, vf.createURI("urn:TurnCard")));
-        expectedCardSuits.add(new ListBindingSet(varNames, vf.createURI("urn:RiverCard")));
+        expectedCardSuits.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard1")));
+        expectedCardSuits.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard2")));
+        expectedCardSuits.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard3")));
+        expectedCardSuits.add(new ListBindingSet(varNames, VF.createIRI("urn:TurnCard")));
+        expectedCardSuits.add(new ListBindingSet(varNames, VF.createIRI("urn:RiverCard")));
         Assert.assertEquals(expectedCardSuits.size(), solutions.size());
         Assert.assertEquals(expectedCardSuits, new HashSet<>(solutions));
 
@@ -552,11 +552,11 @@
         final String cardRankQuery = "SELECT ?card { GRAPH <http://updated/test> { ?card a <urn:Card> . ?rank a <urn:Ranks> . ?card <urn:HasRank> ?rank} } \n";
         conn.prepareTupleQuery(QueryLanguage.SPARQL, cardRankQuery).evaluate(resultHandler);
         final Set<BindingSet> expectedCardRanks = new HashSet<>();
-        expectedCardRanks.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard1")));
-        expectedCardRanks.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard2")));
-        expectedCardRanks.add(new ListBindingSet(varNames, vf.createURI("urn:FlopCard3")));
-        expectedCardRanks.add(new ListBindingSet(varNames, vf.createURI("urn:TurnCard")));
-        expectedCardRanks.add(new ListBindingSet(varNames, vf.createURI("urn:RiverCard")));
+        expectedCardRanks.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard1")));
+        expectedCardRanks.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard2")));
+        expectedCardRanks.add(new ListBindingSet(varNames, VF.createIRI("urn:FlopCard3")));
+        expectedCardRanks.add(new ListBindingSet(varNames, VF.createIRI("urn:TurnCard")));
+        expectedCardRanks.add(new ListBindingSet(varNames, VF.createIRI("urn:RiverCard")));
         Assert.assertEquals(expectedCardRanks.size(), solutions.size());
         Assert.assertEquals(expectedCardRanks, new HashSet<>(solutions));
     }
@@ -580,8 +580,8 @@
         final List<String> varNames = new LinkedList<>();
         varNames.add("who");
         varNames.add("self");
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice"), vf.createURI("urn:Alice")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Narcissus"), vf.createURI("urn:Narcissus")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice"), VF.createIRI("urn:Alice")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Narcissus"), VF.createIRI("urn:Narcissus")));
         Assert.assertEquals(expected, new HashSet<>(solutions));
 
         query = "SELECT ?self { GRAPH <http://updated/test> { <urn:Alice> <urn:love> ?self } } \n";
@@ -589,7 +589,7 @@
         expected.clear();
         varNames.clear();
         varNames.add("self");
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice")));
         Assert.assertEquals(expected, new HashSet<>(solutions));
 
         query = "SELECT ?who { GRAPH <http://updated/test> { ?who <urn:love> <urn:Alice> } } \n";
@@ -597,7 +597,7 @@
         expected.clear();
         varNames.clear();
         varNames.add("who");
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice")));
         Assert.assertEquals(expected, new HashSet<>(solutions));
 
         query = "SELECT ?who { GRAPH <http://updated/test> { ?who a <urn:Narcissist> } } \n";
@@ -605,8 +605,8 @@
         expected.clear();
         varNames.clear();
         varNames.add("who");
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Narcissus")));
-        expected.add(new ListBindingSet(varNames, vf.createURI("urn:Alice")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Narcissus")));
+        expected.add(new ListBindingSet(varNames, VF.createIRI("urn:Alice")));
         Assert.assertEquals(expected, new HashSet<>(solutions));
     }
 
@@ -622,10 +622,10 @@
         conn.prepareUpdate(QueryLanguage.SPARQL, ontology).execute();
         conn.prepareUpdate(QueryLanguage.SPARQL, instances).execute();
         inferenceEngine.refreshGraph();
-        final URI alice = vf.createURI("urn:Alice");
-        final URI bob = vf.createURI("urn:Bob");
-        final URI carol = vf.createURI("urn:Carol");
-        final URI eve = vf.createURI("urn:Eve");
+        final IRI alice = VF.createIRI("urn:Alice");
+        final IRI bob = VF.createIRI("urn:Bob");
+        final IRI carol = VF.createIRI("urn:Carol");
+        final IRI eve = VF.createIRI("urn:Eve");
         final List<String> varNames = new LinkedList<>();
         varNames.add("x");
         final Set<BindingSet> aliceAndBob = new HashSet<>();
@@ -665,8 +665,8 @@
 
         // Query where subject and object are unrestricted variables: match
         // every known node (dangerous, but correct)
-        final URI hasFamily = vf.createURI("urn:hasFamilyMember");
-        final URI rp = vf.createURI(OWL.NAMESPACE, "ReflexiveProperty");
+        final IRI hasFamily = VF.createIRI("urn:hasFamilyMember");
+        final IRI rp = VF.createIRI(OWL.NAMESPACE, "ReflexiveProperty");
         final Set<BindingSet> everything = new HashSet<>();
         everything.add(new ListBindingSet(varNames, alice, alice));
         everything.add(new ListBindingSet(varNames, bob, bob));
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java
index 58551a5..93585e5 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/IntersectionOfVisitorTest.java
@@ -31,19 +31,19 @@
 import java.util.Set;
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
@@ -52,22 +52,22 @@
  */
 public class IntersectionOfVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    private static final URI MOTHER = VF.createURI("urn:Mother");
-    private static final URI FATHER = VF.createURI("urn:Father");
+    private static final IRI MOTHER = VF.createIRI("urn:Mother");
+    private static final IRI FATHER = VF.createIRI("urn:Father");
 
     // Definition #1: :Mother owl:intersectionOf(:Animal, :Female, :Parent)
-    private static final URI ANIMAL = VF.createURI("urn:Animal");
-    private static final URI FEMALE = VF.createURI("urn:Female");
-    private static final URI PARENT = VF.createURI("urn:Parent");
+    private static final IRI ANIMAL = VF.createIRI("urn:Animal");
+    private static final IRI FEMALE = VF.createIRI("urn:Female");
+    private static final IRI PARENT = VF.createIRI("urn:Parent");
 
     // Definition #2: :Mother owl:intersectionOf(:Female, :Leader, :Nun)
-    private static final URI NUN = VF.createURI("urn:Nun");
-    private static final URI LEADER = VF.createURI("urn:Leader");
+    private static final IRI NUN = VF.createIRI("urn:Nun");
+    private static final IRI LEADER = VF.createIRI("urn:Leader");
 
     // Definition #3: :Father owl:intersectionOf(:Man, :Parent)
-    private static final URI MAN = VF.createURI("urn:Man");
+    private static final IRI MAN = VF.createIRI("urn:Man");
 
     @Test
     public void testIntersectionOf() throws Exception {
@@ -226,7 +226,7 @@
         assertEquals(expectedFatherSp, actualFatherSp);
     }
 
-    private static void assertStatementPattern(final StatementPattern statementPattern, final URI uri) {
+    private static void assertStatementPattern(final StatementPattern statementPattern, final IRI uri) {
         assertNotNull(statementPattern.getPredicateVar());
         assertEquals(RDF.TYPE, statementPattern.getPredicateVar().getValue());
         assertNotNull(statementPattern.getObjectVar());
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/OneOfVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/OneOfVisitorTest.java
index 9c6cc86..c1c6356 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/OneOfVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/OneOfVisitorTest.java
@@ -28,22 +28,22 @@
 import java.util.Set;
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Value;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.Binding;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.algebra.BindingSetAssignment;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.evaluation.QueryBindingSet;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.Value;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.Binding;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.algebra.BindingSetAssignment;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.evaluation.QueryBindingSet;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -53,31 +53,31 @@
  */
 public class OneOfVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    private static final URI SUITS = VF.createURI("urn:Suits");
-    private static final URI RANKS = VF.createURI("urn:Ranks");
+    private static final IRI SUITS = VF.createIRI("urn:Suits");
+    private static final IRI RANKS = VF.createIRI("urn:Ranks");
 
     // Definition #1: :Suits owl:oneOf(:Clubs, :Diamonds, :Hearts, :Spades)
-    private static final URI CLUBS = VF.createURI("urn:Clubs");
-    private static final URI DIAMONDS = VF.createURI("urn:Diamonds");
-    private static final URI HEARTS = VF.createURI("urn:Hearts");
-    private static final URI SPADES = VF.createURI("urn:Spades");
+    private static final IRI CLUBS = VF.createIRI("urn:Clubs");
+    private static final IRI DIAMONDS = VF.createIRI("urn:Diamonds");
+    private static final IRI HEARTS = VF.createIRI("urn:Hearts");
+    private static final IRI SPADES = VF.createIRI("urn:Spades");
 
     // Definition #2: :Ranks owl:oneOf(:Ace, :2, :3, :4, :5, :6, :7, :8, :9, :10, :Jack, :Queen, :King)
-    private static final URI ACE = VF.createURI("urn:Ace");
-    private static final URI TWO = VF.createURI("urn:2");
-    private static final URI THREE = VF.createURI("urn:3");
-    private static final URI FOUR = VF.createURI("urn:4");
-    private static final URI FIVE = VF.createURI("urn:5");
-    private static final URI SIX = VF.createURI("urn:6");
-    private static final URI SEVEN = VF.createURI("urn:7");
-    private static final URI EIGHT = VF.createURI("urn:8");
-    private static final URI NINE = VF.createURI("urn:9");
-    private static final URI TEN = VF.createURI("urn:10");
-    private static final URI JACK = VF.createURI("urn:Jack");
-    private static final URI QUEEN = VF.createURI("urn:Queen");
-    private static final URI KING = VF.createURI("urn:King");
+    private static final IRI ACE = VF.createIRI("urn:Ace");
+    private static final IRI TWO = VF.createIRI("urn:2");
+    private static final IRI THREE = VF.createIRI("urn:3");
+    private static final IRI FOUR = VF.createIRI("urn:4");
+    private static final IRI FIVE = VF.createIRI("urn:5");
+    private static final IRI SIX = VF.createIRI("urn:6");
+    private static final IRI SEVEN = VF.createIRI("urn:7");
+    private static final IRI EIGHT = VF.createIRI("urn:8");
+    private static final IRI NINE = VF.createIRI("urn:9");
+    private static final IRI TEN = VF.createIRI("urn:10");
+    private static final IRI JACK = VF.createIRI("urn:Jack");
+    private static final IRI QUEEN = VF.createIRI("urn:Queen");
+    private static final IRI KING = VF.createIRI("urn:King");
 
     private static final Set<Resource> CARD_SUIT_ENUMERATION =
         Sets.newLinkedHashSet(
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/PropertyChainTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/PropertyChainTest.java
index cf37c43..a3fd6ce 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/PropertyChainTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/PropertyChainTest.java
@@ -1,4 +1,3 @@
-package org.apache.rya.rdftriplestore.inference;
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -17,6 +16,8 @@
  * specific language governing permissions and limitations
  * under the License.
  */
+package org.apache.rya.rdftriplestore.inference;
+
 import java.util.List;
 
 import org.apache.accumulo.core.Constants;
@@ -25,41 +26,22 @@
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.TablePermission;
-import org.junit.Assert;
-import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.Update;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-
-import junit.framework.TestCase;
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.accumulo.AccumuloRyaDAO;
 import org.apache.rya.api.RdfCloudTripleStoreConstants;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.rya.rdftriplestore.inference.InferenceEngine;
-import org.apache.rya.rdftriplestore.inference.InverseURI;
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you 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.
- */
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.junit.Assert;
+import org.junit.Test;
+
+import junit.framework.TestCase;
+
 public class PropertyChainTest extends TestCase {
     private String user = "user";
     private String pwd = "pwd";
@@ -68,7 +50,7 @@
     private Authorizations auths = Constants.NO_AUTHS;
     private Connector connector;
     private AccumuloRyaDAO ryaDAO;
-    private ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private String namespace = "urn:test#";
     private AccumuloRdfConfiguration conf;
 
@@ -131,10 +113,10 @@
     	Update update = conn.prepareUpdate(QueryLanguage.SPARQL, query);
     	update.execute();
         inferenceEngine.refreshGraph();
-       List<URI> chain = inferenceEngine.getPropertyChain(vf.createURI("urn:greatMother"));
+       List<IRI> chain = inferenceEngine.getPropertyChain(VF.createIRI("urn:greatMother"));
        Assert.assertEquals(chain.size(), 2);
-       Assert.assertEquals(chain.get(0), new InverseURI(vf.createURI("urn:isChildOf")));
-       Assert.assertEquals(chain.get(1), vf.createURI("urn:MotherOf"));
+       Assert.assertEquals(chain.get(0), new InverseURI(VF.createIRI("urn:isChildOf")));
+       Assert.assertEquals(chain.get(1), VF.createIRI("urn:MotherOf"));
  
     }
 }
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitorTest.java
index f151bd3..bebf143 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/ReflexivePropertyVisitorTest.java
@@ -23,29 +23,29 @@
 
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
+import org.eclipse.rdf4j.query.algebra.ZeroLengthPath;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
-import org.openrdf.query.algebra.ZeroLengthPath;
 
 /**
  * Tests the methods of {@link ReflexivePropertyVisitor}.
  */
 public class ReflexivePropertyVisitorTest {
     private final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory VF = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
-    private static final URI ALICE = VF.createURI("urn:Alice");
-    private static final URI HAS_FAMILY = VF.createURI("urn:hasFamilyMember");
+    private static final IRI ALICE = VF.createIRI("urn:Alice");
+    private static final IRI HAS_FAMILY = VF.createIRI("urn:hasFamilyMember");
 
     @Test
     public void testReflexiveProperty() throws Exception {
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SameAsTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SameAsTest.java
index 43184c4..16d2539 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SameAsTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SameAsTest.java
@@ -1,5 +1,3 @@
-package org.apache.rya.rdftriplestore.inference;
-
 /*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
@@ -18,17 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
-
-
-import info.aduna.iteration.Iterations;
-import junit.framework.TestCase;
-import org.apache.rya.accumulo.AccumuloRdfConfiguration;
-import org.apache.rya.accumulo.AccumuloRyaDAO;
-import org.apache.rya.api.RdfCloudTripleStoreConstants;
-import org.apache.rya.api.resolver.RdfToRyaConversions;
-import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
-import org.apache.rya.rdftriplestore.inference.InferenceEngine;
+package org.apache.rya.rdftriplestore.inference;
 
 import org.apache.accumulo.core.Constants;
 import org.apache.accumulo.core.client.Connector;
@@ -36,13 +24,20 @@
 import org.apache.accumulo.core.client.mock.MockInstance;
 import org.apache.accumulo.core.security.Authorizations;
 import org.apache.accumulo.core.security.TablePermission;
+import org.apache.rya.accumulo.AccumuloRdfConfiguration;
+import org.apache.rya.accumulo.AccumuloRyaDAO;
+import org.apache.rya.api.RdfCloudTripleStoreConstants;
+import org.apache.rya.api.resolver.RdfToRyaConversions;
+import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
+import org.eclipse.rdf4j.common.iteration.Iterations;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.StatementImpl;
-import org.openrdf.model.impl.ValueFactoryImpl;
+
+import junit.framework.TestCase;
 
 public class SameAsTest extends TestCase {
     private String user = "user";
@@ -52,7 +47,7 @@
     private Authorizations auths = Constants.NO_AUTHS;
     private Connector connector;
     private AccumuloRyaDAO ryaDAO;
-    private ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private String namespace = "urn:test#";
     private AccumuloRdfConfiguration conf;
 
@@ -91,13 +86,13 @@
     @Test
     //This isn't a good test.  It's simply a cut-and-paste from a test that was failing in a different package in the SameAsVisitor.
     public void testGraphConfiguration() throws Exception {
-        URI a = vf.createURI(namespace, "a");
-        Statement statement = new StatementImpl(a, vf.createURI(namespace, "p"), vf.createLiteral("l"));
-        Statement statement2 = new StatementImpl(a, vf.createURI(namespace, "p2"), vf.createLiteral("l"));
+        IRI a = VF.createIRI(namespace, "a");
+        Statement statement = VF.createStatement(a, VF.createIRI(namespace, "p"), VF.createLiteral("l"));
+        Statement statement2 = VF.createStatement(a, VF.createIRI(namespace, "p2"), VF.createLiteral("l"));
         ryaDAO.add(RdfToRyaConversions.convertStatement(statement));
         ryaDAO.add(RdfToRyaConversions.convertStatement(statement2));
-        ryaDAO.add(RdfToRyaConversions.convertStatement(new StatementImpl(vf.createURI(namespace, "b"), vf.createURI(namespace, "p"), vf.createLiteral("l"))));
-        ryaDAO.add(RdfToRyaConversions.convertStatement(new StatementImpl(vf.createURI(namespace, "c"), vf.createURI(namespace, "n"), vf.createLiteral("l"))));
+        ryaDAO.add(RdfToRyaConversions.convertStatement(VF.createStatement(VF.createIRI(namespace, "b"), VF.createIRI(namespace, "p"), VF.createLiteral("l"))));
+        ryaDAO.add(RdfToRyaConversions.convertStatement(VF.createStatement(VF.createIRI(namespace, "c"), VF.createIRI(namespace, "n"), VF.createLiteral("l"))));
 
         // build a connection
         RdfCloudTripleStore store = new RdfCloudTripleStore();
@@ -110,6 +105,6 @@
         
         store.initialize();
 
-        System.out.println(Iterations.asList(store.getConnection().getStatements(a, vf.createURI(namespace, "p"), vf.createLiteral("l"), false, new Resource[0])).size());
+        System.out.println(Iterations.asList(store.getConnection().getStatements(a, VF.createIRI(namespace, "p"), VF.createLiteral("l"), false, new Resource[0])).size());
     }
 }
diff --git a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitorTest.java b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitorTest.java
index 013e535..603144e 100644
--- a/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitorTest.java
+++ b/sail/src/test/java/org/apache/rya/rdftriplestore/inference/SomeValuesFromVisitorTest.java
@@ -28,46 +28,46 @@
 import org.apache.rya.accumulo.AccumuloRdfConfiguration;
 import org.apache.rya.api.utils.NullableStatementImpl;
 import org.apache.rya.rdftriplestore.utils.FixedStatementPattern;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
+import org.eclipse.rdf4j.model.vocabulary.OWL;
+import org.eclipse.rdf4j.model.vocabulary.RDF;
+import org.eclipse.rdf4j.query.algebra.Join;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.ProjectionElem;
+import org.eclipse.rdf4j.query.algebra.ProjectionElemList;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.TupleExpr;
+import org.eclipse.rdf4j.query.algebra.Union;
+import org.eclipse.rdf4j.query.algebra.Var;
 import org.junit.Assert;
 import org.junit.Test;
-import org.openrdf.model.Resource;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.model.impl.ValueFactoryImpl;
-import org.openrdf.model.vocabulary.OWL;
-import org.openrdf.model.vocabulary.RDF;
-import org.openrdf.query.algebra.Join;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.ProjectionElem;
-import org.openrdf.query.algebra.ProjectionElemList;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.TupleExpr;
-import org.openrdf.query.algebra.Union;
-import org.openrdf.query.algebra.Var;
 
 import com.google.common.collect.Sets;
 
 public class SomeValuesFromVisitorTest {
     private static final AccumuloRdfConfiguration conf = new AccumuloRdfConfiguration();
-    private static final ValueFactory vf = new ValueFactoryImpl();
+    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     // Value types
-    private final URI course = vf.createURI("lubm:Course");
-    private final URI gradCourse = vf.createURI("lubm:GraduateCourse");
-    private final URI department = vf.createURI("lubm:Department");
-    private final URI organization = vf.createURI("lubm:Organization");
+    private final IRI course = VF.createIRI("lubm:Course");
+    private final IRI gradCourse = VF.createIRI("lubm:GraduateCourse");
+    private final IRI department = VF.createIRI("lubm:Department");
+    private final IRI organization = VF.createIRI("lubm:Organization");
     // Predicates
-    private final URI takesCourse = vf.createURI("lubm:takesCourse");
-    private final URI headOf = vf.createURI("lubm:headOf");
-    private final URI worksFor = vf.createURI("lubm:worksFor");
+    private final IRI takesCourse = VF.createIRI("lubm:takesCourse");
+    private final IRI headOf = VF.createIRI("lubm:headOf");
+    private final IRI worksFor = VF.createIRI("lubm:worksFor");
     // Supertype of restriction types
-    private final URI person = vf.createURI("lubm:Person");
+    private final IRI person = VF.createIRI("lubm:Person");
 
     @Test
     public void testSomeValuesFrom() throws Exception {
         // Configure a mock instance engine with an ontology:
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        Map<Resource, Set<URI>> personSVF = new HashMap<>();
+        Map<Resource, Set<IRI>> personSVF = new HashMap<>();
         personSVF.put(gradCourse, Sets.newHashSet(takesCourse));
         personSVF.put(course, Sets.newHashSet(takesCourse));
         personSVF.put(department, Sets.newHashSet(headOf));
@@ -136,7 +136,7 @@
         disabledConf.setInferSomeValuesFrom(false);
         // Configure a mock instance engine with an ontology:
         final InferenceEngine inferenceEngine = mock(InferenceEngine.class);
-        Map<Resource, Set<URI>> personSVF = new HashMap<>();
+        Map<Resource, Set<IRI>> personSVF = new HashMap<>();
         personSVF.put(gradCourse, Sets.newHashSet(takesCourse));
         personSVF.put(course, Sets.newHashSet(takesCourse));
         personSVF.put(department, Sets.newHashSet(headOf));
diff --git a/spark/pom.xml b/spark/pom.xml
index 92ad4b0..cdf5259 100644
--- a/spark/pom.xml
+++ b/spark/pom.xml
@@ -69,16 +69,16 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-ntriples</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-ntriples</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-nquads</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-nquads</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-trig</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-trig</artifactId>
             <scope>test</scope>
         </dependency>
 
diff --git a/test/rdf/pom.xml b/test/rdf/pom.xml
index de4a58f..81cd2e7 100644
--- a/test/rdf/pom.xml
+++ b/test/rdf/pom.xml
@@ -36,12 +36,12 @@
     <dependencies>
         <!-- Third Party Dependencies -->
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryalgebra-model</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryalgebra-model</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryparser-sparql</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryparser-sparql</artifactId>
         </dependency>
     
         <dependency>
diff --git a/test/rdf/src/main/java/org/apache/rya/streams/kafka/RdfTestUtil.java b/test/rdf/src/main/java/org/apache/rya/streams/kafka/RdfTestUtil.java
index b4388c3..4e91dee 100644
--- a/test/rdf/src/main/java/org/apache/rya/streams/kafka/RdfTestUtil.java
+++ b/test/rdf/src/main/java/org/apache/rya/streams/kafka/RdfTestUtil.java
@@ -22,13 +22,13 @@
 
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.openrdf.query.algebra.Filter;
-import org.openrdf.query.algebra.MultiProjection;
-import org.openrdf.query.algebra.Projection;
-import org.openrdf.query.algebra.StatementPattern;
-import org.openrdf.query.algebra.helpers.QueryModelVisitorBase;
-import org.openrdf.query.parser.ParsedQuery;
-import org.openrdf.query.parser.sparql.SPARQLParser;
+import org.eclipse.rdf4j.query.algebra.Filter;
+import org.eclipse.rdf4j.query.algebra.MultiProjection;
+import org.eclipse.rdf4j.query.algebra.Projection;
+import org.eclipse.rdf4j.query.algebra.StatementPattern;
+import org.eclipse.rdf4j.query.algebra.helpers.AbstractQueryModelVisitor;
+import org.eclipse.rdf4j.query.parser.ParsedQuery;
+import org.eclipse.rdf4j.query.parser.sparql.SPARQLParser;
 
 import edu.umd.cs.findbugs.annotations.DefaultAnnotation;
 import edu.umd.cs.findbugs.annotations.NonNull;
@@ -45,7 +45,7 @@
     /**
      * Fetch the {@link StatementPattern} from a SPARQL string.
      *
-     * @param sparql - A SPARQL query that contains only a single Statement Patern. (not nul)
+     * @param sparql - A SPARQL query that contains only a single Statement Pattern. (not null)
      * @return The {@link StatementPattern} that was in the query, if it could be found. Otherwise {@code null}
      * @throws Exception The statement pattern could not be found in the parsed SPARQL query.
      */
@@ -54,7 +54,7 @@
 
         final AtomicReference<StatementPattern> statementPattern = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visitChildren(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visitChildren(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final StatementPattern node) throws Exception {
                 statementPattern.set(node);
@@ -75,7 +75,7 @@
 
         final AtomicReference<Projection> projection = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final Projection node) throws Exception {
                 projection.set(node);
@@ -97,7 +97,7 @@
 
         final AtomicReference<MultiProjection> multiProjection = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final MultiProjection node) throws Exception {
                 multiProjection.set(node);
@@ -119,7 +119,7 @@
 
         final AtomicReference<Filter> filter = new AtomicReference<>();
         final ParsedQuery parsed = new SPARQLParser().parseQuery(sparql, null);
-        parsed.getTupleExpr().visit(new QueryModelVisitorBase<Exception>() {
+        parsed.getTupleExpr().visit(new AbstractQueryModelVisitor<Exception>() {
             @Override
             public void meet(final Filter node) throws Exception {
                 filter.set(node);
diff --git a/web/web.rya/pom.xml b/web/web.rya/pom.xml
index 5ac191d..371ca8f 100644
--- a/web/web.rya/pom.xml
+++ b/web/web.rya/pom.xml
@@ -54,12 +54,12 @@
         </dependency>
 
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-rio-rdfxml</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-rio-rdfxml</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.openrdf.sesame</groupId>
-            <artifactId>sesame-queryresultio-sparqljson</artifactId>
+            <groupId>org.eclipse.rdf4j</groupId>
+            <artifactId>rdf4j-queryresultio-sparqljson</artifactId>
         </dependency>
 
         <dependency>
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/AbstractRDFWebServlet.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/AbstractRDFWebServlet.java
index b94af1e..0f1b44a 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/AbstractRDFWebServlet.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/AbstractRDFWebServlet.java
@@ -25,9 +25,9 @@
 //import org.apache.rya.cloudbase.CloudbaseRdfDAO;
 //import org.apache.rya.cloudbase.CloudbaseRdfEvalStatsDAO;
 //import RdfCloudTripleStore;
-//import org.openrdf.repository.Repository;
-//import org.openrdf.repository.RepositoryException;
-//import org.openrdf.repository.sail.SailRepository;
+//import org.eclipse.rdf4j.repository.Repository;
+//import org.eclipse.rdf4j.repository.RepositoryException;
+//import org.eclipse.rdf4j.repository.sail.SailRepository;
 //
 //import javax.servlet.ServletConfig;
 //import javax.servlet.ServletException;
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/DeleteDataServlet.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/DeleteDataServlet.java
index 7cff739..fd1081b 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/DeleteDataServlet.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/DeleteDataServlet.java
@@ -20,11 +20,11 @@
 //package org.apache.cloud.rdf.web.cloudbase.sail;
 
 //
-//import org.openrdf.query.QueryLanguage;
-//import org.openrdf.query.TupleQuery;
-//import org.openrdf.query.resultio.TupleQueryResultWriter;
-//import org.openrdf.repository.RepositoryConnection;
-//import org.openrdf.repository.RepositoryException;
+//import org.eclipse.rdf4j.query.QueryLanguage;
+//import org.eclipse.rdf4j.query.TupleQuery;
+//import org.eclipse.rdf4j.query.resultio.TupleQueryResultWriter;
+//import org.eclipse.rdf4j.repository.RepositoryConnection;
+//import org.eclipse.rdf4j.repository.RepositoryException;
 //
 //import javax.servlet.ServletException;
 //import javax.servlet.http.HttpServletRequest;
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/LoadDataServlet.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/LoadDataServlet.java
index 17e3478..b534ff4 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/LoadDataServlet.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/LoadDataServlet.java
@@ -20,11 +20,11 @@
 //package org.apache.cloud.rdf.web.cloudbase.sail;
 
 //
-//import org.openrdf.model.Resource;
-//import org.openrdf.repository.RepositoryConnection;
-//import org.openrdf.repository.RepositoryException;
-//import org.openrdf.rio.RDFFormat;
-//import org.openrdf.rio.RDFParseException;
+//import org.eclipse.rdf4j.model.Resource;
+//import org.eclipse.rdf4j.repository.RepositoryConnection;
+//import org.eclipse.rdf4j.repository.RepositoryException;
+//import org.eclipse.rdf4j.rio.RDFFormat;
+//import org.eclipse.rdf4j.rio.RDFParseException;
 //
 //import javax.servlet.ServletException;
 //import javax.servlet.ServletInputStream;
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QueryDataServlet.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QueryDataServlet.java
index fdc0598..a60440d 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QueryDataServlet.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QueryDataServlet.java
@@ -22,16 +22,16 @@
 //
 //import RdfCloudTripleStoreConstants;
 //import RdfCloudTripleStoreConstants;
-//import org.openrdf.model.ValueFactory;
-//import org.openrdf.model.impl.ValueFactoryImpl;
-//import org.openrdf.query.GraphQuery;
-//import org.openrdf.query.QueryLanguage;
-//import org.openrdf.query.TupleQuery;
-//import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-//import org.openrdf.repository.Repository;
-//import org.openrdf.repository.RepositoryConnection;
-//import org.openrdf.repository.RepositoryException;
-//import org.openrdf.rio.rdfxml.RDFXMLWriter;
+//import org.eclipse.rdf4j.model.ValueFactory;
+//import org.eclipse.rdf4j.model.impl.ValueFactoryImpl;
+//import org.eclipse.rdf4j.query.GraphQuery;
+//import org.eclipse.rdf4j.query.QueryLanguage;
+//import org.eclipse.rdf4j.query.TupleQuery;
+//import org.eclipse.rdf4j.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
+//import org.eclipse.rdf4j.repository.Repository;
+//import org.eclipse.rdf4j.repository.RepositoryConnection;
+//import org.eclipse.rdf4j.repository.RepositoryException;
+//import org.eclipse.rdf4j.rio.rdfxml.RDFXMLWriter;
 //
 //import javax.servlet.ServletException;
 //import javax.servlet.ServletOutputStream;
@@ -42,7 +42,7 @@
 //
 //public class QueryDataServlet extends AbstractRDFWebServlet {
 //
-//    private ValueFactory vf = new ValueFactoryImpl();
+//    private static final ValueFactory VF = SimpleValueFactory.getInstance();
 //
 //    @Override
 //    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
@@ -99,17 +99,17 @@
 //            GraphQuery graphQuery = conn.prepareGraphQuery(
 //                    QueryLanguage.SPARQL, query);
 //            if (ttl != null && ttl.length() > 0)
-//                graphQuery.setBinding("ttl", vf.createLiteral(Long.parseLong(ttl)));
+//                graphQuery.setBinding("ttl", VF.createLiteral(Long.parseLong(ttl)));
 //            if (startTime != null && startTime.length() > 0)
-//                graphQuery.setBinding("startTime", vf.createLiteral(Long.parseLong(startTime)));
+//                graphQuery.setBinding("startTime", VF.createLiteral(Long.parseLong(startTime)));
 //            if (performant != null && performant.length() > 0)
-//                graphQuery.setBinding("performant", vf.createLiteral(Boolean.parseBoolean(performant)));
+//                graphQuery.setBinding("performant", VF.createLiteral(Boolean.parseBoolean(performant)));
 //            if (infer != null && infer.length() > 0)
-//                graphQuery.setBinding("infer", vf.createLiteral(Boolean.parseBoolean(infer)));
+//                graphQuery.setBinding("infer", VF.createLiteral(Boolean.parseBoolean(infer)));
 //            if (useStats != null && useStats.length() > 0)
-//                graphQuery.setBinding("useStats", vf.createLiteral(Boolean.parseBoolean(useStats)));
+//                graphQuery.setBinding("useStats", VF.createLiteral(Boolean.parseBoolean(useStats)));
 //            if (timeUris != null && timeUris.length() > 0)
-//                graphQuery.setBinding("timeUris", vf.createURI(timeUris));
+//                graphQuery.setBinding("timeUris", VF.createIRI(timeUris));
 //            if (tablePrefix != null && tablePrefix.length() > 0)
 //                RdfCloudTripleStoreConstants.prefixTables(tablePrefix);
 //            RDFXMLWriter rdfWriter = new RDFXMLWriter(os);
@@ -143,17 +143,17 @@
 //            TupleQuery tupleQuery = conn.prepareTupleQuery(
 //                    QueryLanguage.SPARQL, query);
 //            if (ttl != null && ttl.length() > 0)
-//                tupleQuery.setBinding("ttl", vf.createLiteral(Long.parseLong(ttl)));
+//                tupleQuery.setBinding("ttl", VF.createLiteral(Long.parseLong(ttl)));
 //            if (startTime != null && startTime.length() > 0)
-//                tupleQuery.setBinding("startTime", vf.createLiteral(Long.parseLong(startTime)));
+//                tupleQuery.setBinding("startTime", VF.createLiteral(Long.parseLong(startTime)));
 //            if (performant != null && performant.length() > 0)
-//                tupleQuery.setBinding("performant", vf.createLiteral(Boolean.parseBoolean(performant)));
+//                tupleQuery.setBinding("performant", VF.createLiteral(Boolean.parseBoolean(performant)));
 //            if (infer != null && infer.length() > 0)
-//                tupleQuery.setBinding("infer", vf.createLiteral(Boolean.parseBoolean(infer)));
+//                tupleQuery.setBinding("infer", VF.createLiteral(Boolean.parseBoolean(infer)));
 //            if (useStats != null && useStats.length() > 0)
-//                tupleQuery.setBinding("useStats", vf.createLiteral(Boolean.parseBoolean(useStats)));
+//                tupleQuery.setBinding("useStats", VF.createLiteral(Boolean.parseBoolean(useStats)));
 //            if (timeUris != null && timeUris.length() > 0)
-//                tupleQuery.setBinding("timeUris", vf.createURI(timeUris));
+//                tupleQuery.setBinding("timeUris", VF.createIRI(timeUris));
 //            if (tablePrefix != null && tablePrefix.length() > 0)
 //                RdfCloudTripleStoreConstants.prefixTables(tablePrefix);
 //            SPARQLResultsXMLWriter sparqlWriter = new SPARQLResultsXMLWriter(os);
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QuerySerqlDataServlet.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QuerySerqlDataServlet.java
index 89dd84a..2576da2 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QuerySerqlDataServlet.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/cloudbase/sail/QuerySerqlDataServlet.java
@@ -20,14 +20,14 @@
 //package org.apache.cloud.rdf.web.cloudbase.sail;
 
 //
-//import org.openrdf.query.GraphQuery;
-//import org.openrdf.query.QueryLanguage;
-//import org.openrdf.query.TupleQuery;
-//import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-//import org.openrdf.repository.Repository;
-//import org.openrdf.repository.RepositoryConnection;
-//import org.openrdf.repository.RepositoryException;
-//import org.openrdf.rio.rdfxml.RDFXMLWriter;
+//import org.eclipse.rdf4j.query.GraphQuery;
+//import org.eclipse.rdf4j.query.QueryLanguage;
+//import org.eclipse.rdf4j.query.TupleQuery;
+//import org.eclipse.rdf4j.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
+//import org.eclipse.rdf4j.repository.Repository;
+//import org.eclipse.rdf4j.repository.RepositoryConnection;
+//import org.eclipse.rdf4j.repository.RepositoryException;
+//import org.eclipse.rdf4j.rio.rdfxml.RDFXMLWriter;
 //
 //import javax.servlet.ServletException;
 //import javax.servlet.ServletOutputStream;
diff --git a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/sail/RdfController.java b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/sail/RdfController.java
index ab539c4..5044413 100644
--- a/web/web.rya/src/main/java/org/apache/cloud/rdf/web/sail/RdfController.java
+++ b/web/web.rya/src/main/java/org/apache/cloud/rdf/web/sail/RdfController.java
@@ -19,8 +19,6 @@
  * under the License.
  */
 
-
-
 import static org.apache.rya.api.RdfCloudTripleStoreConstants.VALUE_FACTORY;
 
 import java.io.IOException;
@@ -40,35 +38,36 @@
 import org.apache.rya.api.log.LogUtils;
 import org.apache.rya.api.security.SecurityProvider;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStoreConnection;
-import org.openrdf.model.Resource;
-import org.openrdf.model.Statement;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.GraphQuery;
-import org.openrdf.query.MalformedQueryException;
-import org.openrdf.query.QueryEvaluationException;
-import org.openrdf.query.QueryLanguage;
-import org.openrdf.query.QueryResultHandlerException;
-import org.openrdf.query.TupleQuery;
-import org.openrdf.query.TupleQueryResultHandler;
-import org.openrdf.query.TupleQueryResultHandlerException;
-import org.openrdf.query.Update;
-import org.openrdf.query.UpdateExecutionException;
-import org.openrdf.query.parser.ParsedGraphQuery;
-import org.openrdf.query.parser.ParsedOperation;
-import org.openrdf.query.parser.ParsedTupleQuery;
-import org.openrdf.query.parser.ParsedUpdate;
-import org.openrdf.query.parser.QueryParserUtil;
-import org.openrdf.query.resultio.sparqljson.SPARQLResultsJSONWriter;
-import org.openrdf.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.repository.RepositoryException;
-import org.openrdf.repository.sail.SailRepository;
-import org.openrdf.repository.sail.SailRepositoryConnection;
-import org.openrdf.rio.RDFFormat;
-import org.openrdf.rio.RDFHandler;
-import org.openrdf.rio.RDFHandlerException;
-import org.openrdf.rio.RDFParseException;
-import org.openrdf.rio.rdfxml.RDFXMLWriter;
+import org.apache.rya.rdftriplestore.utils.RdfFormatUtils;
+import org.eclipse.rdf4j.model.Resource;
+import org.eclipse.rdf4j.model.Statement;
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.GraphQuery;
+import org.eclipse.rdf4j.query.MalformedQueryException;
+import org.eclipse.rdf4j.query.QueryEvaluationException;
+import org.eclipse.rdf4j.query.QueryLanguage;
+import org.eclipse.rdf4j.query.QueryResultHandlerException;
+import org.eclipse.rdf4j.query.TupleQuery;
+import org.eclipse.rdf4j.query.TupleQueryResultHandler;
+import org.eclipse.rdf4j.query.TupleQueryResultHandlerException;
+import org.eclipse.rdf4j.query.Update;
+import org.eclipse.rdf4j.query.UpdateExecutionException;
+import org.eclipse.rdf4j.query.parser.ParsedGraphQuery;
+import org.eclipse.rdf4j.query.parser.ParsedOperation;
+import org.eclipse.rdf4j.query.parser.ParsedTupleQuery;
+import org.eclipse.rdf4j.query.parser.ParsedUpdate;
+import org.eclipse.rdf4j.query.parser.QueryParserUtil;
+import org.eclipse.rdf4j.query.resultio.sparqljson.SPARQLResultsJSONWriter;
+import org.eclipse.rdf4j.query.resultio.sparqlxml.SPARQLResultsXMLWriter;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.RepositoryException;
+import org.eclipse.rdf4j.repository.sail.SailRepository;
+import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
+import org.eclipse.rdf4j.rio.RDFHandler;
+import org.eclipse.rdf4j.rio.RDFHandlerException;
+import org.eclipse.rdf4j.rio.RDFParseException;
+import org.eclipse.rdf4j.rio.rdfxml.RDFXMLWriter;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.StringUtils;
@@ -332,7 +331,7 @@
             throws RepositoryException, IOException, RDFParseException {
         RDFFormat format_r = RDFFormat.RDFXML;
         if (format != null) {
-            format_r = RDFFormat.valueOf(format);
+            format_r = RdfFormatUtils.getRdfFormatFromName(format);
             if (format_r == null) {
                 throw new RuntimeException("RDFFormat[" + format + "] not found");
             }
@@ -341,7 +340,7 @@
         // add named graph as context (if specified).
         final List<Resource> contextList = new ArrayList<Resource>();
         if (graph != null) {
-            contextList.add(VALUE_FACTORY.createURI(graph));
+            contextList.add(VALUE_FACTORY.createIRI(graph));
         }
         SailRepositoryConnection conn = null;
         try {
diff --git a/web/web.rya/src/main/webapp/WEB-INF/spring/spring-root-extensions.xml b/web/web.rya/src/main/webapp/WEB-INF/spring/spring-root-extensions.xml
index 9f96b6f..ba9a945 100644
--- a/web/web.rya/src/main/webapp/WEB-INF/spring/spring-root-extensions.xml
+++ b/web/web.rya/src/main/webapp/WEB-INF/spring/spring-root-extensions.xml
@@ -99,7 +99,7 @@
         <constructor-arg ref="indexerSettings"/>
     </bean>
 
-    <bean id="indexingSailRepo" class="org.openrdf.repository.sail.SailRepository" init-method="initialize" destroy-method="shutDown">
+    <bean id="indexingSailRepo" class="org.eclipse.rdf4j.repository.sail.SailRepository" init-method="initialize" destroy-method="shutDown">
         <constructor-arg ref="ryaIndexingSail"/>
     </bean>
 </beans>
diff --git a/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerAccumuloTest.java b/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerAccumuloTest.java
index 4d50df0..88c0739 100644
--- a/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerAccumuloTest.java
+++ b/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerAccumuloTest.java
@@ -19,7 +19,6 @@
  * under the License.
  */
 
-
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@@ -30,18 +29,18 @@
 
 import java.io.ByteArrayInputStream;
 
+import org.eclipse.rdf4j.query.BindingSet;
+import org.eclipse.rdf4j.query.TupleQueryResult;
+import org.eclipse.rdf4j.query.resultio.QueryResultIO;
+import org.eclipse.rdf4j.query.resultio.TupleQueryResultFormat;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
-import org.openrdf.query.BindingSet;
-import org.openrdf.query.TupleQueryResult;
-import org.openrdf.query.resultio.QueryResultIO;
-import org.openrdf.query.resultio.TupleQueryResultFormat;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.rio.RDFFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.mock.web.MockHttpServletResponse;
@@ -154,7 +153,7 @@
     private static void validateCount(MockHttpServletResponse response, int count) throws Exception {
 
         String rstString = response.getContentAsString();
-        TupleQueryResult result = QueryResultIO.parse(new ByteArrayInputStream(rstString.getBytes()), TupleQueryResultFormat.SPARQL);
+        TupleQueryResult result = QueryResultIO.parseTuple(new ByteArrayInputStream(rstString.getBytes()), TupleQueryResultFormat.SPARQL);
         
         assertEquals(1, result.getBindingNames().size());
         String binding = result.getBindingNames().get(0);
diff --git a/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerTest.java b/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerTest.java
index f69de61..80227b1 100644
--- a/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerTest.java
+++ b/web/web.rya/src/test/java/org/apache/cloud/rdf/web/sail/RdfControllerTest.java
@@ -28,17 +28,17 @@
 import static org.springframework.test.web.servlet.setup.MockMvcBuilders.standaloneSetup;
 
 import org.apache.rya.api.RdfCloudTripleStoreConfiguration;
+import org.eclipse.rdf4j.model.IRI;
+import org.eclipse.rdf4j.model.Literal;
+import org.eclipse.rdf4j.model.ValueFactory;
+import org.eclipse.rdf4j.repository.Repository;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.rio.RDFFormat;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
-import org.openrdf.model.Literal;
-import org.openrdf.model.URI;
-import org.openrdf.model.ValueFactory;
-import org.openrdf.repository.Repository;
-import org.openrdf.repository.RepositoryConnection;
-import org.openrdf.rio.RDFFormat;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.test.context.ContextConfiguration;
@@ -170,8 +170,8 @@
         ValueFactory vf = repository.getValueFactory();
         RepositoryConnection con = repository.getConnection();
 
-        URI s = vf.createURI("http://mynamespace/ProductType1");
-        URI p = vf.createURI("http://mynamespace#pred1");
+        IRI s = vf.createIRI("http://mynamespace/ProductType1");
+        IRI p = vf.createIRI("http://mynamespace#pred1");
         Literal o = vf.createLiteral("test");
 
         assertTrue(con.getStatements(s, p, o, false).hasNext());
diff --git a/web/web.rya/src/test/resources/controllerTest-context.xml b/web/web.rya/src/test/resources/controllerTest-context.xml
index 39c018d..4286fae 100644
--- a/web/web.rya/src/test/resources/controllerTest-context.xml
+++ b/web/web.rya/src/test/resources/controllerTest-context.xml
@@ -27,11 +27,11 @@
     <bean id="controller" class="org.apache.cloud.rdf.web.sail.RdfController">
     </bean>
 
-    <bean id="repository" class="org.openrdf.repository.sail.SailRepository" init-method="initialize">
+    <bean id="repository" class="org.eclipse.rdf4j.repository.sail.SailRepository" init-method="initialize">
         <constructor-arg ref="memoryStore"/>
     </bean>
 
-    <bean id="memoryStore" class="org.openrdf.sail.memory.MemoryStore">
+    <bean id="memoryStore" class="org.eclipse.rdf4j.sail.memory.MemoryStore">
         <property name="persist" value="false"/>
     </bean>
     
