diff --git a/dao/mongodb.rya/pom.xml b/dao/mongodb.rya/pom.xml
index 7203ea6..c30bbe1 100644
--- a/dao/mongodb.rya/pom.xml
+++ b/dao/mongodb.rya/pom.xml
@@ -77,10 +77,8 @@
             <groupId>org.mongodb</groupId>
             <artifactId>mongo-java-driver</artifactId>
         </dependency>
-        <dependency>
-            <groupId>de.flapdoodle.embed</groupId>
-            <artifactId>de.flapdoodle.embed.mongo</artifactId>
-        </dependency>
+        
+        <!-- Test dependencies. -->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -91,5 +89,10 @@
             <artifactId>mockito-all</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
-</project>
+</project>
\ No newline at end of file
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 ead87d2..f2dd11d 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
@@ -25,9 +25,9 @@
 import java.util.Map.Entry;
 
 import org.apache.rya.api.RdfCloudTripleStoreUtils;
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
-import org.apache.rya.api.domain.RyaIRI;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -40,7 +40,7 @@
 /**
  * Integration tests the methods of {@link MongoDBQueryEngine}.
  */
-public class MongoDBQueryEngineIT extends MongoITBase {
+public class MongoDBQueryEngineIT extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private RyaStatement getStatement(final String s, final String p, final String o) {
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaBatchWriterIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaBatchWriterIT.java
index 4ce1348..ec8ee19 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaBatchWriterIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaBatchWriterIT.java
@@ -24,9 +24,9 @@
 import java.util.List;
 
 import org.apache.log4j.BasicConfigurator;
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.mongodb.batch.MongoDbBatchWriter;
 import org.apache.rya.mongodb.batch.MongoDbBatchWriterConfig;
 import org.apache.rya.mongodb.batch.MongoDbBatchWriterUtils;
@@ -44,7 +44,7 @@
 /**
  * Integration tests for the {@link MongoDbBatchWriter}.
  */
-public class MongoDBRyaBatchWriterIT extends MongoITBase {
+public class MongoDBRyaBatchWriterIT extends MongoRyaITBase {
 
     private static void setupLogging() {
         BasicConfigurator.configure();
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
index 25bf844..b7775de 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAO2IT.java
@@ -25,9 +25,9 @@
 
 import java.io.IOException;
 
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.mongodb.document.visibility.DocumentVisibility;
 import org.bson.Document;
@@ -40,11 +40,11 @@
 /**
  * Integration tests the methods of {@link MongoDBRyaDAO}.
  */
-public class MongoDBRyaDAO2IT extends MongoITBase {
+public class MongoDBRyaDAO2IT extends MongoRyaITBase {
 
     @Test
     public void testDeleteWildcard() throws RyaDAOException {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -60,7 +60,7 @@
 
     @Test
     public void testAdd() throws RyaDAOException, MongoException, IOException {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -83,7 +83,7 @@
 
     @Test
     public void testDelete() throws RyaDAOException, MongoException, IOException {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -109,7 +109,7 @@
 
     @Test
     public void testDeleteWildcardSubjectWithContext() throws RyaDAOException, MongoException, IOException {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
index 939eff3..6e07150 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoDBRyaDAOIT.java
@@ -27,9 +27,9 @@
 import java.io.IOException;
 
 import org.apache.accumulo.core.security.Authorizations;
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaStatement.RyaStatementBuilder;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.api.persist.query.RyaQuery;
 import org.apache.rya.mongodb.document.util.AuthorizationsUtil;
@@ -42,7 +42,7 @@
 import com.mongodb.client.MongoCollection;
 import com.mongodb.client.MongoDatabase;
 
-public class MongoDBRyaDAOIT extends MongoITBase {
+public class MongoDBRyaDAOIT extends MongoRyaITBase {
 
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoITBase.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoRyaITBase.java
similarity index 67%
rename from dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoITBase.java
rename to dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoRyaITBase.java
index bd3870f..760152e 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoITBase.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/MongoRyaITBase.java
@@ -21,44 +21,37 @@
 import java.util.List;
 
 import org.apache.hadoop.conf.Configuration;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.bson.Document;
-import org.junit.Before;
 
 import com.mongodb.DBCollection;
-import com.mongodb.MongoClient;
 import com.mongodb.client.MongoCollection;
 
 /**
  * A base class that may be used when implementing Mongo DB tests that use the
- * JUnit framework.
+ * JUnit framework to talk to an instance of Rya. The configuration file, which contains
+ * state information, is protected so test classes may access it directly.
  */
-public class MongoITBase {
+public class MongoRyaITBase extends MongoITBase {
 
-    private MongoClient mongoClient = null;
     protected StatefulMongoDBRdfConfiguration conf;
 
-    @Before
-    public void setupTest() throws Exception {
+    @Override
+    protected void beforeTest() throws Exception {
         // Setup the configuration that will be used within the test.
         final MongoDBRdfConfiguration conf = new MongoDBRdfConfiguration( new Configuration() );
         conf.setBoolean("sc.useMongo", true);
         conf.setTablePrefix("test_");
         conf.setMongoDBName(conf.getRyaInstanceName());
-        conf.setMongoHostname(EmbeddedMongoSingleton.getMongodConfig().net().getServerAddress().getHostAddress());
-        conf.setMongoPort(Integer.toString(EmbeddedMongoSingleton.getMongodConfig().net().getPort()));
+        conf.setMongoHostname( super.getMongoHostname() );
+        conf.setMongoPort("" + super.getMongoPort());
 
         // Let tests update the configuration.
         updateConfiguration(conf);
 
         // Create the stateful configuration object.
-        mongoClient = EmbeddedMongoSingleton.getNewMongoClient();
         final List<MongoSecondaryIndex> indexers = conf.getInstances("ac.additional.indexers", MongoSecondaryIndex.class);
-        this.conf = new StatefulMongoDBRdfConfiguration(conf, mongoClient, indexers);
-
-        // Remove any DBs that were created by previous tests.
-        for(final String dbName : mongoClient.listDatabaseNames()) {
-            mongoClient.dropDatabase(dbName);
-        }
+        this.conf = new StatefulMongoDBRdfConfiguration(conf, getMongoClient(), indexers);
     }
 
     /**
@@ -72,23 +65,16 @@
     }
 
     /**
-     * @return A {@link MongoClient} that is connected to the embedded instance of Mongo DB.
-     */
-    public MongoClient getMongoClient() {
-        return mongoClient;
-    }
-
-    /**
      * @return The Rya triples {@link MongoCollection}.
      */
     public MongoCollection<Document> getRyaCollection() {
-        return mongoClient.getDatabase(conf.getMongoDBName()).getCollection(conf.getTriplesCollectionName());
+        return getMongoClient().getDatabase(conf.getMongoDBName()).getCollection(conf.getTriplesCollectionName());
     }
 
     /**
      * @return The Rya triples {@link DBCollection}.
      */
     public DBCollection getRyaDbCollection() {
-        return mongoClient.getDB(conf.getMongoDBName()).getCollection(conf.getTriplesCollectionName());
+        return getMongoClient().getDB(conf.getMongoDBName()).getCollection(conf.getTriplesCollectionName());
     }
 }
\ No newline at end of file
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 cd3c513..9d4dcbe 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
@@ -28,7 +28,7 @@
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.mongodb.dao.SimpleMongoDBStorageStrategy;
 import org.bson.Document;
 import org.bson.conversions.Bson;
@@ -62,7 +62,7 @@
 import com.mongodb.DBObject;
 import com.mongodb.util.JSON;
 
-public class PipelineQueryIT extends MongoITBase {
+public class PipelineQueryIT extends MongoRyaITBase {
 
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
     private static final SPARQLParser PARSER = new SPARQLParser();
@@ -78,18 +78,18 @@
         dao.init();
     }
 
-    private void insert(Resource subject, IRI predicate, Value object) throws RyaDAOException {
+    private void insert(final Resource subject, final IRI predicate, final Value object) throws RyaDAOException {
         insert(subject, predicate, object, 0);
     }
 
-    private void insert(Resource subject, IRI predicate, Value object, int derivationLevel) throws RyaDAOException {
+    private void insert(final Resource subject, final IRI predicate, final Value object, final int derivationLevel) throws RyaDAOException {
         final RyaStatementBuilder builder = new RyaStatementBuilder();
         builder.setSubject(RdfToRyaConversions.convertResource(subject));
         builder.setPredicate(RdfToRyaConversions.convertIRI(predicate));
         builder.setObject(RdfToRyaConversions.convertValue(object));
         final RyaStatement rstmt = builder.build();
         if (derivationLevel > 0) {
-            DBObject obj = new SimpleMongoDBStorageStrategy().serialize(builder.build());
+            final DBObject obj = new SimpleMongoDBStorageStrategy().serialize(builder.build());
             obj.put("derivation_level", derivationLevel);
             getRyaDbCollection().insert(obj);
         }
@@ -98,16 +98,16 @@
         }
     }
 
-    private void testPipelineQuery(String query, Multiset<BindingSet> expectedSolutions) throws Exception {
+    private void testPipelineQuery(final String query, final Multiset<BindingSet> expectedSolutions) throws Exception {
         // Prepare query and convert to pipeline
-        QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
-        SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
+        final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
+        final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
         queryTree.visit(visitor);
         // Execute pipeline and verify results
         Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
-        AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
-        Multiset<BindingSet> solutions = HashMultiset.create();
-        CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
+        final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
+        final Multiset<BindingSet> solutions = HashMultiset.create();
+        final CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
         while (iter.hasNext()) {
             solutions.add(iter.next());
         }
@@ -126,8 +126,8 @@
         final String query = "SELECT * WHERE {\n"
                 + "  ?individual a ?type .\n"
                 + "}";
-        List<String> varNames = Arrays.asList("individual", "type");
-        Multiset<BindingSet> expectedSolutions = HashMultiset.create();
+        final List<String> varNames = Arrays.asList("individual", "type");
+        final 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.createIRI("urn:Alice"), FOAF.PERSON));
@@ -147,18 +147,18 @@
         final String query = "SELECT * WHERE {\n"
                 + "  owl:Thing a owl:Class .\n"
                 + "}";
-        Multiset<BindingSet> expectedSolutions = HashMultiset.create();
+        final Multiset<BindingSet> expectedSolutions = HashMultiset.create();
         expectedSolutions.add(new EmptyBindingSet());
         // Execute pipeline and verify results
-        QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
-        SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
+        final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
+        final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
         queryTree.visit(visitor);
         Assert.assertTrue(queryTree.getArg() instanceof Projection);
-        Projection projection = (Projection) queryTree.getArg();
+        final Projection projection = (Projection) queryTree.getArg();
         Assert.assertTrue(projection.getArg() instanceof AggregationPipelineQueryNode);
-        AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) projection.getArg();
-        Multiset<BindingSet> solutions = HashMultiset.create();
-        CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
+        final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) projection.getArg();
+        final Multiset<BindingSet> solutions = HashMultiset.create();
+        final CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
         while (iter.hasNext()) {
             solutions.add(iter.next());
         }
@@ -168,11 +168,11 @@
     @Test
     public void testJoinTwoSharedVariables() throws Exception {
         // Insert data
-        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");
+        final IRI person = VF.createIRI("urn:Person");
+        final IRI livingThing = VF.createIRI("urn:LivingThing");
+        final IRI human = VF.createIRI("urn:Human");
+        final IRI programmer = VF.createIRI("urn:Programmer");
+        final IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
@@ -187,8 +187,8 @@
                 + "  ?A rdfs:subClassOf ?B .\n"
                 + "  ?B rdfs:subClassOf ?A .\n"
                 + "}";
-        List<String> varNames = Arrays.asList("A", "B");
-        Multiset<BindingSet> expectedSolutions = HashMultiset.create();
+        final List<String> varNames = Arrays.asList("A", "B");
+        final Multiset<BindingSet> expectedSolutions = HashMultiset.create();
         expectedSolutions.add(new ListBindingSet(varNames, person, FOAF.PERSON));
         expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, person));
         expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
@@ -200,12 +200,12 @@
     @Test
     public void testVariableRename() throws Exception {
         // Insert data
-        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");
+        final IRI alice = VF.createIRI("urn:Alice");
+        final IRI bob = VF.createIRI("urn:Bob");
+        final IRI carol = VF.createIRI("urn:Carol");
+        final IRI dan = VF.createIRI("urn:Dan");
+        final IRI eve = VF.createIRI("urn:Eve");
+        final IRI friend = VF.createIRI("urn:friend");
         insert(alice, friend, bob);
         insert(alice, friend, carol);
         insert(bob, friend, eve);
@@ -217,8 +217,8 @@
                 + "  ?x <urn:friend> ?y .\n"
                 + "  ?y <urn:friend> ?z .\n"
                 + "}";
-        Multiset<BindingSet> expectedSolutions1 = HashMultiset.create();
-        List<String> varNames = Arrays.asList("x", "friendOfFriend");
+        final Multiset<BindingSet> expectedSolutions1 = HashMultiset.create();
+        final List<String> varNames = Arrays.asList("x", "friendOfFriend");
         expectedSolutions1.add(new ListBindingSet(varNames, alice, eve));
         expectedSolutions1.add(new ListBindingSet(varNames, alice, eve));
         expectedSolutions1.add(new ListBindingSet(varNames, bob, alice));
@@ -231,7 +231,7 @@
                 + "  ?x <urn:friend> ?y .\n"
                 + "  ?y <urn:friend> ?z .\n"
                 + "}";
-        Multiset<BindingSet> expectedSolutions2 = HashMultiset.create();
+        final Multiset<BindingSet> expectedSolutions2 = HashMultiset.create();
         expectedSolutions2.add(new ListBindingSet(varNames, alice, eve));
         expectedSolutions2.add(new ListBindingSet(varNames, bob, alice));
         expectedSolutions2.add(new ListBindingSet(varNames, carol, alice));
@@ -246,10 +246,10 @@
     @Test
     public void testFilterQuery() throws Exception {
         // Insert data
-        IRI alice = VF.createIRI("urn:Alice");
-        IRI bob = VF.createIRI("urn:Bob");
-        IRI eve = VF.createIRI("urn:Eve");
-        IRI relatedTo = VF.createIRI("urn:relatedTo");
+        final IRI alice = VF.createIRI("urn:Alice");
+        final IRI bob = VF.createIRI("urn:Bob");
+        final IRI eve = VF.createIRI("urn:Eve");
+        final IRI relatedTo = VF.createIRI("urn:relatedTo");
         insert(alice, FOAF.KNOWS, bob);
         insert(alice, FOAF.KNOWS, alice);
         insert(alice, FOAF.KNOWS, eve);
@@ -284,12 +284,12 @@
     @Test
     public void testMultiConstruct() throws Exception {
         // Insert data
-        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");
+        final IRI alice = VF.createIRI("urn:Alice");
+        final IRI bob = VF.createIRI("urn:Bob");
+        final IRI eve = VF.createIRI("urn:Eve");
+        final IRI friend = VF.createIRI("urn:friend");
+        final IRI knows = VF.createIRI("urn:knows");
+        final IRI person = VF.createIRI("urn:Person");
         insert(alice, friend, bob);
         insert(bob, knows, eve);
         insert(eve, knows, alice);
@@ -299,7 +299,7 @@
                 + "    ?x rdf:type <urn:Person> .\n"
                 + "} WHERE { ?x <urn:knows> ?y }";
         final Multiset<BindingSet> expected = HashMultiset.create();
-        List<String> varNames = Arrays.asList("subject", "predicate", "object");
+        final List<String> varNames = Arrays.asList("subject", "predicate", "object");
         expected.add(new ListBindingSet(varNames, bob, RDF.TYPE, OWL.THING));
         expected.add(new ListBindingSet(varNames, bob, RDF.TYPE, person));
         expected.add(new ListBindingSet(varNames, eve, RDF.TYPE, OWL.THING));
@@ -310,13 +310,13 @@
 
     @Test
     public void testTriplePipeline() throws Exception {
-        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 IRI alice = VF.createIRI("urn:Alice");
+        final IRI bob = VF.createIRI("urn:Bob");
+        final IRI eve = VF.createIRI("urn:Eve");
+        final IRI friend = VF.createIRI("urn:friend");
+        final IRI knows = VF.createIRI("urn:knows");
+        final IRI year = VF.createIRI("urn:year");
+        final Literal yearLiteral = VF.createLiteral("2017", XMLSchema.GYEAR);
         final String query = "CONSTRUCT {\n"
                 + "    ?x <urn:knows> ?y .\n"
                 + "    ?x <urn:year> \"2017\"^^<" + XMLSchema.GYEAR + "> .\n"
@@ -325,20 +325,20 @@
         insert(bob, knows, eve);
         insert(eve, knows, alice);
         // Prepare query and convert to pipeline
-        QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
-        SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
+        final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
+        final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
         queryTree.visit(visitor);
         // Get pipeline, add triple conversion, and verify that the result is a
         // properly serialized statement
         Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
-        AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
-        List<Bson> triplePipeline = pipelineNode.getTriplePipeline(System.currentTimeMillis(), false);
-        SimpleMongoDBStorageStrategy strategy = new SimpleMongoDBStorageStrategy();
-        List<Statement> results = new LinkedList<>();
-        for (Document doc : getRyaCollection().aggregate(triplePipeline)) {
+        final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
+        final List<Bson> triplePipeline = pipelineNode.getTriplePipeline(System.currentTimeMillis(), false);
+        final SimpleMongoDBStorageStrategy strategy = new SimpleMongoDBStorageStrategy();
+        final List<Statement> results = new LinkedList<>();
+        for (final Document doc : getRyaCollection().aggregate(triplePipeline)) {
             final DBObject dbo = (DBObject) JSON.parse(doc.toJson());
-            RyaStatement rstmt = strategy.deserializeDBObject(dbo);
-            Statement stmt = RyaToRdfConversions.convertStatement(rstmt);
+            final RyaStatement rstmt = strategy.deserializeDBObject(dbo);
+            final Statement stmt = RyaToRdfConversions.convertStatement(rstmt);
             results.add(stmt);
         }
         Assert.assertEquals(2, results.size());
@@ -349,11 +349,11 @@
     @Test
     public void testRequiredDerivationLevel() throws Exception {
         // Insert data
-        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");
+        final IRI person = VF.createIRI("urn:Person");
+        final IRI livingThing = VF.createIRI("urn:LivingThing");
+        final IRI human = VF.createIRI("urn:Human");
+        final IRI programmer = VF.createIRI("urn:Programmer");
+        final IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
@@ -368,18 +368,18 @@
                 + "  ?A rdfs:subClassOf ?B .\n"
                 + "  ?B rdfs:subClassOf ?A .\n"
                 + "}";
-        List<String> varNames = Arrays.asList("A", "B");
+        final List<String> varNames = Arrays.asList("A", "B");
         Multiset<BindingSet> expectedSolutions = HashMultiset.create();
         expectedSolutions.add(new ListBindingSet(varNames, person, FOAF.PERSON));
         expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, person));
         expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
         expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, thing));
         // Prepare query and convert to pipeline
-        QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
-        SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
+        final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
+        final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
         queryTree.visit(visitor);
         Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
-        AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
+        final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
         // Extend the pipeline by requiring a derivation level of zero (should have no effect)
         pipelineNode.requireSourceDerivationDepth(0);
         Multiset<BindingSet> solutions = HashMultiset.create();
@@ -404,11 +404,11 @@
     @Test
     public void testRequiredTimestamp() throws Exception {
         // Insert data
-        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");
+        final IRI person = VF.createIRI("urn:Person");
+        final IRI livingThing = VF.createIRI("urn:LivingThing");
+        final IRI human = VF.createIRI("urn:Human");
+        final IRI programmer = VF.createIRI("urn:Programmer");
+        final IRI thing = VF.createIRI("urn:Thing");
         insert(programmer, RDFS.SUBCLASSOF, person);
         insert(person, RDFS.SUBCLASSOF, FOAF.PERSON, 2);
         insert(FOAF.PERSON, RDFS.SUBCLASSOF, person);
@@ -423,28 +423,28 @@
                 + "  ?A rdfs:subClassOf ?B .\n"
                 + "  ?B rdfs:subClassOf ?A .\n"
                 + "}";
-        List<String> varNames = Arrays.asList("A", "B");
-        Multiset<BindingSet> expectedSolutions = HashMultiset.create();
+        final List<String> varNames = Arrays.asList("A", "B");
+        final Multiset<BindingSet> expectedSolutions = HashMultiset.create();
         expectedSolutions.add(new ListBindingSet(varNames, person, FOAF.PERSON));
         expectedSolutions.add(new ListBindingSet(varNames, FOAF.PERSON, person));
         expectedSolutions.add(new ListBindingSet(varNames, thing, OWL.THING));
         expectedSolutions.add(new ListBindingSet(varNames, OWL.THING, thing));
         // Prepare query and convert to pipeline
-        QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
-        SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
+        final QueryRoot queryTree = new QueryRoot(PARSER.parseQuery(query, null).getTupleExpr());
+        final SparqlToPipelineTransformVisitor visitor = new SparqlToPipelineTransformVisitor(getRyaCollection());
         queryTree.visit(visitor);
         Assert.assertTrue(queryTree.getArg() instanceof AggregationPipelineQueryNode);
-        AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
+        final AggregationPipelineQueryNode pipelineNode = (AggregationPipelineQueryNode) queryTree.getArg();
         // Extend the pipeline by requiring a timestamp of zero (should have no effect)
         pipelineNode.requireSourceTimestamp(0);
-        Multiset<BindingSet> solutions = HashMultiset.create();
+        final Multiset<BindingSet> solutions = HashMultiset.create();
         CloseableIteration<BindingSet, QueryEvaluationException> iter = pipelineNode.evaluate(new QueryBindingSet());
         while (iter.hasNext()) {
             solutions.add(iter.next());
         }
         Assert.assertEquals(expectedSolutions, solutions);
         // Extend the pipeline by requiring a future timestamp (should produce no results)
-        long delta = 1000 * 60 * 60 * 24;
+        final long delta = 1000 * 60 * 60 * 24;
         pipelineNode.requireSourceTimestamp(System.currentTimeMillis() + delta);
         iter = pipelineNode.evaluate(new QueryBindingSet());
         Assert.assertFalse(iter.hasNext());
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
index 5321db5..266313d 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
+++ b/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/instance/MongoRyaDetailsRepositoryIT.java
@@ -40,7 +40,7 @@
 import org.apache.rya.api.instance.RyaDetailsRepository.ConcurrentUpdateException;
 import org.apache.rya.api.instance.RyaDetailsRepository.NotInitializedException;
 import org.apache.rya.api.instance.RyaDetailsRepository.RyaDetailsRepositoryException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/extras/indexing/pom.xml b/extras/indexing/pom.xml
index 3adc823..837d67a 100644
--- a/extras/indexing/pom.xml
+++ b/extras/indexing/pom.xml
@@ -114,6 +114,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
             <artifactId>rya.test.accumulo</artifactId>
             <scope>test</scope>
         </dependency>
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 1d796fe..986c8b5 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
@@ -35,7 +35,7 @@
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjStorage;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -46,7 +46,7 @@
 /**
  * Integration tests the methods of {@link AccumuloBatchUpdatePCJ}.
  */
-public class MongoBatchUpdatePCJIT extends MongoITBase {
+public class MongoBatchUpdatePCJIT extends MongoRyaITBase {
 
     @Override
     protected void updateConfiguration(final MongoDBRdfConfiguration conf) {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoCreatePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoCreatePCJIT.java
index 183c195..49fbe30 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoCreatePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoCreatePCJIT.java
@@ -34,7 +34,7 @@
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.PrecomputedJoinStorage;
 import org.apache.rya.indexing.pcj.storage.mongo.MongoPcjStorage;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 import com.google.common.base.Optional;
@@ -43,7 +43,7 @@
 /**
  * Integration tests the methods of {@link AccumuloCreatePCJ}.
  */
-public class MongoCreatePCJIT extends MongoITBase {
+public class MongoCreatePCJIT extends MongoRyaITBase {
     @Test(expected = InstanceDoesNotExistException.class)
     public void instanceDoesNotExist() throws Exception {
         final RyaClient ryaClient = MongoRyaClientFactory.build(getConnectionDetails(), getMongoClient());
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoDeletePCJIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoDeletePCJIT.java
index d8137bc..6369920 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoDeletePCJIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoDeletePCJIT.java
@@ -29,7 +29,7 @@
 import org.apache.rya.api.client.accumulo.AccumuloCreatePCJ;
 import org.apache.rya.api.instance.RyaDetails;
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails.PCJDetails;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 import com.google.common.base.Optional;
@@ -38,7 +38,7 @@
 /**
  * Integration tests the methods of {@link AccumuloCreatePCJ}.
  */
-public class MongoDeletePCJIT extends MongoITBase {
+public class MongoDeletePCJIT extends MongoRyaITBase {
     @Test(expected = InstanceDoesNotExistException.class)
     public void instanceDoesNotExist() throws Exception {
         final RyaClient ryaClient = MongoRyaClientFactory.build(getConnectionDetails(), getMongoClient());
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 a009b2a..581a0db 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
@@ -26,7 +26,7 @@
 import org.apache.rya.api.client.ExecuteSparqlQuery;
 import org.apache.rya.api.client.Install.InstallConfiguration;
 import org.apache.rya.api.client.RyaClient;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -38,7 +38,7 @@
 /**
  * Integration tests the methods of {@link }.
  */
-public class MongoExecuteSparqlQueryIT extends MongoITBase {
+public class MongoExecuteSparqlQueryIT extends MongoRyaITBase {
 
     @Test
     public void ExecuteSparqlQuery_exec() throws Exception {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
index 5f1d222..5c91fb2 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoGetInstanceDetailsIT.java
@@ -37,7 +37,7 @@
 import org.apache.rya.api.instance.RyaDetails.PCJIndexDetails;
 import org.apache.rya.api.instance.RyaDetails.ProspectorDetails;
 import org.apache.rya.api.instance.RyaDetails.TemporalIndexDetails;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 import com.google.common.base.Optional;
@@ -46,7 +46,7 @@
 /**
  * Tests the methods of {@link MongoGetInstanceDetails}.
  */
-public class MongoGetInstanceDetailsIT extends MongoITBase {
+public class MongoGetInstanceDetailsIT extends MongoRyaITBase {
 
     @Test
     public void getDetails() throws MongoException, RyaClientException {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
index ecca646..f440a4e 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstallIT.java
@@ -33,13 +33,13 @@
 import org.apache.rya.api.client.InstanceExists;
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.api.client.RyaClientException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 /**
  * Integration tests the methods of {@link MongoInstall}.
  */
-public class MongoInstallIT extends MongoITBase {
+public class MongoInstallIT extends MongoRyaITBase {
 
     @Test
     public void install() throws DuplicateInstanceNameException, RyaClientException {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
index c27df2c..f6ff4fb 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoInstanceExistsIT.java
@@ -22,8 +22,8 @@
 import static org.junit.Assert.assertTrue;
 
 import org.apache.accumulo.core.client.TableExistsException;
-import org.apache.rya.mongodb.MongoITBase;
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.junit.Test;
 
 import com.mongodb.MongoClient;
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
index 6a5b1d6..7da76c2 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoListInstancesIT.java
@@ -30,7 +30,7 @@
 import org.apache.rya.api.client.ListInstances;
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.api.client.RyaClientException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 import com.google.common.collect.Lists;
@@ -39,7 +39,7 @@
 /**
  * Integration tests the methods of {@link MongoListInstances}.
  */
-public class MongoListInstancesIT extends MongoITBase {
+public class MongoListInstancesIT extends MongoRyaITBase {
 
     @Test
     public void listInstances_hasRyaDetailsTable() throws MongoException, DuplicateInstanceNameException, RyaClientException {
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 1eedc68..8629029 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
@@ -28,7 +28,7 @@
 import org.apache.rya.api.client.Install.InstallConfiguration;
 import org.apache.rya.api.client.InstanceDoesNotExistException;
 import org.apache.rya.api.client.RyaClient;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.bson.Document;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
@@ -40,7 +40,7 @@
 /**
  * Integration tests the methods of {@link MongoLoadStatementsFile}.
  */
-public class MongoLoadStatementsFileIT extends MongoITBase {
+public class MongoLoadStatementsFileIT extends MongoRyaITBase {
 
     @Test(expected = InstanceDoesNotExistException.class)
     public void instanceDoesNotExist() throws Exception {
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 a491feb..c8d9e16 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
@@ -26,7 +26,7 @@
 import org.apache.rya.api.client.Install.InstallConfiguration;
 import org.apache.rya.api.client.InstanceDoesNotExistException;
 import org.apache.rya.api.client.RyaClient;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.bson.Document;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
@@ -38,7 +38,7 @@
 /**
  * Integration tests the methods of {@link MongoLoadStatements}.
  */
-public class MongoLoadStatementsIT extends MongoITBase {
+public class MongoLoadStatementsIT extends MongoRyaITBase {
 
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoSetRyaStreamsConfigurationIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoSetRyaStreamsConfigurationIT.java
index 5fea578..42c4687 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoSetRyaStreamsConfigurationIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoSetRyaStreamsConfigurationIT.java
@@ -28,13 +28,13 @@
 import org.apache.rya.api.client.InstanceDoesNotExistException;
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.api.instance.RyaDetails.RyaStreamsDetails;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 /**
  * Integration tests the methods of {@link MongoSetRyaStreamsConfiguration}.
  */
-public class MongoSetRyaStreamsConfigurationIT extends MongoITBase {
+public class MongoSetRyaStreamsConfigurationIT extends MongoRyaITBase {
 
     @Test(expected = InstanceDoesNotExistException.class)
     public void instanceDoesNotExist() throws Exception {
diff --git a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
index d9d1a6d..68f6f62 100644
--- a/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/api/client/mongo/MongoUninstallIT.java
@@ -30,7 +30,7 @@
 import org.apache.rya.api.client.RyaClient;
 import org.apache.rya.api.client.RyaClientException;
 import org.apache.rya.api.client.Uninstall;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.junit.Test;
 
 import com.mongodb.MongoException;
@@ -38,7 +38,7 @@
 /**
  * Integration tests the methods of {@link MongoUninstall}.
  */
-public class MongoUninstallIT extends MongoITBase {
+public class MongoUninstallIT extends MongoRyaITBase {
 
     @Test
     public void uninstall() throws MongoException, RyaClientException {
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 92edfef..793a5de 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
@@ -30,8 +30,8 @@
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
-import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.apache.rya.test.mongo.EmbeddedMongoSingleton;
 import org.eclipse.rdf4j.query.algebra.Projection;
 import org.eclipse.rdf4j.query.algebra.TupleExpr;
 import org.eclipse.rdf4j.query.parser.ParsedQuery;
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 833858a..e4ce395 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
@@ -34,7 +34,7 @@
 import org.apache.rya.indexing.entity.model.Type;
 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.apache.rya.test.mongo.MongoITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
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 67595a9..55620d2 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
@@ -36,7 +36,7 @@
 import org.apache.rya.indexing.entity.storage.EntityStorage.EntityAlreadyExistsException;
 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.apache.rya.test.mongo.MongoITBase;
 import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
 
diff --git a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoTypeStorageIT.java b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoTypeStorageIT.java
index d3342c0..00087db 100644
--- a/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoTypeStorageIT.java
+++ b/extras/indexing/src/test/java/org/apache/rya/indexing/entity/storage/mongo/MongoTypeStorageIT.java
@@ -30,7 +30,7 @@
 import org.apache.rya.indexing.entity.model.Type;
 import org.apache.rya.indexing.entity.storage.TypeStorage;
 import org.apache.rya.indexing.entity.storage.TypeStorage.TypeStorageException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.junit.Test;
 
 import com.google.common.collect.ImmutableSet;
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 b9e74bc..4ff2436 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
@@ -22,9 +22,9 @@
 
 import java.util.Set;
 
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.indexing.entity.model.Entity;
 import org.apache.rya.indexing.entity.model.Property;
 import org.apache.rya.indexing.entity.model.Type;
@@ -32,7 +32,7 @@
 import org.apache.rya.indexing.entity.storage.TypeStorage;
 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.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.vocabulary.RDF;
 import org.eclipse.rdf4j.model.vocabulary.XMLSchema;
 import org.junit.Test;
@@ -43,7 +43,7 @@
 /**
  * Integration tests the methods of {@link MongoEntityIndexer}.
  */
-public class MongoEntityIndexerIT extends MongoITBase {
+public class MongoEntityIndexerIT extends MongoRyaITBase {
 
     private static final Type PERSON_TYPE =
             new Type(new RyaIRI("urn:person"),
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 79c5014..5bc6411 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
@@ -31,8 +31,8 @@
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
-import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.apache.rya.test.mongo.EmbeddedMongoSingleton;
 import org.eclipse.rdf4j.query.algebra.Projection;
 import org.eclipse.rdf4j.query.algebra.QueryModelNode;
 import org.eclipse.rdf4j.query.algebra.StatementPattern;
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 54960c4..246a86e 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
@@ -31,8 +31,8 @@
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
-import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.apache.rya.test.mongo.EmbeddedMongoSingleton;
 import org.eclipse.rdf4j.query.algebra.Projection;
 import org.eclipse.rdf4j.query.algebra.QueryModelNode;
 import org.eclipse.rdf4j.query.algebra.StatementPattern;
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 db599ab..29ad3af 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
@@ -24,10 +24,10 @@
 import static org.apache.rya.api.domain.RyaTypeUtils.doubleRyaType;
 import static org.apache.rya.api.domain.RyaTypeUtils.floatRyaType;
 import static org.apache.rya.api.domain.RyaTypeUtils.intRyaType;
+import static org.apache.rya.api.domain.RyaTypeUtils.iriRyaType;
 import static org.apache.rya.api.domain.RyaTypeUtils.longRyaType;
 import static org.apache.rya.api.domain.RyaTypeUtils.shortRyaType;
 import static org.apache.rya.api.domain.RyaTypeUtils.stringRyaType;
-import static org.apache.rya.api.domain.RyaTypeUtils.iriRyaType;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -38,8 +38,8 @@
 import java.util.Map;
 import java.util.Set;
 
-import org.apache.rya.api.domain.RyaSchema;
 import org.apache.rya.api.domain.RyaIRI;
+import org.apache.rya.api.domain.RyaSchema;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.indexing.entity.model.Entity;
@@ -51,7 +51,7 @@
 import org.apache.rya.indexing.mongodb.MongoDbSmartUri;
 import org.apache.rya.indexing.smarturi.SmartUriAdapter;
 import org.apache.rya.indexing.smarturi.SmartUriException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Value;
@@ -74,7 +74,7 @@
 /**
  * Tests for MongoDB based Smart URI.
  */
-public class MongoDbSmartUriIT extends MongoITBase {
+public class MongoDbSmartUriIT extends MongoRyaITBase {
     private static final String NAMESPACE = RyaSchema.NAMESPACE;
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
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 78da9cd..a8c8686 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
@@ -20,8 +20,8 @@
 
 import java.util.List;
 
-import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.api.domain.RyaIRI;
+import org.apache.rya.api.domain.RyaType;
 import org.apache.rya.indexing.entity.EntityIndexOptimizer;
 import org.apache.rya.indexing.entity.model.Entity;
 import org.apache.rya.indexing.entity.model.Property;
@@ -29,7 +29,7 @@
 import org.apache.rya.indexing.entity.query.EntityQueryNode;
 import org.apache.rya.indexing.entity.storage.EntityStorage;
 import org.apache.rya.indexing.entity.storage.TypeStorage;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.vocabulary.RDF;
 import org.eclipse.rdf4j.query.MalformedQueryException;
 import org.eclipse.rdf4j.query.algebra.QueryModelNode;
@@ -44,7 +44,7 @@
 
 import com.google.common.collect.ImmutableSet;
 
-public class MongoEntityIndex2IT extends MongoITBase {
+public class MongoEntityIndex2IT extends MongoRyaITBase {
     private static final Type PERSON_TYPE =
             new Type(new RyaIRI("urn:person"),
                 ImmutableSet.<RyaIRI>builder()
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 3636448..4dae457 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
@@ -34,7 +34,7 @@
 import org.apache.rya.indexing.entity.storage.TypeStorage;
 import org.apache.rya.indexing.entity.update.mongo.MongoEntityIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Value;
@@ -52,7 +52,7 @@
 
 import com.google.common.collect.ImmutableSet;
 
-public class MongoEntityIndexIT extends MongoITBase {
+public class MongoEntityIndexIT extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
@@ -64,7 +64,7 @@
     @Test
     public void ensureInEntityStore_Test() throws Exception {
         final Sail sail = RyaSailFactory.getInstance(conf);
-        SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+        final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
         conn.begin();
 
         try(MongoEntityIndexer indexer = new MongoEntityIndexer()) {
@@ -86,7 +86,7 @@
     @Test
     public void sparqlQuery_Test() throws Exception {
         final Sail sail = RyaSailFactory.getInstance(conf);
-        SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+        final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
         conn.begin();
 
         try(MongoEntityIndexer indexer = new MongoEntityIndexer()) {
@@ -122,7 +122,7 @@
     @Test
     public void partialQuery_Test() throws Exception {
         final Sail sail = RyaSailFactory.getInstance(conf);
-        SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+        final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
         conn.begin();
 
         try(MongoEntityIndexer indexer = new MongoEntityIndexer()) {
@@ -158,7 +158,7 @@
         }
     }
 
-    private void setupTypes(MongoEntityIndexer indexer) throws Exception {
+    private void setupTypes(final MongoEntityIndexer indexer) throws Exception {
         final TypeStorage typeStore = indexer.getTypeStorage();
         // Add some Types to the storage.
         final Type cat = new Type(new RyaIRI("urn:cat"),
@@ -195,7 +195,7 @@
         typeStore.create(person);
     }
 
-    private void addStatements(SailRepositoryConnection conn) throws Exception {
+    private void addStatements(final SailRepositoryConnection conn) throws Exception {
         //alice
         IRI subject = VF.createIRI("urn:alice");
         IRI predicate = VF.createIRI("urn:name");
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 4d2c6ce..a836c3d 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
@@ -24,15 +24,15 @@
 import java.util.HashSet;
 import java.util.Set;
 
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.resolver.RdfToRyaConversions;
 import org.apache.rya.api.resolver.RyaToRdfConversions;
 import org.apache.rya.indexing.StatementConstraints;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.freetext.MongoFreeTextIndexer;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Statement;
@@ -47,7 +47,7 @@
 /**
  * Integration tests the methods of {@link MongoFreeTextIndexer}.
  */
-public class MongoFreeTextIndexerIT extends MongoITBase {
+public class MongoFreeTextIndexerIT extends MongoRyaITBase {
     private static final StatementConstraints EMPTY_CONSTRAINTS = new StatementConstraints();
 
     @Test
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 8ff563d..c0bf4c5 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
@@ -31,7 +31,7 @@
 import org.apache.rya.api.client.mongo.MongoRyaClientFactory;
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
@@ -46,7 +46,7 @@
 import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
 
-public class MongoPCJIndexIT extends MongoITBase {
+public class MongoPCJIndexIT extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
@@ -75,13 +75,13 @@
 
         //purge contents of rya triples collection
         getMongoClient().getDatabase(conf.getRyaInstanceName()).getCollection(conf.getTriplesCollectionName()).drop();
-        
+
         //run the query.  since the triples collection is gone, if the results match, they came from the PCJ index.
         conf.setBoolean(ConfigUtils.USE_PCJ, true);
         conf.setBoolean(ConfigUtils.USE_OPTIMAL_PCJ, true);
         conf.setBoolean(ConfigUtils.DISPLAY_QUERY_PLAN, true);
         final Sail sail = RyaSailFactory.getInstance(conf);
-        SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+        final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
         conn.begin();
         final TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, pcjQuery);
         tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERYPLAN_FLAG, RdfCloudTripleStoreConstants.VALUE_FACTORY.createLiteral(true));
@@ -91,7 +91,7 @@
             final BindingSet bs = rez.next();
             results.add(bs);
         }
-        
+
      // Verify the correct results were loaded into the PCJ table.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
@@ -122,7 +122,7 @@
         assertEquals(6, results.size());
         assertEquals(expectedResults, results);
     }
-    
+
     @Test
     public void sparqlQuery_Test_complex() throws Exception {
         // Setup a Rya Client.
@@ -132,8 +132,8 @@
         		+ " ?name <urn:likes> <urn:icecream> ."
         		+ " ?name <urn:hasEyeColor> <urn:blue> ."
         		+ " }";
-        
-        final String testQuery = 
+
+        final String testQuery =
         		  "SELECT ?name WHERE {"
         		+ " ?name <urn:hasHairColor> <urn:brown> ."
         		+ " ?name <urn:likes> <urn:icecream> ."
@@ -153,10 +153,10 @@
 
         System.out.println("Triples: " + getMongoClient().getDatabase(conf.getRyaInstanceName()).getCollection(conf.getTriplesCollectionName()).count());
         System.out.println("PCJS: " + getMongoClient().getDatabase(conf.getRyaInstanceName()).getCollection("pcjs").count());
-        
+
         //run the query.  since the triples collection is gone, if the results match, they came from the PCJ index.
         final Sail sail = RyaSailFactory.getInstance(conf);
-        SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+        final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
         conn.begin();
         final TupleQuery tupleQuery = conn.prepareTupleQuery(QueryLanguage.SPARQL, testQuery);
         tupleQuery.setBinding(RdfCloudTripleStoreConfiguration.CONF_QUERYPLAN_FLAG, RdfCloudTripleStoreConstants.VALUE_FACTORY.createLiteral(true));
@@ -167,7 +167,7 @@
             final BindingSet bs = rez.next();
             results.add(bs);
         }
-        
+
      // Verify the correct results were loaded into the PCJ table.
         final Set<BindingSet> expectedResults = new HashSet<>();
 
@@ -187,7 +187,7 @@
         assertEquals(3, results.size());
         assertEquals(expectedResults, results);
     }
-    
+
     private MongoConnectionDetails getConnectionDetails() {
         final java.util.Optional<char[]> password = conf.getMongoPassword() != null ?
                 java.util.Optional.of(conf.getMongoPassword().toCharArray()) :
@@ -210,7 +210,7 @@
         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.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")));
@@ -219,7 +219,7 @@
         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.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")));
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 ea58d11..4877f83 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
@@ -35,7 +35,7 @@
 import org.apache.rya.indexing.mongodb.pcj.MongoPcjQueryNode;
 import org.apache.rya.indexing.pcj.matching.PCJOptimizer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.eclipse.rdf4j.model.IRI;
@@ -58,7 +58,7 @@
 
 import com.google.common.collect.Lists;
 
-public class MongoPcjIntegrationTest extends MongoITBase {
+public class MongoPcjIntegrationTest extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     private static final IRI talksTo = VF.createIRI("uri:talksTo");
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 5a7598e..b9743eb 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
@@ -39,7 +39,7 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.temporal.MongoTemporalIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Statement;
@@ -76,7 +76,7 @@
  * And a few more.
  *
  */
-public final class MongoTemporalIndexerIT extends MongoITBase {
+public final class MongoTemporalIndexerIT extends MongoRyaITBase {
 
     private static final String URI_PROPERTY_EVENT_TIME = "Property:event:time";
     private static final String URI_PROPERTY_CIRCA = "Property:circa";
@@ -232,7 +232,7 @@
 
             final String dbName = conf.getMongoDBName();
             final DB db = super.getMongoClient().getDB(dbName);
-            DBCollection collection = db.getCollection(conf.get(MongoDBRdfConfiguration.MONGO_COLLECTION_PREFIX, "rya") + tIndexer.getCollectionName());
+            final DBCollection collection = db.getCollection(conf.get(MongoDBRdfConfiguration.MONGO_COLLECTION_PREFIX, "rya") + tIndexer.getCollectionName());
 
             printTables(tIndexer, "junit testing: Temporal entities stored in testDelete before delete");
             assertEquals("Number of rows stored.", 2, collection.count()); // 4 index entries per statement
@@ -707,7 +707,7 @@
      * @return Count of entries in the index table.
      * @throws IOException
      */
-    public void printTables(MongoTemporalIndexer tIndexer, final String description) throws IOException {
+    public void printTables(final MongoTemporalIndexer tIndexer, final String description) throws IOException {
         System.out.println("-- start printTables() -- " + description);
         System.out.println("Reading : " + tIndexer.getCollection().getFullName());
         final DBCursor cursor = tIndexer.getCollection().find();
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 0d80797..ac56e21 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
@@ -32,8 +32,8 @@
 import org.apache.rya.indexing.mongodb.pcj.MongoPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AbstractPcjIndexSetProvider;
 import org.apache.rya.indexing.pcj.matching.provider.AccumuloIndexSetProvider;
-import org.apache.rya.mongodb.EmbeddedMongoSingleton;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
+import org.apache.rya.test.mongo.EmbeddedMongoSingleton;
 import org.eclipse.rdf4j.query.algebra.Projection;
 import org.eclipse.rdf4j.query.algebra.QueryModelNode;
 import org.eclipse.rdf4j.query.algebra.StatementPattern;
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 9d26914..df0807e 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
@@ -62,7 +62,7 @@
 import org.apache.rya.indexing.mongodb.update.RyaObjectStorage.ObjectStorageException;
 import org.apache.rya.indexing.smarturi.SmartUriException;
 import org.apache.rya.indexing.smarturi.duplication.conf.DuplicateDataConfig;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.joda.time.DateTime;
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 611a141..7768d88 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
@@ -26,14 +26,14 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.api.persist.RyaDAOException;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.sail.config.RyaSailFactory;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -49,7 +49,7 @@
 import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
 
-public class MongoStatementMetadataIT extends MongoITBase {
+public class MongoStatementMetadataIT extends MongoRyaITBase {
     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>; "
@@ -69,8 +69,8 @@
 
     @Test
     public void simpleQueryWithoutBindingSet() throws Exception {
-        Sail sail = RyaSailFactory.getInstance(conf);
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final Sail sail = RyaSailFactory.getInstance(conf);
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -83,7 +83,7 @@
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement);
 
-            SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+            final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
             final TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query1).evaluate();
 
             final QueryBindingSet bs = new QueryBindingSet();
@@ -115,8 +115,8 @@
      */
     @Test
     public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception {
-        Sail sail = RyaSailFactory.getInstance(conf);
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final Sail sail = RyaSailFactory.getInstance(conf);
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -128,7 +128,7 @@
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement);
 
-            SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+            final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
             final TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query1).evaluate();
 
             final List<BindingSet> bsList = new ArrayList<>();
@@ -145,8 +145,8 @@
 
     @Test
     public void simpleQueryWithBindingSet() throws Exception {
-        Sail sail = RyaSailFactory.getInstance(conf);
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final Sail sail = RyaSailFactory.getInstance(conf);
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -161,7 +161,7 @@
             dao.add(statement1);
             dao.add(statement2);
 
-            SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+            final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
             final TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query1).evaluate();
 
             final Set<BindingSet> expected = new HashSet<>();
@@ -204,8 +204,8 @@
      */
     @Test
     public void simpleQueryWithBindingSetJoinPropertyToSubject() throws Exception {
-        Sail sail = RyaSailFactory.getInstance(conf);
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final Sail sail = RyaSailFactory.getInstance(conf);
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
@@ -229,7 +229,7 @@
             dao.add(statement3);
             dao.add(statement4);
 
-            SailRepositoryConnection conn = new SailRepository(sail).getConnection();
+            final SailRepositoryConnection conn = new SailRepository(sail).getConnection();
             final TupleQueryResult result = conn.prepareTupleQuery(QueryLanguage.SPARQL, query2).evaluate();
 
             final Set<BindingSet> expected = 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 4f06ace..56d8322 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
@@ -7,9 +7,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
@@ -23,14 +23,14 @@
 import java.util.List;
 import java.util.Set;
 
+import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.RyaStatement;
 import org.apache.rya.api.domain.RyaType;
-import org.apache.rya.api.domain.RyaIRI;
 import org.apache.rya.api.domain.StatementMetadata;
 import org.apache.rya.indexing.statement.metadata.matching.StatementMetadataNode;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -46,7 +46,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
-public class MongoStatementMetadataNodeIT extends MongoITBase {
+public class MongoStatementMetadataNodeIT extends MongoRyaITBase {
     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>; "
@@ -56,37 +56,37 @@
 
     @Before
     public void init() throws Exception {
-        final Set<RyaIRI> propertySet = new HashSet<RyaIRI>(Arrays.asList(new RyaIRI("http://createdBy"), new RyaIRI("http://createdOn")));
+        final Set<RyaIRI> propertySet = new HashSet<>(Arrays.asList(new RyaIRI("http://createdBy"), new RyaIRI("http://createdOn")));
         conf.setUseStatementMetadata(true);
         conf.setStatementMetadataProperties(propertySet);
     }
 
     @Test
     public void simpleQueryWithoutBindingSet() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaType("Joe"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04"));
 
-            RyaStatement statement = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
 
-            StatementMetadataNode<?> node = new StatementMetadataNode<>(spList, conf);
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
+            final StatementMetadataNode<?> node = new StatementMetadataNode<>(spList, conf);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
 
-            QueryBindingSet bs = new QueryBindingSet();
+            final QueryBindingSet bs = new QueryBindingSet();
             bs.addBinding("x", VF.createLiteral("CoffeeShop"));
             bs.addBinding("y", VF.createLiteral("Joe"));
 
-            List<BindingSet> bsList = new ArrayList<>();
+            final List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
                 bsList.add(iteration.next());
             }
@@ -106,26 +106,26 @@
      */
     @Test
     public void simpleQueryWithoutBindingSetInvalidProperty() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
-            dao.init();	
+            dao.init();
 
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaType("Doug"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-02-15"));
 
-            RyaStatement statement = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(new QueryBindingSet());
 
-            List<BindingSet> bsList = new ArrayList<>();
+            final List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
                 bsList.add(iteration.next());
             }
@@ -138,38 +138,38 @@
 
     @Test
     public void simpleQueryWithBindingSet() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaType("Joe"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04"));
 
-            RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
-            RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("HardwareStore"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement1);
             dao.add(statement2);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
-            QueryBindingSet bsConstraint = new QueryBindingSet();
+            final QueryBindingSet bsConstraint = new QueryBindingSet();
             bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
             bsConstraint.addBinding("z", VF.createLiteral("Virginia"));
 
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
-            QueryBindingSet expected = new QueryBindingSet();
+            final QueryBindingSet expected = new QueryBindingSet();
             expected.addBinding("x", VF.createLiteral("CoffeeShop"));
             expected.addBinding("y", VF.createLiteral("Joe"));
             expected.addBinding("z", VF.createLiteral("Virginia"));
 
-            List<BindingSet> bsList = new ArrayList<>();
+            final List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
                 bsList.add(iteration.next());
             }
@@ -195,45 +195,45 @@
      */
     @Test
     public void simpleQueryWithBindingSetJoinPropertyToSubject() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaIRI("http://Joe"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04"));
 
-            RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
-            RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Bob"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Bob"), new RyaIRI("http://worksAt"),
                     new RyaType("HardwareStore"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement1);
             dao.add(statement2);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query2, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query2, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
-            List<BindingSet> bsCollection = new ArrayList<>();
-            QueryBindingSet bsConstraint1 = new QueryBindingSet();
+            final List<BindingSet> bsCollection = new ArrayList<>();
+            final QueryBindingSet bsConstraint1 = new QueryBindingSet();
             bsConstraint1.addBinding("y", VF.createLiteral("CoffeeShop"));
             bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
-            QueryBindingSet bsConstraint2 = new QueryBindingSet();
+            final QueryBindingSet bsConstraint2 = new QueryBindingSet();
             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);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
-            QueryBindingSet expected = new QueryBindingSet();
+            final QueryBindingSet expected = new QueryBindingSet();
             expected.addBinding("y", VF.createLiteral("CoffeeShop"));
             expected.addBinding("x", VF.createIRI("http://Joe"));
             expected.addBinding("z", VF.createLiteral("Virginia"));
 
-            List<BindingSet> bsList = new ArrayList<>();
+            final List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
                 bsList.add(iteration.next());
             }
@@ -258,30 +258,30 @@
      */
     @Test
     public void simpleQueryWithBindingSetJoinOnProperty() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaType("Joe"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04"));
 
-            RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement1);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
-            QueryBindingSet bsConstraint = new QueryBindingSet();
+            final QueryBindingSet bsConstraint = new QueryBindingSet();
             bsConstraint.addBinding("x", VF.createLiteral("CoffeeShop"));
             bsConstraint.addBinding("y", VF.createLiteral("Doug"));
 
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsConstraint);
 
-            List<BindingSet> bsList = new ArrayList<>();
+            final List<BindingSet> bsList = new ArrayList<>();
             while (iteration.hasNext()) {
                 bsList.add(iteration.next());
             }
@@ -302,58 +302,58 @@
      */
     @Test
     public void simpleQueryWithBindingSetCollection() throws Exception {
-        MongoDBRyaDAO dao = new MongoDBRyaDAO();
+        final MongoDBRyaDAO dao = new MongoDBRyaDAO();
         try {
             dao.setConf(conf);
             dao.init();
-            StatementMetadata metadata = new StatementMetadata();
+            final StatementMetadata metadata = new StatementMetadata();
             metadata.addMetadata(new RyaIRI("http://createdBy"), new RyaType("Joe"));
             metadata.addMetadata(new RyaIRI("http://createdOn"), new RyaType(XMLSchema.DATE, "2017-01-04"));
 
-            RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement1 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("CoffeeShop"), new RyaIRI("http://context"), "", metadata);
-            RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
+            final RyaStatement statement2 = new RyaStatement(new RyaIRI("http://Joe"), new RyaIRI("http://worksAt"),
                     new RyaType("HardwareStore"), new RyaIRI("http://context"), "", metadata);
             dao.add(statement1);
             dao.add(statement2);
 
-            SPARQLParser parser = new SPARQLParser();
-            ParsedQuery pq = parser.parseQuery(query, null);
-            List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
-            StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
+            final SPARQLParser parser = new SPARQLParser();
+            final ParsedQuery pq = parser.parseQuery(query, null);
+            final List<StatementPattern> spList = StatementPatternCollector.process(pq.getTupleExpr());
+            final StatementMetadataNode<MongoDBRdfConfiguration> node = new StatementMetadataNode<>(spList, conf);
 
-            List<BindingSet> bsCollection = new ArrayList<>();
-            QueryBindingSet bsConstraint1 = new QueryBindingSet();
+            final List<BindingSet> bsCollection = new ArrayList<>();
+            final QueryBindingSet bsConstraint1 = new QueryBindingSet();
             bsConstraint1.addBinding("x", VF.createLiteral("CoffeeShop"));
             bsConstraint1.addBinding("z", VF.createLiteral("Virginia"));
 
-            QueryBindingSet bsConstraint2 = new QueryBindingSet();
+            final QueryBindingSet bsConstraint2 = new QueryBindingSet();
             bsConstraint2.addBinding("x", VF.createLiteral("HardwareStore"));
             bsConstraint2.addBinding("z", VF.createLiteral("Maryland"));
 
-            QueryBindingSet bsConstraint3 = new QueryBindingSet();
+            final QueryBindingSet bsConstraint3 = new QueryBindingSet();
             bsConstraint3.addBinding("x", VF.createLiteral("BurgerShack"));
             bsConstraint3.addBinding("z", VF.createLiteral("Delaware"));
             bsCollection.add(bsConstraint1);
             bsCollection.add(bsConstraint2);
             bsCollection.add(bsConstraint3);
 
-            CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
+            final CloseableIteration<BindingSet, QueryEvaluationException> iteration = node.evaluate(bsCollection);
 
-            Set<BindingSet> expected = new HashSet<>();
-            QueryBindingSet expected1 = new QueryBindingSet();
+            final Set<BindingSet> expected = new HashSet<>();
+            final QueryBindingSet expected1 = new QueryBindingSet();
             expected1.addBinding("x", VF.createLiteral("CoffeeShop"));
             expected1.addBinding("y", VF.createLiteral("Joe"));
             expected1.addBinding("z", VF.createLiteral("Virginia"));
 
-            QueryBindingSet expected2 = new QueryBindingSet();
+            final QueryBindingSet expected2 = new QueryBindingSet();
             expected2.addBinding("x", VF.createLiteral("HardwareStore"));
             expected2.addBinding("y", VF.createLiteral("Joe"));
             expected2.addBinding("z", VF.createLiteral("Maryland"));
             expected.add(expected1);
             expected.add(expected2);
 
-            Set<BindingSet> bsSet = new HashSet<>();
+            final Set<BindingSet> bsSet = new HashSet<>();
             while (iteration.hasNext()) {
                 bsSet.add(iteration.next());
             }
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 7e0ff34..c72c6da 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
@@ -20,7 +20,7 @@
 
 import static org.junit.Assert.assertFalse;
 
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.Statement;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.repository.sail.SailRepository;
@@ -32,7 +32,7 @@
 /**
  * Tests {@link RyaSailFactory} with a MongoDB backend.
  */
-public class RyaMongoDbSailFactoryTest extends MongoITBase {
+public class RyaMongoDbSailFactoryTest extends MongoRyaITBase {
     @Test
     public void testCreateMongoDbSail() throws Exception {
         Sail sail = null;
diff --git a/extras/indexingExample/pom.xml b/extras/indexingExample/pom.xml
index abb03c3..ba69770 100644
--- a/extras/indexingExample/pom.xml
+++ b/extras/indexingExample/pom.xml
@@ -88,6 +88,10 @@
             <artifactId>rya.api</artifactId>
             <type>test-jar</type>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extras/indexingExample/src/main/java/InferenceExamples.java b/extras/indexingExample/src/main/java/InferenceExamples.java
index fa8fb21..96e4321 100644
--- a/extras/indexingExample/src/main/java/InferenceExamples.java
+++ b/extras/indexingExample/src/main/java/InferenceExamples.java
@@ -30,10 +30,10 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration.MongoDBIndexingConfigBuilder;
-import org.apache.rya.mongodb.EmbeddedMongoFactory;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.apache.rya.test.mongo.EmbeddedMongoFactory;
 import org.apache.zookeeper.ClientCnxn;
 import org.eclipse.rdf4j.model.vocabulary.OWL;
 import org.eclipse.rdf4j.model.vocabulary.RDFS;
diff --git a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
index cb38494..d4a8f8c 100644
--- a/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
+++ b/extras/indexingExample/src/main/java/MongoRyaDirectExample.java
@@ -34,10 +34,10 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration.MongoDBIndexingConfigBuilder;
-import org.apache.rya.mongodb.EmbeddedMongoFactory;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.inference.InferenceEngineException;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.apache.rya.test.mongo.EmbeddedMongoFactory;
 import org.apache.zookeeper.ClientCnxn;
 import org.eclipse.rdf4j.common.iteration.Iterations;
 import org.eclipse.rdf4j.model.IRI;
diff --git a/extras/rya.export/export.integration/pom.xml b/extras/rya.export/export.integration/pom.xml
index 73cda66..577a0bf 100644
--- a/extras/rya.export/export.integration/pom.xml
+++ b/extras/rya.export/export.integration/pom.xml
@@ -36,12 +36,10 @@
         <dependency>
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.api</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
             <artifactId>rya.export.api</artifactId>
-            <version>${project.version}</version>
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
@@ -55,5 +53,10 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
diff --git a/extras/rya.forwardchain/pom.xml b/extras/rya.forwardchain/pom.xml
index 2fdaf15..2b93186 100644
--- a/extras/rya.forwardchain/pom.xml
+++ b/extras/rya.forwardchain/pom.xml
@@ -57,6 +57,11 @@
             <artifactId>junit</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
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 72fb085..84080e5 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
@@ -32,9 +32,9 @@
 import org.apache.log4j.Logger;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration.MongoDBIndexingConfigBuilder;
-import org.apache.rya.mongodb.EmbeddedMongoFactory;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.sail.config.RyaSailFactory;
+import org.apache.rya.test.mongo.EmbeddedMongoFactory;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
 import org.eclipse.rdf4j.query.BindingSet;
diff --git a/extras/rya.geoindexing/geo.mongo/pom.xml b/extras/rya.geoindexing/geo.mongo/pom.xml
index 087207c..b33d57c 100644
--- a/extras/rya.geoindexing/geo.mongo/pom.xml
+++ b/extras/rya.geoindexing/geo.mongo/pom.xml
@@ -39,6 +39,10 @@
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
             <artifactId>mongodb.rya</artifactId>
         </dependency>
         <dependency>
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 bed432d..39ea3a8 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
@@ -29,7 +29,7 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration;
 import org.apache.rya.indexing.mongodb.MongoIndexingConfiguration.MongoDBIndexingConfigBuilder;
-import org.apache.rya.mongodb.EmbeddedMongoFactory;
+import org.apache.rya.test.mongo.EmbeddedMongoFactory;
 import org.eclipse.rdf4j.model.vocabulary.RDFS;
 import org.eclipse.rdf4j.query.BindingSet;
 import org.eclipse.rdf4j.query.QueryLanguage;
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 f49252a..d215c91 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
@@ -36,7 +36,7 @@
 import org.apache.rya.indexing.geotemporal.mongo.MongoGeoTemporalIndexer;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Value;
 import org.eclipse.rdf4j.model.ValueFactory;
@@ -50,7 +50,7 @@
 import org.eclipse.rdf4j.sail.Sail;
 import org.junit.Test;
 
-public class MongoGeoTemporalIndexIT extends MongoITBase {
+public class MongoGeoTemporalIndexIT extends MongoRyaITBase {
     private static final String URI_PROPERTY_AT_TIME = "Property:atTime";
 
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
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 e27b720..06c0ebc 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
@@ -38,7 +38,7 @@
 import org.apache.rya.indexing.TemporalInstantRfc3339;
 import org.apache.rya.indexing.geotemporal.mongo.MongoEventStorage;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Value;
diff --git a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoEventStorageIT.java b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoEventStorageIT.java
index a10f05e..3db973f 100644
--- a/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoEventStorageIT.java
+++ b/extras/rya.geoindexing/geo.mongo/src/test/java/org/apache/rya/indexing/geotemporal/mongo/MongoEventStorageIT.java
@@ -31,7 +31,7 @@
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage.EventAlreadyExistsException;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage.EventStorageException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.joda.time.DateTime;
 import org.junit.Test;
 
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 5136a32..eb62a33 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
@@ -31,21 +31,21 @@
 import org.apache.rya.indexing.TemporalInstant;
 import org.apache.rya.indexing.geotemporal.model.Event;
 import org.apache.rya.indexing.geotemporal.storage.EventStorage;
-import org.apache.rya.mongodb.MongoITBase;
-import org.junit.Before;
-import org.junit.Test;
-import org.eclipse.rdf4j.model.Resource;
+import org.apache.rya.mongodb.MongoRyaITBase;
 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.junit.Before;
+import org.junit.Test;
 
 import com.vividsolutions.jts.geom.Geometry;
 
 /**
  * Integration tests the methods of {@link MongoGeoTemporalIndexer}.
  */
-public class MongoGeoTemporalIndexerIT extends MongoITBase {
+public class MongoGeoTemporalIndexerIT extends MongoRyaITBase {
     private MongoGeoTemporalIndexer indexer;
 
     @Before
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 81e0682..bd451bc 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
@@ -31,7 +31,7 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Resource;
 import org.eclipse.rdf4j.model.Statement;
@@ -55,7 +55,7 @@
 import com.vividsolutions.jts.io.WKTReader;
 import com.vividsolutions.jts.io.WKTWriter;
 
-public class MongoGeoIndexerFilterIT extends MongoITBase {
+public class MongoGeoIndexerFilterIT extends MongoRyaITBase {
     private static final GeometryFactory GF = new GeometryFactory();
     private static final Geometry WASHINGTON_MONUMENT = GF.createPoint(new Coordinate(38.8895, 77.0353));
     private static final Geometry LINCOLN_MEMORIAL = GF.createPoint(new Coordinate(38.8893, 77.0502));
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 ff723f8..63d3bab 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
@@ -32,7 +32,7 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.indexing.mongodb.geo.MongoGeoIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Resource;
 import org.eclipse.rdf4j.model.Statement;
@@ -50,7 +50,7 @@
 import com.vividsolutions.jts.geom.PrecisionModel;
 import com.vividsolutions.jts.geom.impl.PackedCoordinateSequence;
 
-public class MongoGeoIndexerIT extends MongoITBase {
+public class MongoGeoIndexerIT extends MongoRyaITBase {
     private static final StatementConstraints EMPTY_CONSTRAINTS = new StatementConstraints();
     GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 4326);
 
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 c6efc69..6918fae 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
@@ -36,7 +36,7 @@
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.indexing.mongodb.geo.MongoGeoIndexer;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.common.iteration.CloseableIteration;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Resource;
@@ -57,7 +57,7 @@
 /**
  * Tests all of the "simple functions" of the geoindexer.
  */
-public class MongoGeoIndexerSfIT extends MongoITBase {
+public class MongoGeoIndexerSfIT extends MongoRyaITBase {
     private static final StatementConstraints EMPTY_CONSTRAINTS = new StatementConstraints();
 
     // Here is the landscape:
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 7f998b1..3352251 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
@@ -30,7 +30,7 @@
 import org.apache.rya.indexing.accumulo.ConfigUtils;
 import org.apache.rya.indexing.accumulo.geo.OptionalConfigUtils;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.eclipse.rdf4j.model.IRI;
 import org.eclipse.rdf4j.model.Resource;
 import org.eclipse.rdf4j.model.Statement;
@@ -52,7 +52,7 @@
 import com.vividsolutions.jts.geom.GeometryFactory;
 import com.vividsolutions.jts.io.WKTWriter;
 
-public class MongoIndexerDeleteIT extends MongoITBase {
+public class MongoIndexerDeleteIT extends MongoRyaITBase {
     @Override
     public void updateConfiguration(final MongoDBRdfConfiguration conf) {
         conf.setStrings(ConfigUtils.FREETEXT_PREDICATES_LIST, new String[] {RDFS.LABEL.stringValue()});
diff --git a/extras/rya.indexing.pcj/pom.xml b/extras/rya.indexing.pcj/pom.xml
index f40fb38..d92b04a 100644
--- a/extras/rya.indexing.pcj/pom.xml
+++ b/extras/rya.indexing.pcj/pom.xml
@@ -91,6 +91,11 @@
         </dependency>
         <dependency>
             <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
             <artifactId>rya.test.accumulo</artifactId>
             <scope>test</scope>
         </dependency>
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 0596daf..856b245 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
@@ -26,7 +26,7 @@
 import org.apache.rya.api.model.VisibilityBindingSet;
 import org.apache.rya.indexing.pcj.storage.PcjMetadata;
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.bson.Document;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -36,7 +36,7 @@
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
 
-public class MongoPcjDocumentsTest extends MongoITBase {
+public class MongoPcjDocumentsTest extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
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 d87f597..8a2bd17 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
@@ -43,7 +43,7 @@
 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.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.mongodb.instance.MongoRyaInstanceDetailsRepository;
 import org.eclipse.rdf4j.model.ValueFactory;
 import org.eclipse.rdf4j.model.impl.SimpleValueFactory;
@@ -60,7 +60,7 @@
  * These tests ensures that the PCJ tables are maintained and that these operations
  * also update the Rya instance's details.
  */
-public class MongoPcjStorageIT extends MongoITBase {
+public class MongoPcjStorageIT extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Test
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 e326339..46245d5 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
@@ -42,7 +42,7 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.VariableOrder;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
@@ -62,7 +62,7 @@
  * Performs integration test using {@link MiniAccumuloCluster} to ensure the
  * functions of {@link PcjTables} work within a cluster setting.
  */
-public class PcjDocumentsIntegrationTest extends MongoITBase {
+public class PcjDocumentsIntegrationTest extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
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 2666b85..d684388 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
@@ -30,7 +30,7 @@
 import org.apache.rya.indexing.pcj.storage.accumulo.PcjTableNameFactory;
 import org.apache.rya.mongodb.MongoDBRdfConfiguration;
 import org.apache.rya.mongodb.MongoDBRyaDAO;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.mongodb.MongoRyaITBase;
 import org.apache.rya.mongodb.StatefulMongoDBRdfConfiguration;
 import org.apache.rya.rdftriplestore.RdfCloudTripleStore;
 import org.apache.rya.rdftriplestore.RyaSailRepository;
@@ -40,7 +40,7 @@
 import org.eclipse.rdf4j.repository.sail.SailRepositoryConnection;
 import org.junit.Test;
 
-public class PcjDocumentsWithMockTest extends MongoITBase {
+public class PcjDocumentsWithMockTest extends MongoRyaITBase {
     private static final ValueFactory VF = SimpleValueFactory.getInstance();
 
     @Override
diff --git a/extras/shell/pom.xml b/extras/shell/pom.xml
index d650ab3..d2f92b9 100644
--- a/extras/shell/pom.xml
+++ b/extras/shell/pom.xml
@@ -103,6 +103,11 @@
             <artifactId>rya.test.accumulo</artifactId>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>org.apache.rya</groupId>
+            <artifactId>rya.test.mongo</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extras/shell/src/test/java/org/apache/rya/shell/MongoRyaShellIT.java b/extras/shell/src/test/java/org/apache/rya/shell/MongoRyaShellIT.java
index bf44db4..ab0fe01 100644
--- a/extras/shell/src/test/java/org/apache/rya/shell/MongoRyaShellIT.java
+++ b/extras/shell/src/test/java/org/apache/rya/shell/MongoRyaShellIT.java
@@ -21,30 +21,22 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
-import java.util.Optional;
 
 import org.apache.rya.api.client.Install.InstallConfiguration;
-import org.apache.rya.api.client.RyaClient;
-import org.apache.rya.api.client.mongo.MongoConnectionDetails;
-import org.apache.rya.api.client.mongo.MongoRyaClientFactory;
 import org.apache.rya.shell.SharedShellState.ConnectionState;
 import org.apache.rya.shell.SharedShellState.ShellState;
 import org.apache.rya.shell.util.ConsolePrinter;
 import org.apache.rya.shell.util.InstallPrompt;
 import org.apache.rya.shell.util.PasswordPrompt;
-import org.apache.rya.shell.util.SparqlPrompt;
 import org.junit.Test;
 import org.springframework.context.ApplicationContext;
 import org.springframework.shell.Bootstrap;
 import org.springframework.shell.core.CommandResult;
 import org.springframework.shell.core.JLineShellComponent;
 
-import com.mongodb.MongoClient;
-
 /**
  * Integration tests the functions of the Mongo Rya Shell.
  */
@@ -57,8 +49,8 @@
         // Connect to the Mongo instance.
         final String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort();
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort();
 
         final CommandResult connectResult = shell.executeCommand(cmd);
 
@@ -85,8 +77,8 @@
         // Connect to the Mongo instance.
         final String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort();
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort();
         shell.executeCommand(cmd);
 
         // Run the print connection details command.
@@ -95,8 +87,8 @@
 
         final String expected =
                 "The shell is connected to an instance of MongoDB using the following parameters:\n" +
-                "    Hostname: " + super.conf.getMongoHostname() + "\n" +
-                "    Port: " + super.conf.getMongoPort() + "\n";
+                "    Hostname: " + super.getMongoHostname() + "\n" +
+                "    Port: " + super.getMongoPort() + "\n";
         assertEquals(expected, msg);
     }
 
@@ -113,8 +105,8 @@
         // Connect to the Mongo instance.
         final String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort() + " " +
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort() + " " +
                         "--username bob";
         shell.executeCommand(cmd);
 
@@ -124,8 +116,8 @@
 
         final String expected =
                 "The shell is connected to an instance of MongoDB using the following parameters:\n" +
-                "    Hostname: " + super.conf.getMongoHostname() + "\n" +
-                "    Port: " + super.conf.getMongoPort() + "\n" +
+                "    Hostname: " + super.getMongoHostname() + "\n" +
+                "    Port: " + super.getMongoPort() + "\n" +
                 "    Username: bob\n";
         assertEquals(expected, msg);
     }
@@ -137,8 +129,8 @@
         // Connect to the Mongo instance.
         String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort();
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort();
         shell.executeCommand(cmd);
 
         // Try to connect to a non-existing instance.
@@ -155,8 +147,8 @@
         // Connect to the Mongo instance.
         String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort();
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort();
         shell.executeCommand(cmd);
 
         // Install an instance of rya.
@@ -190,8 +182,8 @@
         // Connect to the Mongo instance.
         final String cmd =
                 RyaConnectionCommands.CONNECT_MONGO_CMD + " " +
-                        "--hostname " + super.conf.getMongoHostname() + " " +
-                        "--port " + super.conf.getMongoPort();
+                        "--hostname " + super.getMongoHostname() + " " +
+                        "--port " + super.getMongoPort();
         shell.executeCommand(cmd);
 
         // Disconnect from it.
@@ -201,28 +193,6 @@
 
     // TODO the rest of them?
 
-
-    @Test
-    public void blah() throws Exception {
-        final MongoConnectionDetails details =
-                new MongoConnectionDetails(
-                        "localhost",
-                        27017,
-                        Optional.empty(),
-                        Optional.empty());
-        final RyaClient client = MongoRyaClientFactory.build(details, new MongoClient("localhost", 27017));
-        final SharedShellState state = new SharedShellState();
-        state.connectedToMongo(details, client);
-        state.connectedToInstance("rya_");
-        final ShellState shell = state.getShellState();
-        final SparqlPrompt sparqlPrompt = mock(SparqlPrompt.class);
-        when(sparqlPrompt.getSparql()).thenReturn(
-                com.google.common.base.Optional.<String>of("SELECT * WHERE { ?a ?b ?c }"));
-        final RyaCommands cmnds = new RyaCommands
-                (state, sparqlPrompt, systemPrinter);
-        cmnds.sparqlQuery(null);
-    }
-
     private static final ConsolePrinter systemPrinter = new ConsolePrinter() {
 
         @Override
diff --git a/extras/shell/src/test/java/org/apache/rya/shell/RyaShellMongoITBase.java b/extras/shell/src/test/java/org/apache/rya/shell/RyaShellMongoITBase.java
index 7e83dbf..6a0129e 100644
--- a/extras/shell/src/test/java/org/apache/rya/shell/RyaShellMongoITBase.java
+++ b/extras/shell/src/test/java/org/apache/rya/shell/RyaShellMongoITBase.java
@@ -22,7 +22,7 @@
 
 import org.apache.accumulo.core.client.AccumuloException;
 import org.apache.accumulo.core.client.AccumuloSecurityException;
-import org.apache.rya.mongodb.MongoITBase;
+import org.apache.rya.test.mongo.MongoITBase;
 import org.junit.After;
 import org.junit.Before;
 import org.springframework.shell.Bootstrap;
diff --git a/pom.xml b/pom.xml
index 932d443..699fccf 100644
--- a/pom.xml
+++ b/pom.xml
@@ -541,6 +541,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.rya</groupId>
+                <artifactId>rya.test.mongo</artifactId>
+                <version>${project.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.rya</groupId>
                 <artifactId>rya.test.rdf</artifactId>
                 <version>${project.version}</version>
             </dependency>
diff --git a/test/mongo/pom.xml b/test/mongo/pom.xml
new file mode 100644
index 0000000..bfd6318
--- /dev/null
+++ b/test/mongo/pom.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+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.
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <parent>
+        <groupId>org.apache.rya</groupId>
+        <artifactId>rya.test.parent</artifactId>
+        <version>4.0.0-incubating-SNAPSHOT</version>
+    </parent>
+    
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>rya.test.mongo</artifactId>
+    
+    <name>Apache Rya Test Mongo DB</name>
+    <description>
+        This module contains the Rya Test Mongo DB components that help write 
+        Mongo DB based integration tests.
+    </description>
+
+    <dependencies>
+        <!-- 3rd party dependencies. -->
+        <dependency>
+            <groupId>com.github.stephenc.findbugs</groupId>
+            <artifactId>findbugs-annotations</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.accumulo</groupId>
+            <artifactId>accumulo-core</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.mongodb</groupId>
+            <artifactId>mongo-java-driver</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>de.flapdoodle.embed</groupId>
+            <artifactId>de.flapdoodle.embed.mongo</artifactId>
+        </dependency>
+    
+        <!-- Testing dependencies. -->
+        <dependency>
+            <groupId>junit</groupId>
+            <artifactId>junit</artifactId>
+            <scope>compile</scope>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/EmbeddedMongoFactory.java b/test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoFactory.java
similarity index 98%
rename from dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/EmbeddedMongoFactory.java
rename to test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoFactory.java
index a2c25ed..7c4ab86 100644
--- a/dao/mongodb.rya/src/main/java/org/apache/rya/mongodb/EmbeddedMongoFactory.java
+++ b/test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoFactory.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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.rya.mongodb;
+package org.apache.rya.test.mongo;
 
 import java.io.IOException;
 import java.net.ServerSocket;
@@ -88,7 +88,6 @@
 
     /**
      * @return The process configuration.
-     *
      */
     public IMongodConfig getMongoServerDetails() {
         return mongodProcess.getConfig();
@@ -101,4 +100,4 @@
         mongodProcess.stop();
         mongodExecutable.stop();
     }
-}
+}
\ No newline at end of file
diff --git a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/EmbeddedMongoSingleton.java b/test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoSingleton.java
similarity index 98%
rename from dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/EmbeddedMongoSingleton.java
rename to test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoSingleton.java
index 837f926..e1e60dc 100644
--- a/dao/mongodb.rya/src/test/java/org/apache/rya/mongodb/EmbeddedMongoSingleton.java
+++ b/test/mongo/src/main/java/org/apache/rya/test/mongo/EmbeddedMongoSingleton.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
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.rya.mongodb;
+package org.apache.rya.test.mongo;
 
 import java.io.IOException;
 import java.net.UnknownHostException;
@@ -60,7 +60,7 @@
     public static IMongodConfig getMongodConfig() {
         return InstanceHolder.SINGLETON.mongodConfig;
     }
-    
+
     private EmbeddedMongoSingleton() {
         // hiding implicit default constructor
     }
diff --git a/test/mongo/src/main/java/org/apache/rya/test/mongo/MongoITBase.java b/test/mongo/src/main/java/org/apache/rya/test/mongo/MongoITBase.java
new file mode 100644
index 0000000..dbf43e9
--- /dev/null
+++ b/test/mongo/src/main/java/org/apache/rya/test/mongo/MongoITBase.java
@@ -0,0 +1,76 @@
+/**
+ * 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.test.mongo;
+
+import java.net.UnknownHostException;
+
+import org.junit.Before;
+
+import com.mongodb.MongoClient;
+
+/**
+ * A base class that may be used when implementing Mongo DB tests that use the
+ * JUnit framework.
+ */
+public class MongoITBase {
+
+    private MongoClient mongoClient = null;
+
+    @Before
+    public void setupTest() throws Exception {
+        mongoClient = EmbeddedMongoSingleton.getNewMongoClient();
+
+        // Remove any DBs that were created by previous tests.
+        for(final String dbName : mongoClient.listDatabaseNames()) {
+            mongoClient.dropDatabase(dbName);
+        }
+
+        // Let subclasses do more setup.
+        beforeTest();
+    }
+
+    /**
+     * Invoked before each test is run to allow tests to perform more setup.
+     */
+    protected void beforeTest() throws Exception {
+        // Does nothing by default.
+    }
+
+    /**
+     * @return A {@link MongoClient} that is connected to the embedded instance of Mongo DB.
+     */
+    public MongoClient getMongoClient() {
+        return mongoClient;
+    }
+
+    /**
+     * @return The embedded Mongo DB's hostname.
+     * @throws UnknownHostException The host couldn't be presented as a String.
+     */
+    public String getMongoHostname() throws UnknownHostException {
+        return EmbeddedMongoSingleton.getMongodConfig().net().getServerAddress().getHostAddress();
+    }
+
+    /**
+     * @return The embedded Mongo DB's port.
+     */
+    public int getMongoPort() {
+        return EmbeddedMongoSingleton.getMongodConfig().net().getPort();
+    }
+}
\ No newline at end of file
diff --git a/test/pom.xml b/test/pom.xml
index 2517f6a..91385c1 100644
--- a/test/pom.xml
+++ b/test/pom.xml
@@ -36,6 +36,7 @@
     <modules>
         <module>accumulo</module>
         <module>kafka</module>
+        <module>mongo</module>
         <module>rdf</module>
     </modules>
 </project>
