diff --git a/graphdb/pom.xml b/graphdb/pom.xml
index 426238c..cef77c9 100644
--- a/graphdb/pom.xml
+++ b/graphdb/pom.xml
@@ -31,17 +31,13 @@
     <name>Apache Atlas Graph Database Projects</name>
     <packaging>pom</packaging>
 
-
-
     <!-- Build all modules including all the possible graph providers although only one will be used -->
     <modules>
         <module>api</module>
         <module>common</module>
         <module>graphdb-impls</module>
         <module>titan0</module>
-        <module>titan1</module>
         <module>janus</module>
     </modules>
 
-
 </project>
diff --git a/graphdb/readme.txt b/graphdb/readme.txt
index 2ad7845..92edd00 100644
--- a/graphdb/readme.txt
+++ b/graphdb/readme.txt
@@ -2,30 +2,26 @@
 Building with a chosen graph database
 =====================================
 
-
-
 The Atlas build is currently set up to include one of the graph backends in the Atlas war file.
 The choice of graph backend is determined by the setting of the GRAPH-PROVIDER system variable.
 
-If GRAPH-PROVIDER is not set, the default graph backend is adopted. This is currently Titan 0.5.4.
+If GRAPH-PROVIDER is not set, the default graph backend is adopted. This is currently JanusGraph 0.2.0
 
 In order to build with a specific (non-default) graph backend set the GRAPH-PROVDER system variable.
 
-If GRAPH-PROVIDER is set to titan0, the build will contain Titan 0.5.4 (i.e. the default above)
-If GRAPH-PROVIDER is set to titan1, the build will contain Titan 1.0.0
-If GRAPH-PROVIDER is set to janus, the build will contain JanusGraph 0.1.1
+If GRAPH-PROVIDER is set to titan0, the build will contain Titan 0.5.4
+If GRAPH-PROVIDER is set to janus, the build will contain JanusGraph 0.2.0 (i.e. the default above)
 
 For example, to build Atlas with the janus graph-provider:
 mvn install [-P dist] -DGRAPH-PROVIDER=janus
 
 
-Titan 0.5.4 supports Gremlin2 only, whereas Titan 1.0.0 and JanusGraph support Gremlin3 only (and NOT Gremlin2).
+Titan 0.5.4 supports Gremlin2 only, whereas JanusGraph support Gremlin3 only (and NOT Gremlin2).
 Gremlin2 and Gremlin3 are not compatible. The gremlin used by Atlas is translated into either Gremlin2 or
 Gremlin3 depending on which graph backend is used in the build. This is implemented in GremlinExpressionFactory.
 
 
 REQUIREMENTS
 ------------
-
-Titan 1.0.0 and JanusGraph 0.1.1 require Java 8 to be used both when building and running Atlas.
+JanusGraph 0.2.0 require Java 8 to be used both when building and running Atlas.
 Unless Java 8 is used, the janus module will not be built - this is checked by the maven-enforcer-plugin.
diff --git a/graphdb/titan1/pom.xml b/graphdb/titan1/pom.xml
deleted file mode 100644
index b9483ba..0000000
--- a/graphdb/titan1/pom.xml
+++ /dev/null
@@ -1,308 +0,0 @@
-<?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">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <artifactId>atlas-graphdb</artifactId>
-        <groupId>org.apache.atlas</groupId>
-        <version>1.0.0-SNAPSHOT</version>
-    </parent>
-    <artifactId>atlas-graphdb-titan1</artifactId>
-    <description>Apache Atlas Titan 1.0.0 Graph DB Impl</description>
-    <name>Apache Atlas Titan 1.0.0 GraphDB Impl</name>
-    <packaging>jar</packaging>
-
-    <properties>
-        <tinkerpop.version>3.0.1-incubating</tinkerpop.version>
-        <titan.version>1.0.0</titan.version>
-        <checkstyle.failOnViolation>false</checkstyle.failOnViolation>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.atlas</groupId>
-            <artifactId>atlas-graphdb-common</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.atlas</groupId>
-            <artifactId>atlas-graphdb-api</artifactId>
-            <!-- set scope to provided to prevent the this from being included in the shared jar -->
-            <scope>provided</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>commons-configuration</groupId>
-            <artifactId>commons-configuration</artifactId>
-            <scope>provided</scope>
-        </dependency>
-
-        <!-- https://mvnrepository.com/artifact/com.thinkaurelius.titan/titan-hbase -->
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-hbase</artifactId>
-            <version>${titan.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-core</artifactId>
-            <version>${titan.version}</version>
-            <exclusions>
-                <!-- rexster does not work with servlet-api -->
-                <exclusion>
-                    <groupId>com.tinkerpop.rexster</groupId>
-                    <artifactId>rexster-core</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.tinkerpop.rexster</groupId>
-                    <artifactId>rexster-server</artifactId>
-                </exclusion>
-                <!-- asm 4.0 does not work with jersey asm 3.1 -->
-                <exclusion>
-                    <groupId>com.tinkerpop</groupId>
-                    <artifactId>frames</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.esotericsoftware.reflectasm</groupId>
-                    <artifactId>reflectasm</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.ow2.asm</groupId>
-                    <artifactId>asm</artifactId>
-                </exclusion>
-                <exclusion> <!-- GPL license imported from ganglia -->
-                    <groupId>org.acplt</groupId>
-                    <artifactId>oncrpc</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-solr</artifactId>
-            <version>${titan.version}</version>
-            <!-- this conflicts with the servlet api version that Atlas needs -->
-            <exclusions>
-                <exclusion>
-                    <groupId>javax.servlet</groupId>
-                    <artifactId>servlet-api</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>org.apache.solr</groupId>
-                    <artifactId>solr-core</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.hbase</groupId>
-            <artifactId>hbase-client</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.solr</groupId>
-            <artifactId>solr-core</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.solr</groupId>
-            <artifactId>solr-solrj</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-es</artifactId>
-            <version>${titan.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-berkeleyje</artifactId>
-            <version>${titan.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>com.thinkaurelius.titan</groupId>
-            <artifactId>titan-lucene</artifactId>
-            <version>${titan.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.solr</groupId>
-            <artifactId>solr-solrj</artifactId>
-            <version>${solr.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.solr</groupId>
-            <artifactId>solr-core</artifactId>
-            <version>${solr.version}</version>
-            <exclusions>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.eclipse.jetty</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.eclipse.jetty.orbit</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.restlet.jee</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.ow2.asm</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.apache.lucene</groupId>
-                </exclusion>
-                <exclusion>
-                    <artifactId>*</artifactId>
-                    <groupId>org.apache.hadoop</groupId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-
-        <dependency>
-            <groupId>org.testng</groupId>
-            <artifactId>testng</artifactId>
-        </dependency>
-
-        <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-all</artifactId>
-        </dependency>
-
-        <!-- titan 1 requires guava 18.0 -->
-        <dependency>
-            <groupId>com.google.guava</groupId>
-            <artifactId>guava</artifactId>
-            <version>18.0</version>
-        </dependency>
-
-        <!-- Graph DB -->
-        <dependency>
-            <groupId>org.apache.tinkerpop</groupId>
-            <artifactId>gremlin-core</artifactId>
-            <version>${tinkerpop.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.tinkerpop</groupId>
-            <artifactId>tinkergraph-gremlin</artifactId>
-            <version>${tinkerpop.version}</version>
-        </dependency>
-
-        <!-- Test dependencies -->
-
-        <dependency>
-            <groupId>org.apache.atlas</groupId>
-            <artifactId>atlas-graphdb-common</artifactId>
-            <version>${project.version}</version>
-            <classifier>tests</classifier>
-            <scope>test</scope>
-        </dependency>
-
-    </dependencies>
-
-    <build>
-        <plugins>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <version>1.4.1</version>
-                <executions>
-                    <execution>
-                        <id>enforce-java-8</id>
-                        <goals>
-                            <goal>enforce</goal>
-                        </goals>
-                        <configuration>
-                            <rules>
-                                <requireJavaVersion>
-                                    <version>1.8.0</version>
-                                </requireJavaVersion>
-                                <requireMavenVersion>
-                                    <version>3.1.0</version>
-                                </requireMavenVersion>
-                            </rules>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <version>${surefire.version}</version>
-                <configuration>
-                    <skip>true</skip>
-                </configuration>
-            </plugin>
-
-            <!--
-                 Create 'uber' jar that contains all of the dependencies (except those whose scope is provided)
-                 Only titan 1 and its dependencies are included.  The other dependencies are bundled in the war file.
-                 We also relocate the Google guava packages to avoid conflicts with Atlas code which depends on Guava 14
-            -->
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-shade-plugin</artifactId>
-                <version>2.4.3</version>
-                <executions>
-                    <execution>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>shade</goal>
-                        </goals>
-                        <configuration>
-                            <shadedArtifactAttached>false</shadedArtifactAttached>
-                            <artifactSet>
-                                <excludes>
-                                    <!-- these are bundled with Atlas -->
-                                    <exclude>org.slf4j:*</exclude>
-                                </excludes>
-                            </artifactSet>
-                            <relocations>
-                                <relocation>
-                                    <pattern>com.google.common</pattern>
-                                    <shadedPattern>org.apache.atlas.shaded.com.google.common</shadedPattern>
-                                </relocation>
-                            </relocations>
-                            <!-- disable generation of sources jar due to clash with maven-source-plugin -->
-                            <!-- <createSourcesJar>true</createSourcesJar> -->
-                            <transformers>
-                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" />
-                            </transformers>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-
-        </plugins>
-    </build>
-
-</project>
diff --git a/graphdb/titan1/readme.txt b/graphdb/titan1/readme.txt
deleted file mode 100644
index 4fcddba..0000000
--- a/graphdb/titan1/readme.txt
+++ /dev/null
@@ -1,87 +0,0 @@
-==================
-Titan 1.0.0 README
-==================
-
-IMPORTANT: Titan 1 support in Atlas is currently a work in progress.
-
-
-ARCHITECTURE NOTES
-------------------
-
-The build is currently set up to include only one of the graph backends in the Atlas war file. The configured graph
-backend is determined by maven profile. The default profile is titan0. To build Atlas configured to run against Titan 1,
-the titan1 profile must be enabled. Titan1 project has support for Gremlin3.  Gremlin Translator translates the DSL to
-gremlin3 compliant syntax when titan1 is configured as backend graph db.
-
-
-REQUIREMENTS
---------------
-
-Titan 1 requires Java 8 to be used both when building and running Atlas. While building on Java7,  the java classes in
-the Titan 1 project are not compiled. But an empty jar is produced. If java 8 is used, then titan 1 classes are compiled
-but tests are only executed if titan1 profile is explicitly enabled.
-
-
-
-USING ATLAS WITH TITAN 1
-------------------------
-
-1) Build Atlas with the titan1 maven profile enabled:
-
-mvn install -P dist -P titan1
-
-Note that there are some tests in repository and webapp project which are skipped when running with the titan1 profile.
-Please refer to known issues section below.
-
-This will build Atlas and run all of the tests against Titan 1.  Only Atlas builds that were generated with the titan1
-maven profile enabled can be used to use Atlas with Titan 1.
-
-2) Configure the Atlas runtime to use Titan 1 by setting the atlas.graphdb.backend property in
-ATLAS_HOME/conf/atlas-application.properties, as follows:
-
-atlas.graphdb.backend=org.apache.atlas.repository.graphdb.titan1.Titan1GraphDatabase
-
-3) Attempt to start the Atlas server.  NOTE: As of this writing, Atlas fails to start (see issue 2 below).
-
-
-KNOWN ISSUES
-------------
-
-1) EntityLineageService is hard-coded to generate Gremlin that is specific to Tinker Pop 2.  It needs to be updated to
-use GremlinExpressionFactory to generate Gremlin that is appropriate for the version of Titan being used. Currently
-these tests are skipped when the titan1 profile is enabled.
-
-https://issues.apache.org/jira/browse/ATLAS-1579
-
-2) Catalog project is hard-coded to generate Gremlin that is specific to Tinker Pop 2.  It needs to be updated to use
-GremlinExpressionFactory to generate Gremlin that is appropriate for the version of Titan being used.  In addition, it
-has direct dependencies on titan 0 / Tinker Pop 2 classes.
-
-https://issues.apache.org/jira/browse/ATLAS-1580
-
-3) The Atlas war file startup is currently failing when Titan1 is being used.  Due to the titan 0 dependencies in
-catalog, the catalog jar is currently being excluded from webapp when titan1 is being used.  However, Atlas appears to
-have runtime dependencies on the stuff in Catalog.  The war startup currently fails with the following exception:
-
-Caused by: java.lang.ClassNotFoundException: org.apache.atlas.catalog.exception.CatalogException
-        at org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)
-        at org.codehaus.plexus.classworlds.realm.ClassRealm.unsynchronizedLoadClass(ClassRealm.java:271)
-
-https://issues.apache.org/jira/browse/ATLAS-1581
-
-4) There are some known test failures in webapp project. Those need to be addressed. There is work needed to refactor
-webapp so that it can function without catalog until issue #2 above is resolved.
-
-https://issues.apache.org/jira/browse/ATLAS-1582
-
-5) We cannot bundle both titan0 and titan1 in the Atlas war file because titan1 and titan0 require different versions of
-the same libraries.  We cannot have multiple versions of the same library on the classpath.  Another issue there is that
-Gremin queries are executed via the java services mechanism.  Specifically, the titan 1 implemention bundles a file
-called javax.script.ScriptingEngineFactory, which tells Java to
-use org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngineFactory.  We cannot have this file on the
-classpath when using titan 0 since it would cause the Titan 0 implemention to try to execute queries using TP 3.  There
-may be ways of working around this, such as making Titan1Graph and Titan0Graph explicitly instantiate the
-GremlinGroovyScriptEngineFactory.  This was not investigated very much, though.  If we combine that with shading
-Titan0/1 and all of their dependencies, we might be able to bundle both the Titan 1 and Titan 0 implementations in the
-Atlas war file and have things work correctly for both versions.  Another possibility would be to use a custom
-classloader to load the correct atlas-graphdb-titan0/1 jar during Atlas startup based on the configuration.
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/GraphDbObjectFactory.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/GraphDbObjectFactory.java
deleted file mode 100644
index 7928a84..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/GraphDbObjectFactory.java
+++ /dev/null
@@ -1,130 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import com.thinkaurelius.titan.core.EdgeLabel;
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasGraphIndex;
-import org.apache.atlas.repository.graphdb.titan1.query.Titan1GraphQuery;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import com.thinkaurelius.titan.core.Cardinality;
-import com.thinkaurelius.titan.core.PropertyKey;
-import com.thinkaurelius.titan.core.schema.TitanGraphIndex;
-
-
-/**
- * Factory that serves up instances of graph database abstraction layer classes
- * that correspond to Titan/Tinkerpop3 classes.
- */
-public final class GraphDbObjectFactory {
-
-    private GraphDbObjectFactory() {
-
-    }
-
-    /**
-     * Creates a Titan1Edge that corresponds to the given Gremlin Edge.
-     *
-     * @param graph The graph the edge should be created in
-     * @param source The gremlin edge
-     */
-    public static Titan1Edge createEdge(Titan1Graph graph, Edge source) {
-
-        if (source == null) {
-            return null;
-        }
-        return new Titan1Edge(graph, source);
-    }
-
-    /**
-     * Creates a Titan1GraphQuery that corresponds to the given GraphQuery.
-     *
-     * @param graph the graph that is being quried
-     */
-    public static Titan1GraphQuery createQuery(Titan1Graph graph, boolean isChildQuery) {
-
-        return new Titan1GraphQuery(graph, isChildQuery);
-    }
-
-    /**
-     * Creates a Titan1Vertex that corresponds to the given Gremlin Vertex.
-     *
-     * @param graph The graph that contains the vertex
-     * @param source the Gremlin vertex
-     */
-    public static Titan1Vertex createVertex(Titan1Graph graph, Vertex source) {
-
-        if (source == null) {
-            return null;
-        }
-        return new Titan1Vertex(graph, source);
-    }
-
-    /**
-     * @param propertyKey The Gremlin propertyKey.
-     *
-     */
-    public static Titan1PropertyKey createPropertyKey(PropertyKey propertyKey) {
-        if (propertyKey == null) {
-            return null;
-        }
-        return new Titan1PropertyKey(propertyKey);
-    }
-
-    /**
-     * @param label The Gremlin propertyKey.
-     *
-     */
-    public static Titan1EdgeLabel createEdgeLabel(EdgeLabel label) {
-        if (label == null) {
-            return null;
-        }
-        return new Titan1EdgeLabel(label);
-    }
-
-    /**
-     * @param index The gremlin index.
-     * @return
-     */
-    public static AtlasGraphIndex createGraphIndex(TitanGraphIndex index) {
-        if (index == null) {
-            return null;
-        }
-        return new Titan1GraphIndex(index);
-    }
-
-    /**
-     * Converts a Multiplicity to a Cardinality.
-     *
-     * @param cardinality
-     * @return
-     */
-    public static AtlasCardinality createCardinality(Cardinality cardinality) {
-
-        if (cardinality == Cardinality.SINGLE) {
-            return AtlasCardinality.SINGLE;
-        } else if (cardinality == Cardinality.LIST) {
-            return AtlasCardinality.LIST;
-        }
-        return AtlasCardinality.SET;
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Edge.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Edge.java
deleted file mode 100644
index bcc009b..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Edge.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-
-/**
- * Titan 1.0.0 implementation of AtlasEdge.
- */
-public class Titan1Edge extends Titan1Element<Edge> implements AtlasEdge<Titan1Vertex, Titan1Edge> {
-
-
-    public Titan1Edge(Titan1Graph graph, Edge edge) {
-        super(graph, edge);
-    }
-
-    @Override
-    public String getLabel() {
-        return getWrappedElement().label();
-    }
-
-    @Override
-    public Titan1Edge getE() {
-
-        return this;
-    }
-
-    @Override
-    public AtlasVertex<Titan1Vertex, Titan1Edge> getInVertex() {
-        return GraphDbObjectFactory.createVertex(graph, getWrappedElement().inVertex());
-    }
-
-    @Override
-    public AtlasVertex<Titan1Vertex, Titan1Edge> getOutVertex() {
-        return GraphDbObjectFactory.createVertex(graph, getWrappedElement().outVertex());
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1EdgeLabel.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1EdgeLabel.java
deleted file mode 100644
index fdcc33d..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1EdgeLabel.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import com.thinkaurelius.titan.core.EdgeLabel;
-import org.apache.atlas.repository.graphdb.AtlasEdgeLabel;
-
-/**
- *
- */
-public class Titan1EdgeLabel implements AtlasEdgeLabel {
-
-    private final EdgeLabel wrapped;
-
-    public Titan1EdgeLabel(EdgeLabel toWrap) {
-        wrapped = toWrap;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.atlas.repository.graphdb.AtlasPropertyKey#getName()
-     */
-    @Override
-    public String getName() {
-        return wrapped.name();
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 37*result + wrapped.hashCode();
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Titan1EdgeLabel)) {
-            return false;
-        }
-        Titan1EdgeLabel otherKey = (Titan1EdgeLabel)other;
-        return otherKey.wrapped.equals(wrapped);
-
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Element.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Element.java
deleted file mode 100644
index b1cd458..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Element.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasElement;
-import org.apache.atlas.repository.graphdb.AtlasSchemaViolationException;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.titan1.graphson.AtlasGraphSONMode;
-import org.apache.atlas.repository.graphdb.titan1.graphson.AtlasGraphSONUtility;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Lists;
-import com.thinkaurelius.titan.core.SchemaViolationException;
-import com.thinkaurelius.titan.core.TitanElement;
-
-/**
- * Titan 1.0.0 implementation of AtlasElement.
- *
- * @param <T> the implementation class of the wrapped Titan 1 element
- * that is stored.
- */
-public class Titan1Element<T extends Element> implements AtlasElement {
-
-    private T element;
-    protected Titan1Graph graph;
-
-    public Titan1Element(Titan1Graph graph, T element) {
-        this.element = element;
-        this.graph = graph;
-    }
-
-    @Override
-    public <T> T getProperty(String propertyName, Class<T> clazz) {
-
-        //add explicit logic to return null if the property does not exist
-        //This is the behavior Atlas expects.  Titan 1 throws an exception
-        //in this scenario.
-        Property p = getWrappedElement().property(propertyName);
-        if (p.isPresent()) {
-            Object propertyValue= p.value();
-            if (propertyValue == null) {
-                return null;
-            }
-            if (AtlasEdge.class == clazz) {
-                return (T)graph.getEdge(propertyValue.toString());
-            }
-            if (AtlasVertex.class == clazz) {
-                return (T)graph.getVertex(propertyValue.toString());
-            }
-            return (T)propertyValue;
-
-        }
-        return null;
-    }
-
-
-
-    /**
-     * Gets all of the values of the given property.
-     * @param propertyName
-     * @return
-     */
-    @Override
-    public <T> Collection<T> getPropertyValues(String propertyName, Class<T> type) {
-        return Collections.singleton(getProperty(propertyName, type));
-    }
-
-    @Override
-    public Set<String> getPropertyKeys() {
-        return getWrappedElement().keys();
-    }
-
-    @Override
-    public void removeProperty(String propertyName) {
-        Iterator<? extends Property<String>> it = getWrappedElement().properties(propertyName);
-        while(it.hasNext()) {
-            Property<String> property = it.next();
-            property.remove();
-        }
-    }
-
-    @Override
-    public void setProperty(String propertyName, Object value) {
-        try {
-            getWrappedElement().property(propertyName, value);
-        } catch(SchemaViolationException e) {
-            throw new AtlasSchemaViolationException(e);
-        }
-    }
-
-    @Override
-    public Object getId() {
-        return element.id();
-    }
-
-    @Override
-    public T getWrappedElement() {
-        return element;
-    }
-
-
-    @Override
-    public JSONObject toJson(Set<String> propertyKeys) throws JSONException {
-
-        return AtlasGraphSONUtility.jsonFromElement(this, propertyKeys, AtlasGraphSONMode.NORMAL);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 37;
-        result = 17*result + getClass().hashCode();
-        result = 17*result + getWrappedElement().hashCode();
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-
-        if (other == null) {
-            return false;
-        }
-
-        if (other.getClass() != getClass()) {
-            return false;
-        }
-        Titan1Element otherElement = (Titan1Element) other;
-        return getWrappedElement().equals(otherElement.getWrappedElement());
-    }
-
-    @Override
-    public List<String> getListProperty(String propertyName) {
-        List<String> value =  getProperty(propertyName, List.class);
-        if (value == null) {
-            return Collections.emptyList();
-        }
-        return value;
-    }
-
-    @Override
-    public void setListProperty(String propertyName, List<String> values) {
-        setProperty(propertyName, values);
-
-    }
-
-    @Override
-    public boolean exists() {
-        try {
-            return !((TitanElement)element).isRemoved();
-        } catch(IllegalStateException e) {
-            return false;
-        }
-
-    }
-
-    @Override
-    public <T> void setJsonProperty(String propertyName, T value) {
-        setProperty(propertyName, value);
-    }
-
-    @Override
-    public <T> T getJsonProperty(String propertyName) {
-        return (T)getProperty(propertyName, String.class);
-    }
-
-    @Override
-    public String getIdForDisplay() {
-        return getId().toString();
-    }
-
-
-    @Override
-    public <V> List<V> getListProperty(String propertyName, Class<V> elementType) {
-
-        List<String> value = getListProperty(propertyName);
-
-        if (value.isEmpty()) {
-            return (List<V>)value;
-        }
-
-        if (AtlasEdge.class.isAssignableFrom(elementType)) {
-
-
-            return (List<V>)Lists.transform(value, new Function<String, AtlasEdge>(){
-
-                @Override
-                public AtlasEdge apply(String input) {
-                    return graph.getEdge(input);
-                }
-            });
-        }
-
-        if (AtlasVertex.class.isAssignableFrom(elementType)) {
-
-            return (List<V>)Lists.transform(value, new Function<String, AtlasVertex>(){
-
-                @Override
-                public AtlasVertex apply(String input) {
-                    return graph.getVertex(input);
-                }
-            });
-        }
-
-        return (List<V>)value;
-    }
-
-
-    @Override
-    public void setPropertyFromElementsIds(String propertyName, List<AtlasElement> values) {
-        List<String> propertyValue = new ArrayList<>(values.size());
-        for(AtlasElement value: values) {
-            propertyValue.add(value.getId().toString());
-        }
-        setProperty(propertyName, propertyValue);
-    }
-
-
-    @Override
-    public void setPropertyFromElementId(String propertyName, AtlasElement value) {
-        setProperty(propertyName, value.getId().toString());
-
-    }
-
-
-    @Override
-    public boolean isIdAssigned() {
-        return true;
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Graph.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Graph.java
deleted file mode 100644
index d94289d..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Graph.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.thinkaurelius.titan.core.Cardinality;
-import com.thinkaurelius.titan.core.PropertyKey;
-import com.thinkaurelius.titan.core.SchemaViolationException;
-import com.thinkaurelius.titan.core.TitanGraph;
-import com.thinkaurelius.titan.core.TitanIndexQuery;
-import com.thinkaurelius.titan.core.schema.TitanGraphIndex;
-import com.thinkaurelius.titan.core.schema.TitanManagement;
-import com.thinkaurelius.titan.core.util.TitanCleanup;
-import org.apache.atlas.AtlasErrorCode;
-import org.apache.atlas.exception.AtlasBaseException;
-import org.apache.atlas.groovy.GroovyExpression;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
-import org.apache.atlas.repository.graphdb.AtlasIndexQuery;
-import org.apache.atlas.repository.graphdb.AtlasSchemaViolationException;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.GremlinVersion;
-import org.apache.atlas.repository.graphdb.titan1.query.Titan1GraphQuery;
-import org.apache.atlas.repository.graphdb.utils.IteratorToIterableAdapter;
-import org.apache.atlas.type.AtlasType;
-import org.apache.tinkerpop.gremlin.groovy.CompilerCustomizerProvider;
-import org.apache.tinkerpop.gremlin.groovy.DefaultImportCustomizerProvider;
-import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.io.IoCore;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter;
-
-import javax.script.Bindings;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Titan 1.0.0 implementation of AtlasGraph.
- */
-public class Titan1Graph implements AtlasGraph<Titan1Vertex, Titan1Edge> {
-
-    private final ConvertGremlinValueFunction GREMLIN_VALUE_CONVERSION_FUNCTION = new ConvertGremlinValueFunction();
-
-    private final class ConvertGremlinValueFunction implements Function<Object, Object> {
-        @Override
-        public Object apply(Object input) {
-            return convertGremlinValue(input);
-        }
-    }
-
-    private final Set<String> multiProperties;
-
-    public Titan1Graph() {
-        //determine multi-properties once at startup
-        TitanManagement mgmt = null;
-        try {
-            mgmt = Titan1GraphDatabase.getGraphInstance().openManagement();
-            Iterable<PropertyKey> keys = mgmt.getRelationTypes(PropertyKey.class);
-            multiProperties = new HashSet<>();
-            for (PropertyKey key : keys) {
-                if (key.cardinality() != Cardinality.SINGLE) {
-                    multiProperties.add(key.name());
-                }
-            }
-        } finally {
-            if (mgmt != null) {
-                mgmt.rollback();
-            }
-        }
-    }
-
-    @Override
-    public AtlasEdge<Titan1Vertex, Titan1Edge> addEdge(AtlasVertex<Titan1Vertex, Titan1Edge> outVertex,
-                                                       AtlasVertex<Titan1Vertex, Titan1Edge> inVertex,
-                                                       String edgeLabel) {
-
-        try {
-            Vertex oV = outVertex.getV().getWrappedElement();
-            Vertex iV = inVertex.getV().getWrappedElement();
-            Edge edge = oV.addEdge(edgeLabel, iV);
-            return GraphDbObjectFactory.createEdge(this, edge);
-        } catch (SchemaViolationException e) {
-            throw new AtlasSchemaViolationException(e);
-        }
-    }
-
-    @Override
-    public AtlasGraphQuery<Titan1Vertex, Titan1Edge> query() {
-        return new Titan1GraphQuery(this);
-    }
-
-    @Override
-    public AtlasEdge<Titan1Vertex, Titan1Edge> getEdge(String edgeId) {
-        Iterator<Edge> it = getGraph().edges(edgeId);
-        Edge e = getSingleElement(it, edgeId);
-        return GraphDbObjectFactory.createEdge(this, e);
-    }
-
-    @Override
-    public void removeEdge(AtlasEdge<Titan1Vertex, Titan1Edge> edge) {
-
-        Edge wrapped = edge.getE().getWrappedElement();
-        wrapped.remove();
-
-    }
-
-    @Override
-    public void removeVertex(AtlasVertex<Titan1Vertex, Titan1Edge> vertex) {
-        Vertex wrapped = vertex.getV().getWrappedElement();
-        wrapped.remove();
-    }
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> getEdges() {
-
-        Iterator<Edge> edges = getGraph().edges();
-        return wrapEdges(edges);
-
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> getVertices() {
-
-        Iterator<Vertex> vertices = getGraph().vertices();
-        return wrapVertices(vertices);
-    }
-
-    @Override
-    public AtlasVertex<Titan1Vertex, Titan1Edge> addVertex() {
-        Vertex result = getGraph().addVertex();
-        return GraphDbObjectFactory.createVertex(this, result);
-    }
-
-    @Override
-    public void commit() {
-        getGraph().tx().commit();
-    }
-
-    @Override
-    public void rollback() {
-        getGraph().tx().rollback();
-    }
-
-    @Override
-    public AtlasIndexQuery<Titan1Vertex, Titan1Edge> indexQuery(String fulltextIndex, String graphQuery) {
-        return indexQuery(fulltextIndex, graphQuery, 0);
-    }
-
-    @Override
-    public AtlasIndexQuery<Titan1Vertex, Titan1Edge> indexQuery(String fulltextIndex, String graphQuery, int offset) {
-        TitanIndexQuery query = getGraph().indexQuery(fulltextIndex, graphQuery).offset(offset);
-        return new Titan1IndexQuery(this, query);
-    }
-
-    @Override
-    public AtlasGraphManagement getManagementSystem() {
-        return new Titan1GraphManagement(this, getGraph().openManagement());
-    }
-
-    @Override
-    public void shutdown() {
-        getGraph().close();
-    }
-
-    @Override
-    public Set<String> getEdgeIndexKeys() {
-        return getIndexKeys(Edge.class);
-    }
-
-    @Override
-    public Set<String> getVertexIndexKeys() {
-        return getIndexKeys(Vertex.class);
-    }
-
-    private Set<String> getIndexKeys(Class<? extends Element> titanElementClass) {
-
-        TitanManagement mgmt = getGraph().openManagement();
-        Iterable<TitanGraphIndex> indices = mgmt.getGraphIndexes(titanElementClass);
-        Set<String> result = new HashSet<String>();
-        for (TitanGraphIndex index : indices) {
-            result.add(index.name());
-        }
-        mgmt.commit();
-        return result;
-
-    }
-
-    @Override
-    public AtlasVertex<Titan1Vertex, Titan1Edge> getVertex(String vertexId) {
-        Iterator<Vertex> it = getGraph().vertices(vertexId);
-        Vertex vertex = getSingleElement(it, vertexId);
-        return GraphDbObjectFactory.createVertex(this, vertex);
-    }
-
-    public static <T> T getSingleElement(Iterator<T> it, String id) {
-        if (!it.hasNext()) {
-            return null;
-        }
-        T element = it.next();
-        if (it.hasNext()) {
-            throw new RuntimeException("Multiple items were found with the id " + id);
-        }
-        return element;
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> getVertices(String key, Object value) {
-        AtlasGraphQuery<Titan1Vertex, Titan1Edge> query = query();
-        query.has(key, value);
-        return query.vertices();
-    }
-
-    private Object convertGremlinValue(Object rawValue) {
-
-        if (rawValue instanceof Vertex) {
-            return GraphDbObjectFactory.createVertex(this, (Vertex) rawValue);
-        } else if (rawValue instanceof Edge) {
-            return GraphDbObjectFactory.createEdge(this, (Edge) rawValue);
-        } else if (rawValue instanceof Map) {
-            Map<String,Object> rowValue = (Map<String,Object>)rawValue;
-            return Maps.transformValues(rowValue, GREMLIN_VALUE_CONVERSION_FUNCTION);
-        } else if (rawValue instanceof ImmutablePath) {
-            ImmutablePath path = (ImmutablePath) rawValue;
-            return convertGremlinValue(path.objects());
-        }
-        else if (rawValue instanceof List) {
-            return Lists.transform((List)rawValue, GREMLIN_VALUE_CONVERSION_FUNCTION);
-        } else if (rawValue instanceof Collection) {
-            throw new UnsupportedOperationException("Unhandled collection type: " + rawValue.getClass());
-        }
-        return rawValue;
-    }
-
-    @Override
-    public GremlinVersion getSupportedGremlinVersion() {
-
-        return GremlinVersion.THREE;
-    }
-    @Override
-    public void clear() {
-        TitanGraph graph = getGraph();
-        if (graph.isOpen()) {
-            // only a shut down graph can be cleared
-            graph.close();
-        }
-        TitanCleanup.clear(graph);
-    }
-
-    private TitanGraph getGraph() {
-        return Titan1GraphDatabase.getGraphInstance();
-    }
-
-    @Override
-    public void exportToGson(OutputStream os) throws IOException {
-
-        GraphSONMapper mapper = getGraph().io(IoCore.graphson()).mapper().create();
-        GraphSONWriter.Builder builder = GraphSONWriter.build();
-        builder.mapper(mapper);
-        GraphSONWriter writer = builder.create();
-        writer.writeGraph(os, getGraph());
-    }
-
-    @Override
-    public GremlinGroovyScriptEngine getGremlinScriptEngine() {
-        Set<String> extraImports = new HashSet<String>();
-        extraImports.add(java.util.function.Function.class.getName());
-
-        Set<String> extraStaticImports = new HashSet<String>();
-        extraStaticImports.add(P.class.getName() + ".*");
-        extraStaticImports.add(__.class.getName() + ".*");
-        CompilerCustomizerProvider provider = new DefaultImportCustomizerProvider(extraImports, extraStaticImports);
-
-        GremlinGroovyScriptEngine scriptEngine = new GremlinGroovyScriptEngine(provider);
-
-        return scriptEngine;
-    }
-
-    @Override
-    public void releaseGremlinScriptEngine(ScriptEngine scriptEngine) {
-        if (scriptEngine instanceof GremlinGroovyScriptEngine) {
-            try {
-                ((GremlinGroovyScriptEngine)scriptEngine).close();
-            } catch (Exception e) {
-                // ignore
-            }
-        }
-    }
-
-    @Override
-    public Object executeGremlinScript(String query, boolean isPath) throws AtlasBaseException {
-        Object result = executeGremlinScript(query);
-        return convertGremlinValue(result);
-    }
-
-    private Object executeGremlinScript(String gremlinQuery) throws AtlasBaseException {
-        GremlinGroovyScriptEngine scriptEngine = getGremlinScriptEngine();
-
-        try {
-            Bindings bindings = scriptEngine.createBindings();
-
-            bindings.put("graph", getGraph());
-            bindings.put("g", getGraph().traversal());
-
-            Object result = scriptEngine.eval(gremlinQuery, bindings);
-
-            return result;
-        } catch (ScriptException e) {
-            throw new AtlasBaseException(AtlasErrorCode.GREMLIN_SCRIPT_EXECUTION_FAILED, gremlinQuery);
-        } finally {
-            releaseGremlinScriptEngine(scriptEngine);
-        }
-    }
-
-    @Override
-    public Object executeGremlinScript(ScriptEngine scriptEngine,
-            Map<? extends  String, ? extends  Object> userBindings, String query, boolean isPath)
-            throws ScriptException {
-        Bindings bindings = scriptEngine.createBindings();
-
-        bindings.putAll(userBindings);
-        bindings.put("g", getGraph());
-
-        Object result = scriptEngine.eval(query, bindings);
-        return convertGremlinValue(result);
-    }
-
-    @Override
-    public GroovyExpression generatePersisentToLogicalConversionExpression(GroovyExpression expr, AtlasType type) {
-        //nothing special needed, value is stored in required type
-        return expr;
-    }
-
-    @Override
-    public boolean isPropertyValueConversionNeeded(AtlasType type) {
-        return false;
-    }
-
-    @Override
-    public boolean requiresInitialIndexedPredicate() {
-        return false;
-    }
-
-    @Override
-    public GroovyExpression getInitialIndexedPredicate(GroovyExpression parent) {
-        return parent;
-    }
-
-    @Override
-    public GroovyExpression addOutputTransformationPredicate(GroovyExpression expr, boolean isSelect, boolean isPath) {
-        return expr;
-    }
-
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> wrapVertices(Iterator<? extends Vertex> it) {
-        Iterable<? extends Vertex> iterable = new IteratorToIterableAdapter<>(it);
-        return wrapVertices(iterable);
-    }
-
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> wrapVertices(Iterable<? extends Vertex> it) {
-
-        return Iterables.transform(it, new Function<Vertex, AtlasVertex<Titan1Vertex, Titan1Edge>>() {
-
-            @Override
-            public AtlasVertex<Titan1Vertex, Titan1Edge> apply(Vertex input) {
-                return GraphDbObjectFactory.createVertex(Titan1Graph.this, input);
-            }
-        });
-
-    }
-
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> wrapEdges(Iterator<? extends Edge> it) {
-        Iterable<? extends Edge> iterable = new IteratorToIterableAdapter<>(it);
-        return wrapEdges(iterable);
-    }
-
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> wrapEdges(Iterable<? extends Edge> it) {
-
-        return Iterables.transform(it, new Function<Edge, AtlasEdge<Titan1Vertex, Titan1Edge>>() {
-
-            @Override
-            public AtlasEdge<Titan1Vertex, Titan1Edge> apply(Edge input) {
-                return GraphDbObjectFactory.createEdge(Titan1Graph.this, input);
-            }
-        });
-
-    }
-
-    @Override
-    public boolean isMultiProperty(String propertyName) {
-        return multiProperties.contains(propertyName);
-    }
-
-    public void addMultiProperties(Set<String> names) {
-        multiProperties.addAll(names);
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphDatabase.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphDatabase.java
deleted file mode 100644
index dfb5354..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphDatabase.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-
-import org.apache.atlas.ApplicationProperties;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.GraphDatabase;
-import org.apache.atlas.repository.graphdb.titan1.serializer.BigDecimalSerializer;
-import org.apache.atlas.repository.graphdb.titan1.serializer.BigIntegerSerializer;
-import org.apache.atlas.repository.graphdb.titan1.serializer.StringListSerializer;
-import org.apache.atlas.repository.graphdb.titan1.serializer.TypeCategorySerializer;
-import org.apache.atlas.typesystem.types.DataTypes.TypeCategory;
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
-import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.thinkaurelius.titan.core.TitanFactory;
-import com.thinkaurelius.titan.core.TitanGraph;
-import com.thinkaurelius.titan.core.schema.TitanManagement;
-import com.thinkaurelius.titan.core.util.TitanCleanup;
-import com.thinkaurelius.titan.graphdb.tinkerpop.TitanIoRegistry;
-
-/**
- * Default implementation for Graph Provider that doles out Titan Graph.
- */
-public class Titan1GraphDatabase implements GraphDatabase<Titan1Vertex, Titan1Edge> {
-
-    private static final Logger LOG = LoggerFactory.getLogger(Titan1GraphDatabase.class);
-
-    /**
-     * Constant for the configuration property that indicates the prefix.
-     */
-    public static final String GRAPH_PREFIX = "atlas.graph";
-
-    public static final String INDEX_BACKEND_CONF = "index.search.backend";
-
-    public static final String INDEX_BACKEND_LUCENE = "lucene";
-
-    public static final String INDEX_BACKEND_ES = "elasticsearch";
-
-    private static volatile Titan1Graph atlasGraphInstance = null;
-    private static volatile TitanGraph graphInstance;
-
-    public Titan1GraphDatabase() {
-
-        //update registry
-        GraphSONMapper.build().addRegistry(TitanIoRegistry.INSTANCE).create();
-    }
-
-    public static Configuration getConfiguration() throws AtlasException {
-        Configuration configProperties = ApplicationProperties.get();
-
-        Configuration titanConfig = ApplicationProperties.getSubsetConfiguration(configProperties, GRAPH_PREFIX);
-
-        //add serializers for non-standard property value types that Atlas uses
-
-        titanConfig.addProperty("attributes.custom.attribute1.attribute-class", TypeCategory.class.getName());
-        titanConfig.addProperty("attributes.custom.attribute1.serializer-class",
-                TypeCategorySerializer.class.getName());
-
-        //not ideal, but avoids making large changes to Atlas
-        titanConfig.addProperty("attributes.custom.attribute2.attribute-class", ArrayList.class.getName());
-        titanConfig.addProperty("attributes.custom.attribute2.serializer-class", StringListSerializer.class.getName());
-
-        titanConfig.addProperty("attributes.custom.attribute3.attribute-class", BigInteger.class.getName());
-        titanConfig.addProperty("attributes.custom.attribute3.serializer-class", BigIntegerSerializer.class.getName());
-
-        titanConfig.addProperty("attributes.custom.attribute4.attribute-class", BigDecimal.class.getName());
-        titanConfig.addProperty("attributes.custom.attribute4.serializer-class", BigDecimalSerializer.class.getName());
-
-        return titanConfig;
-    }
-
-    public static TitanGraph getGraphInstance() {
-        if (graphInstance == null) {
-            synchronized (Titan1GraphDatabase.class) {
-                if (graphInstance == null) {
-                    Configuration config;
-                    try {
-                        config = getConfiguration();
-                    } catch (AtlasException e) {
-                        throw new RuntimeException(e);
-                    }
-
-                    graphInstance = TitanFactory.open(config);
-                    atlasGraphInstance = new Titan1Graph();
-                    validateIndexBackend(config);
-                }
-            }
-        }
-        return graphInstance;
-    }
-
-    public static void unload() {
-        synchronized (Titan1GraphDatabase.class) {
-
-            if (graphInstance == null) {
-                return;
-            }
-            graphInstance.tx().commit();
-            graphInstance.close();
-            graphInstance = null;
-        }
-    }
-
-    static void validateIndexBackend(Configuration config) {
-        String configuredIndexBackend = config.getString(INDEX_BACKEND_CONF);
-
-        TitanManagement managementSystem = getGraphInstance().openManagement();
-        String currentIndexBackend = managementSystem.get(INDEX_BACKEND_CONF);
-        managementSystem.commit();
-
-        if (!configuredIndexBackend.equals(currentIndexBackend)) {
-            throw new RuntimeException("Configured Index Backend " + configuredIndexBackend
-                    + " differs from earlier configured Index Backend " + currentIndexBackend + ". Aborting!");
-        }
-
-    }
-
-    @Override
-    public boolean isGraphLoaded() {
-        return graphInstance != null;
-    }
-
-    @Override
-    public void initializeTestGraph() {
-        //nothing to do
-
-    }
-
-    @Override
-    public void cleanup() {
-        try {
-            getGraphInstance().close();
-        } catch (Throwable t) {
-            LOG.warn("Could not close test TitanGraph", t);
-            t.printStackTrace();
-        }
-
-        try {
-            TitanCleanup.clear(getGraphInstance());
-        } catch (Throwable t) {
-            LOG.warn("Could not clear test TitanGraph", t);
-            t.printStackTrace();
-        }
-    }
-
-    @Override
-    public AtlasGraph<Titan1Vertex, Titan1Edge> getGraph() {
-        getGraphInstance();
-        return atlasGraphInstance;
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphIndex.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphIndex.java
deleted file mode 100644
index 5ec1180..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphIndex.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import org.apache.atlas.repository.graphdb.AtlasGraphIndex;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import com.thinkaurelius.titan.core.PropertyKey;
-import com.thinkaurelius.titan.core.schema.TitanGraphIndex;
-
-/**
- * Represents an Index in Titan 1.
- */
-public class Titan1GraphIndex implements AtlasGraphIndex {
-
-    private TitanGraphIndex wrapped;
-
-    public Titan1GraphIndex(TitanGraphIndex toWrap) {
-        this.wrapped = toWrap;
-    }
-
-
-    @Override
-    public boolean isEdgeIndex() {
-        return Edge.class.isAssignableFrom(wrapped.getIndexedElement());
-    }
-
-    @Override
-    public boolean isVertexIndex() {
-        return Vertex.class.isAssignableFrom(wrapped.getIndexedElement());
-    }
-
-    @Override
-    public boolean isUnique() {
-        return wrapped.isUnique();
-    }
-
-
-    @Override
-    public Set<AtlasPropertyKey> getFieldKeys() {
-        PropertyKey[] keys = wrapped.getFieldKeys();
-        Set<AtlasPropertyKey> result = new HashSet<AtlasPropertyKey>();
-        for(PropertyKey key  : keys) {
-            result.add(GraphDbObjectFactory.createPropertyKey(key));
-        }
-        return result;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 37*result + wrapped.hashCode();
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Titan1GraphIndex)) {
-            return false;
-        }
-        Titan1GraphIndex otherKey = (Titan1GraphIndex)other;
-        return otherKey.wrapped.equals(wrapped);
-
-    }
-
-
-    @Override
-    public boolean isMixedIndex() {
-        return wrapped.isMixedIndex();
-    }
-
-
-    @Override
-    public boolean isCompositeIndex() {
-        return wrapped.isCompositeIndex();
-    }
-
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphManagement.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphManagement.java
deleted file mode 100644
index a5d3815..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1GraphManagement.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import com.google.common.base.Preconditions;
-import com.thinkaurelius.titan.core.Cardinality;
-import com.thinkaurelius.titan.core.EdgeLabel;
-import com.thinkaurelius.titan.core.PropertyKey;
-import com.thinkaurelius.titan.core.schema.Mapping;
-import com.thinkaurelius.titan.core.schema.PropertyKeyMaker;
-import com.thinkaurelius.titan.core.schema.TitanGraphIndex;
-import com.thinkaurelius.titan.core.schema.TitanManagement;
-import com.thinkaurelius.titan.graphdb.internal.Token;
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasEdgeLabel;
-import org.apache.atlas.repository.graphdb.AtlasGraphIndex;
-import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-import org.apache.commons.lang.StringUtils;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Titan 1.0.0 implementation of AtlasGraphManagement.
- */
-public class Titan1GraphManagement implements AtlasGraphManagement {
-
-    private static final Logger LOG = LoggerFactory.getLogger(Titan1GraphManagement.class);
-
-    private static final char[] RESERVED_CHARS = { '{', '}', '"', '$', Token.SEPARATOR_CHAR };
-
-    private Titan1Graph graph;
-    private TitanManagement management;
-
-    private Set<String> newMultProperties = new HashSet<>();
-
-    public Titan1GraphManagement(Titan1Graph graph, TitanManagement managementSystem) {
-        this.management = managementSystem;
-        this.graph = graph;
-    }
-
-    @Override
-    public void createVertexIndex(String propertyName, String backingIndex, List<AtlasPropertyKey> propertyKeys) {
-
-        TitanManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
-        for (AtlasPropertyKey key : propertyKeys) {
-            PropertyKey titanKey = TitanObjectFactory.createPropertyKey(key);
-            indexBuilder.addKey(titanKey);
-        }
-        indexBuilder.buildMixedIndex(backingIndex);
-    }
-
-    @Override
-    public void createEdgeIndex(String index, String backingIndex) {
-        buildMixedIndex(index, Edge.class, backingIndex);
-    }
-
-    private void buildMixedIndex(String index, Class<? extends Element> titanClass, String backingIndex) {
-
-        management.buildIndex(index, titanClass).buildMixedIndex(backingIndex);
-    }
-
-    @Override
-    public void createFullTextIndex(String indexName, AtlasPropertyKey propertyKey, String backingIndex) {
-
-        PropertyKey fullText = TitanObjectFactory.createPropertyKey(propertyKey);
-
-        management.buildIndex(indexName, Vertex.class)
-                .addKey(fullText, com.thinkaurelius.titan.core.schema.Parameter.of("mapping", Mapping.TEXT))
-                .buildMixedIndex(backingIndex);
-    }
-
-    @Override
-    public boolean containsPropertyKey(String propertyName) {
-        return management.containsPropertyKey(propertyName);
-    }
-
-    @Override
-    public void rollback() {
-        management.rollback();
-
-    }
-
-    @Override
-    public void commit() {
-        graph.addMultiProperties(newMultProperties);
-        newMultProperties.clear();
-        management.commit();
-    }
-
-    private static void checkName(String name) {
-        //for some reason, name checking was removed from StandardPropertyKeyMaker.make()
-        //in titan 1.  For consistency, do the check here.
-        Preconditions.checkArgument(StringUtils.isNotBlank(name), "Need to specify name");
-        for (char c : RESERVED_CHARS) {
-            Preconditions.checkArgument(name.indexOf(c) < 0, "Name can not contains reserved character %s: %s", c,
-                    name);
-        }
-
-    }
-
-    @Override
-    public AtlasPropertyKey makePropertyKey(String propertyName, Class propertyClass, AtlasCardinality cardinality) {
-
-        if (cardinality.isMany()) {
-            newMultProperties.add(propertyName);
-        }
-        PropertyKeyMaker propertyKeyBuilder = management.makePropertyKey(propertyName).dataType(propertyClass);
-        if (cardinality != null) {
-            Cardinality titanCardinality = TitanObjectFactory.createCardinality(cardinality);
-            propertyKeyBuilder.cardinality(titanCardinality);
-        }
-        PropertyKey propertyKey = propertyKeyBuilder.make();
-        return GraphDbObjectFactory.createPropertyKey(propertyKey);
-    }
-
-    @Override
-    public AtlasEdgeLabel makeEdgeLabel(String label) {
-        EdgeLabel edgeLabel = management.makeEdgeLabel(label).make();
-
-        return GraphDbObjectFactory.createEdgeLabel(edgeLabel);
-    }
-
-    @Override
-    public void deletePropertyKey(String propertyKey) {
-        PropertyKey titanPropertyKey = management.getPropertyKey(propertyKey);
-
-        if (null == titanPropertyKey) return;
-
-        for (int i = 0;; i++) {
-            String deletedKeyName = titanPropertyKey + "_deleted_" + i;
-            if (null == management.getPropertyKey(deletedKeyName)) {
-                management.changeName(titanPropertyKey, deletedKeyName);
-                break;
-            }
-        }
-    }
-
-    @Override
-    public AtlasPropertyKey getPropertyKey(String propertyName) {
-        checkName(propertyName);
-        return GraphDbObjectFactory.createPropertyKey(management.getPropertyKey(propertyName));
-    }
-
-    @Override
-    public AtlasEdgeLabel getEdgeLabel(String label) {
-        return GraphDbObjectFactory.createEdgeLabel(management.getEdgeLabel(label));
-    }
-
-    public void createExactMatchVertexIndex(String propertyName, boolean enforceUniqueness,
-                                      List<AtlasPropertyKey> propertyKeys) {
-
-        TitanManagement.IndexBuilder indexBuilder = management.buildIndex(propertyName, Vertex.class);
-        for (AtlasPropertyKey key : propertyKeys) {
-            PropertyKey titanKey = TitanObjectFactory.createPropertyKey(key);
-            indexBuilder.addKey(titanKey);
-        }
-        if (enforceUniqueness) {
-            indexBuilder.unique();
-        }
-        indexBuilder.buildCompositeIndex();
-    }
-
-    @Override
-    public void addVertexIndexKey(String indexName, AtlasPropertyKey propertyKey) {
-        PropertyKey titanKey = TitanObjectFactory.createPropertyKey(propertyKey);
-        TitanGraphIndex vertexIndex = management.getGraphIndex(indexName);
-        management.addIndexKey(vertexIndex, titanKey);
-    }
-
-    @Override
-    public AtlasGraphIndex getGraphIndex(String indexName) {
-        TitanGraphIndex index = management.getGraphIndex(indexName);
-        return GraphDbObjectFactory.createGraphIndex(index);
-    }
-
-    @Override
-    public void createExactMatchIndex(String propertyName, boolean isUnique,
-            List<AtlasPropertyKey> propertyKeys) {
-        createExactMatchVertexIndex(propertyName, isUnique, propertyKeys);
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1IndexQuery.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1IndexQuery.java
deleted file mode 100644
index c7e4150..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1IndexQuery.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import java.util.Iterator;
-
-import com.google.common.base.Preconditions;
-import org.apache.atlas.repository.graphdb.AtlasIndexQuery;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-
-import com.google.common.base.Function;
-import com.google.common.collect.Iterators;
-import com.thinkaurelius.titan.core.TitanIndexQuery;
-import com.thinkaurelius.titan.core.TitanVertex;
-
-/**
- * Titan 1.0.0 implementation of AtlasIndexQuery.
- */
-public class Titan1IndexQuery implements AtlasIndexQuery<Titan1Vertex, Titan1Edge> {
-
-    private Titan1Graph graph;
-    private TitanIndexQuery query;
-
-    public Titan1IndexQuery(Titan1Graph graph, TitanIndexQuery query) {
-        this.query = query;
-        this.graph = graph;
-    }
-
-    @Override
-    public Iterator<Result<Titan1Vertex, Titan1Edge>> vertices() {
-        Iterator<TitanIndexQuery.Result<TitanVertex>> results = query.vertices().iterator();
-
-        Function<TitanIndexQuery.Result<TitanVertex>, Result<Titan1Vertex, Titan1Edge>> function =
-            new Function<TitanIndexQuery.Result<TitanVertex>, Result<Titan1Vertex, Titan1Edge>>() {
-
-                @Override
-                public Result<Titan1Vertex, Titan1Edge> apply(TitanIndexQuery.Result<TitanVertex> source) {
-                    return new ResultImpl(source);
-                }
-            };
-
-        return Iterators.transform(results, function);
-    }
-
-    @Override
-    public Iterator<Result<Titan1Vertex, Titan1Edge>> vertices(int offset, int limit) {
-        Preconditions.checkArgument(offset >=0, "Index offset should be greater than or equals to 0");
-        Preconditions.checkArgument(limit >=0, "Index limit should be greater than or equals to 0");
-        Iterator<TitanIndexQuery.Result<TitanVertex>> results = query
-                .offset(offset)
-                .limit(limit)
-                .vertices().iterator();
-
-        Function<TitanIndexQuery.Result<TitanVertex>, Result<Titan1Vertex, Titan1Edge>> function =
-                new Function<TitanIndexQuery.Result<TitanVertex>, Result<Titan1Vertex, Titan1Edge>>() {
-
-                    @Override
-                    public Result<Titan1Vertex, Titan1Edge> apply(TitanIndexQuery.Result<TitanVertex> source) {
-                        return new ResultImpl(source);
-                    }
-                };
-
-        return Iterators.transform(results, function);
-    }
-
-    /**
-     * Titan 1.0.0 implementation of AtlasIndexQuery.Result.
-     */
-    public final class ResultImpl implements AtlasIndexQuery.Result<Titan1Vertex, Titan1Edge> {
-        private TitanIndexQuery.Result<TitanVertex> source;
-
-        public ResultImpl(TitanIndexQuery.Result<TitanVertex> source) {
-            this.source = source;
-        }
-
-        @Override
-        public AtlasVertex<Titan1Vertex, Titan1Edge> getVertex() {
-            return GraphDbObjectFactory.createVertex(graph, source.getElement());
-        }
-
-        @Override
-        public double getScore() {
-            return source.getScore();
-        }
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1PropertyKey.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1PropertyKey.java
deleted file mode 100644
index 6b62f27..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1PropertyKey.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-
-import com.thinkaurelius.titan.core.PropertyKey;
-
-/**
- *
- */
-public class Titan1PropertyKey implements AtlasPropertyKey {
-
-    private PropertyKey wrapped;
-
-    public Titan1PropertyKey(PropertyKey toWrap) {
-        wrapped = toWrap;
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.atlas.repository.graphdb.AtlasPropertyKey#getName()
-     */
-    @Override
-    public String getName() {
-        return wrapped.name();
-    }
-
-    /**
-     * @return
-     */
-    public PropertyKey getWrappedPropertyKey() {
-        return wrapped;
-    }
-
-    @Override
-    public int hashCode() {
-        int result = 17;
-        result = 37*result + wrapped.hashCode();
-        return result;
-    }
-
-    @Override
-    public boolean equals(Object other) {
-        if (!(other instanceof Titan1PropertyKey)) {
-            return false;
-        }
-        Titan1PropertyKey otherKey = (Titan1PropertyKey)other;
-        return otherKey.getWrappedPropertyKey().equals(getWrappedPropertyKey());
-
-    }
-
-    /* (non-Javadoc)
-     * @see org.apache.atlas.repository.graphdb.AtlasPropertyKey#getCardinality()
-     */
-    @Override
-    public AtlasCardinality getCardinality() {
-        return GraphDbObjectFactory.createCardinality(wrapped.cardinality());
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Vertex.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Vertex.java
deleted file mode 100644
index 1670e92..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1Vertex.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
-import org.apache.atlas.repository.graphdb.AtlasSchemaViolationException;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.AtlasVertexQuery;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-
-import com.thinkaurelius.titan.core.SchemaViolationException;
-import com.thinkaurelius.titan.core.TitanVertex;
-/**
- * Titan 1.0.0 implementation of AtlasVertex.
- */
-public class Titan1Vertex extends Titan1Element<Vertex> implements AtlasVertex<Titan1Vertex, Titan1Edge> {
-
-
-    public Titan1Vertex(Titan1Graph graph, Vertex source) {
-        super(graph, source);
-    }
-
-    @Override
-    public <T> void addProperty(String propertyName, T value) {
-        try {
-            getWrappedElement().property(VertexProperty.Cardinality.set, propertyName, value);
-        } catch(SchemaViolationException e) {
-            throw new AtlasSchemaViolationException(e);
-        }
-    }
-
-
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> getEdges(AtlasEdgeDirection dir, String edgeLabel) {
-
-        Direction d = TitanObjectFactory.createDirection(dir);
-        Iterator<Edge> edges = getWrappedElement().edges(d, edgeLabel);
-        return graph.wrapEdges(edges);
-    }
-
-    private TitanVertex getAsTitanVertex() {
-        return (TitanVertex)getWrappedElement();
-    }
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> getEdges(AtlasEdgeDirection in) {
-        Direction d = TitanObjectFactory.createDirection(in);
-        Iterator<Edge> edges = getWrappedElement().edges(d);
-        return graph.wrapEdges(edges);
-    }
-
-    @Override
-    public <T> Collection<T> getPropertyValues(String propertyName, Class<T> clazz) {
-
-        Collection<T> result = new ArrayList<T>();
-        Iterator<VertexProperty<T>> it = getWrappedElement().properties(propertyName);
-        while(it.hasNext()) {
-            result.add(it.next().value());
-        }
-
-        return result;
-    }
-
-    @Override
-    public AtlasVertexQuery<Titan1Vertex, Titan1Edge> query() {
-
-        return new Titan1VertexQuery(graph, getAsTitanVertex().query());
-    }
-
-
-    @Override
-    public Titan1Vertex getV() {
-        return this;
-    }
-
-
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1VertexQuery.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1VertexQuery.java
deleted file mode 100644
index a761a74..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/Titan1VertexQuery.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import com.google.common.base.Preconditions;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.AtlasVertexQuery;
-
-import com.thinkaurelius.titan.core.TitanVertexQuery;
-
-/**
- * Titan 1.0.0 implementation of AtlasVertexQuery.
- */
-public class Titan1VertexQuery implements AtlasVertexQuery<Titan1Vertex, Titan1Edge> {
-
-    private Titan1Graph graph;
-    private TitanVertexQuery<?> query;
-
-    public Titan1VertexQuery(Titan1Graph graph, TitanVertexQuery<?> query) {
-        this.query = query;
-        this.graph = graph;
-    }
-
-    @Override
-    public AtlasVertexQuery<Titan1Vertex, Titan1Edge> direction(AtlasEdgeDirection queryDirection) {
-        query.direction(TitanObjectFactory.createDirection(queryDirection));
-        return this;
-
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> vertices() {
-        Iterable vertices = query.vertices();
-        return graph.wrapVertices(vertices);
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> vertices(int limit) {
-        Preconditions.checkArgument(limit >=0, "Limit should be greater than or equals to 0");
-        Iterable vertices = query.limit(limit).vertices();
-        return graph.wrapVertices(vertices);
-    }
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> edges() {
-        Iterable edges = query.edges();
-        return graph.wrapEdges(edges);
-    }
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> edges(int limit) {
-        Preconditions.checkArgument(limit >=0, "Limit should be greater than or equals to 0");
-        Iterable edges = query.limit(limit).edges();
-        return graph.wrapEdges(edges);
-    }
-
-    @Override
-    public long count() {
-        return query.count();
-    }
-
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/TitanObjectFactory.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/TitanObjectFactory.java
deleted file mode 100644
index a4776a9..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/TitanObjectFactory.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-
-import com.thinkaurelius.titan.core.Cardinality;
-import com.thinkaurelius.titan.core.PropertyKey;
-
-
-/**
- * Factory that serves up instances of Titan/Tinkerpop classes that correspond to
- * graph database abstraction layer/Atlas classes.
- */
-public final class TitanObjectFactory {
-
-    private TitanObjectFactory() {
-
-    }
-
-    /**
-     * Retrieves the titan direction corresponding to the given
-     * AtlasEdgeDirection.
-     *
-     * @param dir
-     * @return
-     */
-    public static Direction createDirection(AtlasEdgeDirection dir) {
-
-        switch(dir) {
-        case IN:
-            return Direction.IN;
-        case OUT:
-            return Direction.OUT;
-        case BOTH:
-            return Direction.BOTH;
-        default:
-            throw new RuntimeException("Unrecognized direction: " + dir);
-        }
-    }
-
-
-    /**
-     * Converts a Multiplicity to a Cardinality.
-     *
-     * @param multiplicity
-     * @return
-     */
-    public static Cardinality createCardinality(AtlasCardinality cardinality) {
-        switch(cardinality) {
-
-        case SINGLE:
-            return Cardinality.SINGLE;
-        case LIST:
-            return Cardinality.LIST;
-        case SET:
-            return Cardinality.SET;
-        default:
-            throw new IllegalStateException("Unrecognized cardinality: " + cardinality);
-        }
-    }
-
-    public static PropertyKey createPropertyKey(AtlasPropertyKey key) {
-        return ((Titan1PropertyKey)key).getWrappedPropertyKey();
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasElementPropertyConfig.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasElementPropertyConfig.java
deleted file mode 100644
index df67a83..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasElementPropertyConfig.java
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.graphson;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Configure how the GraphSON utility treats edge and vertex properties.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class AtlasElementPropertyConfig {
-
-    /**
-     * Rules for element properties.
-     */
-    public enum ElementPropertiesRule {
-        INCLUDE, EXCLUDE
-    }
-
-    private final List<String> vertexPropertyKeys;
-    private final List<String> edgePropertyKeys;
-    private final ElementPropertiesRule vertexPropertiesRule;
-    private final ElementPropertiesRule edgePropertiesRule;
-    private final boolean normalized;
-
-    /**
-     * A configuration that includes all properties of vertices and edges.
-     */
-    public static final AtlasElementPropertyConfig ALL_PROPERTIES = new AtlasElementPropertyConfig(null, null,
-            ElementPropertiesRule.INCLUDE, ElementPropertiesRule.INCLUDE, false);
-
-    public AtlasElementPropertyConfig(final Set<String> vertexPropertyKeys, final Set<String> edgePropertyKeys,
-            final ElementPropertiesRule vertexPropertiesRule, final ElementPropertiesRule edgePropertiesRule) {
-        this(vertexPropertyKeys, edgePropertyKeys, vertexPropertiesRule, edgePropertiesRule, false);
-    }
-
-    public AtlasElementPropertyConfig(final Set<String> vertexPropertyKeys, final Set<String> edgePropertyKeys,
-            final ElementPropertiesRule vertexPropertiesRule, final ElementPropertiesRule edgePropertiesRule,
-            final boolean normalized) {
-        this.vertexPropertiesRule = vertexPropertiesRule;
-        this.vertexPropertyKeys = sortKeys(vertexPropertyKeys, normalized);
-        this.edgePropertiesRule = edgePropertiesRule;
-        this.edgePropertyKeys = sortKeys(edgePropertyKeys, normalized);
-        this.normalized = normalized;
-    }
-
-    /**
-     * Construct a configuration that includes the specified properties from
-     * both vertices and edges.
-     */
-    public static AtlasElementPropertyConfig includeProperties(final Set<String> vertexPropertyKeys,
-                                                               final Set<String> edgePropertyKeys) {
-        return new AtlasElementPropertyConfig(vertexPropertyKeys, edgePropertyKeys, ElementPropertiesRule.INCLUDE,
-                ElementPropertiesRule.INCLUDE);
-    }
-
-    public static AtlasElementPropertyConfig includeProperties(final Set<String> vertexPropertyKeys,
-                                                               final Set<String> edgePropertyKeys,
-                                                               final boolean normalized) {
-        return new AtlasElementPropertyConfig(vertexPropertyKeys, edgePropertyKeys, ElementPropertiesRule.INCLUDE,
-                ElementPropertiesRule.INCLUDE, normalized);
-    }
-
-    /**
-     * Construct a configuration that excludes the specified properties from
-     * both vertices and edges.
-     */
-    public static AtlasElementPropertyConfig excludeProperties(final Set<String> vertexPropertyKeys,
-                                                               final Set<String> edgePropertyKeys) {
-        return new AtlasElementPropertyConfig(vertexPropertyKeys, edgePropertyKeys, ElementPropertiesRule.EXCLUDE,
-                ElementPropertiesRule.EXCLUDE);
-    }
-
-    public static AtlasElementPropertyConfig excludeProperties(final Set<String> vertexPropertyKeys,
-                                                               final Set<String> edgePropertyKeys,
-                                                               final boolean normalized) {
-        return new AtlasElementPropertyConfig(vertexPropertyKeys, edgePropertyKeys, ElementPropertiesRule.EXCLUDE,
-                ElementPropertiesRule.EXCLUDE, normalized);
-    }
-
-    public List<String> getVertexPropertyKeys() {
-        return vertexPropertyKeys;
-    }
-
-    public List<String> getEdgePropertyKeys() {
-        return edgePropertyKeys;
-    }
-
-    public ElementPropertiesRule getVertexPropertiesRule() {
-        return vertexPropertiesRule;
-    }
-
-    public ElementPropertiesRule getEdgePropertiesRule() {
-        return edgePropertiesRule;
-    }
-
-    public boolean isNormalized() {
-        return normalized;
-    }
-
-    private static List<String> sortKeys(final Set<String> keys, final boolean normalized) {
-        final List<String> propertyKeyList;
-        if (keys != null) {
-            if (normalized) {
-                final List<String> sorted = new ArrayList<String>(keys);
-                Collections.sort(sorted);
-                propertyKeyList = sorted;
-            } else {
-                propertyKeyList = new ArrayList<String>(keys);
-            }
-        } else {
-            propertyKeyList = null;
-        }
-
-        return propertyKeyList;
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONMode.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONMode.java
deleted file mode 100644
index 2bab287..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONMode.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.graphson;
-
-/**
- * Modes of operation of the GraphSONUtility.
- *
- * @author Stephen Mallette
- */
-public enum AtlasGraphSONMode {
-    /**
-     * COMPACT constructs GraphSON on the assumption that all property keys
-     * are fair game for exclusion including _type, _inV, _outV, _label and _id.
-     * It is possible to write GraphSON that cannot be read back into Graph,
-     * if some or all of these keys are excluded.
-     */
-    COMPACT,
-
-    /**
-     * NORMAL includes the _type field and JSON data typing.
-     */
-    NORMAL,
-
-    /**
-     * EXTENDED includes the _type field and explicit data typing.
-     */
-    EXTENDED
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONTokens.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONTokens.java
deleted file mode 100644
index 49bbdb4..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONTokens.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.graphson;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class AtlasGraphSONTokens {
-
-    private AtlasGraphSONTokens() {}
-
-    public static final String VERTEX = "vertex";
-    public static final String EDGE = "edge";
-    public static final String INTERNAL_ID = "_id";
-    public static final String INTERNAL_LABEL = "_label";
-    public static final String INTERNAL_TYPE = "_type";
-    public static final String INTERNAL_OUT_V = "_outV";
-    public static final String INTERNAL_IN_V = "_inV";
-    public static final String VALUE = "value";
-    public static final String TYPE = "type";
-    public static final String TYPE_LIST = "list";
-    public static final String TYPE_STRING = "string";
-    public static final String TYPE_DOUBLE = "double";
-    public static final String TYPE_INTEGER = "integer";
-    public static final String TYPE_FLOAT = "float";
-    public static final String TYPE_MAP = "map";
-    public static final String TYPE_BOOLEAN = "boolean";
-    public static final String TYPE_LONG = "long";
-    public static final String TYPE_SHORT = "short";
-    public static final String TYPE_BYTE = "byte";
-    public static final String TYPE_UNKNOWN = "unknown";
-
-    public static final String VERTICES = "vertices";
-    public static final String EDGES = "edges";
-    public static final String MODE = "mode";
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONUtility.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONUtility.java
deleted file mode 100644
index 26abe2e..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/graphson/AtlasGraphSONUtility.java
+++ /dev/null
@@ -1,513 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.graphson;
-
-import java.io.IOException;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasElement;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.titan1.graphson.AtlasElementPropertyConfig.ElementPropertiesRule;
-import org.codehaus.jettison.json.JSONException;
-import org.codehaus.jettison.json.JSONObject;
-import org.codehaus.jettison.json.JSONTokener;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.node.ArrayNode;
-import com.fasterxml.jackson.databind.node.JsonNodeFactory;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-
-/**
- * This class was largely removed from tinkerpop 1. We're adding it back here to
- * avoid changing the format of the JSON that we produce.
- *
- * Helps write individual graph elements to TinkerPop JSON format known as
- * GraphSON.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class AtlasGraphSONUtility {
-
-    private static final JsonNodeFactory JSON_NODE_FACTORY = JsonNodeFactory.instance;
-
-    private static final ObjectMapper MAPPER = new ObjectMapper();
-
-    private final AtlasGraphSONMode mode;
-    private final List<String> vertexPropertyKeys;
-    private final List<String> edgePropertyKeys;
-
-    private final ElementPropertiesRule vertexPropertiesRule;
-    private final ElementPropertiesRule edgePropertiesRule;
-    private final boolean normalized;
-
-    private final boolean includeReservedVertexId;
-    private final boolean includeReservedEdgeId;
-    private final boolean includeReservedVertexType;
-    private final boolean includeReservedEdgeType;
-    private final boolean includeReservedEdgeLabel;
-    private final boolean includeReservedEdgeOutV;
-    private final boolean includeReservedEdgeInV;
-
-    /**
-     * A GraphSONUtility that includes the specified properties.
-     */
-    private AtlasGraphSONUtility(final AtlasGraphSONMode mode, final Set<String> vertexPropertyKeySet,
-            final Set<String> edgePropertyKeySet) {
-
-        AtlasElementPropertyConfig config = AtlasElementPropertyConfig.includeProperties(vertexPropertyKeySet,
-                edgePropertyKeySet);
-
-        this.vertexPropertyKeys = config.getVertexPropertyKeys();
-        this.edgePropertyKeys = config.getEdgePropertyKeys();
-        this.vertexPropertiesRule = config.getVertexPropertiesRule();
-        this.edgePropertiesRule = config.getEdgePropertiesRule();
-        this.normalized = config.isNormalized();
-
-        this.mode = mode;
-
-        this.includeReservedVertexId = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_ID, vertexPropertyKeys,
-                this.vertexPropertiesRule);
-        this.includeReservedEdgeId = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_ID, edgePropertyKeys,
-                this.edgePropertiesRule);
-        this.includeReservedVertexType = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_TYPE, vertexPropertyKeys,
-                this.vertexPropertiesRule);
-        this.includeReservedEdgeType = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_TYPE, edgePropertyKeys,
-                this.edgePropertiesRule);
-        this.includeReservedEdgeLabel = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_LABEL, edgePropertyKeys,
-                this.edgePropertiesRule);
-        this.includeReservedEdgeOutV = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_OUT_V, edgePropertyKeys,
-                this.edgePropertiesRule);
-        this.includeReservedEdgeInV = includeReservedKey(mode, AtlasGraphSONTokens.INTERNAL_IN_V, edgePropertyKeys,
-                this.edgePropertiesRule);
-    }
-
-    /*
-     * Creates GraphSON for a single graph element.
-     */
-    private JSONObject jsonFromElement(final AtlasElement element) throws JSONException {
-        final ObjectNode objectNode = this.objectNodeFromElement(element);
-
-        try {
-            return new JSONObject(new JSONTokener(MAPPER.writeValueAsString(objectNode)));
-        } catch (IOException ioe) {
-            // repackage this as a JSONException...seems sensible as the caller will only know about
-            // the jettison object not being created
-            throw new JSONException(ioe);
-        }
-    }
-
-    /**
-     * Creates GraphSON for a single graph element.
-     */
-    private ObjectNode objectNodeFromElement(final AtlasElement element) {
-        final boolean isEdge = element instanceof AtlasEdge;
-        final boolean showTypes = mode == AtlasGraphSONMode.EXTENDED;
-        final List<String> propertyKeys = isEdge ? this.edgePropertyKeys : this.vertexPropertyKeys;
-        final ElementPropertiesRule elementPropertyConfig = isEdge ? this.edgePropertiesRule
-                : this.vertexPropertiesRule;
-
-        final ObjectNode jsonElement = createJSONMap(
-                createPropertyMap(element, propertyKeys, elementPropertyConfig, normalized), propertyKeys, showTypes);
-
-        if ((isEdge && this.includeReservedEdgeId) || (!isEdge && this.includeReservedVertexId)) {
-            putObject(jsonElement, AtlasGraphSONTokens.INTERNAL_ID, element.getId());
-        }
-
-        // it's important to keep the order of these straight.  check AtlasEdge first and then AtlasVertex because there
-        // are graph implementations that have AtlasEdge extend from AtlasVertex
-        if (element instanceof AtlasEdge) {
-            final AtlasEdge edge = (AtlasEdge) element;
-
-            if (this.includeReservedEdgeId) {
-                putObject(jsonElement, AtlasGraphSONTokens.INTERNAL_ID, element.getId());
-            }
-
-            if (this.includeReservedEdgeType) {
-                jsonElement.put(AtlasGraphSONTokens.INTERNAL_TYPE, AtlasGraphSONTokens.EDGE);
-            }
-
-            if (this.includeReservedEdgeOutV) {
-                putObject(jsonElement, AtlasGraphSONTokens.INTERNAL_OUT_V, edge.getOutVertex().getId());
-            }
-
-            if (this.includeReservedEdgeInV) {
-                putObject(jsonElement, AtlasGraphSONTokens.INTERNAL_IN_V, edge.getInVertex().getId());
-            }
-
-            if (this.includeReservedEdgeLabel) {
-                jsonElement.put(AtlasGraphSONTokens.INTERNAL_LABEL, edge.getLabel());
-            }
-        } else if (element instanceof AtlasVertex) {
-            if (this.includeReservedVertexId) {
-                putObject(jsonElement, AtlasGraphSONTokens.INTERNAL_ID, element.getId());
-            }
-
-            if (this.includeReservedVertexType) {
-                jsonElement.put(AtlasGraphSONTokens.INTERNAL_TYPE, AtlasGraphSONTokens.VERTEX);
-            }
-        }
-
-        return jsonElement;
-    }
-
-    /**
-     * Creates a Jettison JSONObject from a graph element.
-     *
-     * @param element
-     *            the graph element to convert to JSON.
-     * @param propertyKeys
-     *            The property getPropertyKeys() at the root of the element to
-     *            serialize. If null, then all getPropertyKeys() are serialized.
-     * @param mode
-     *            the type of GraphSON to be generated.
-     */
-    public static JSONObject jsonFromElement(final AtlasElement element, final Set<String> propertyKeys,
-                                             final AtlasGraphSONMode mode)
-        throws JSONException {
-
-        final AtlasGraphSONUtility graphson = element instanceof AtlasEdge
-                ? new AtlasGraphSONUtility(mode, null, propertyKeys)
-                : new AtlasGraphSONUtility(mode, propertyKeys, null);
-        return graphson.jsonFromElement(element);
-    }
-
-    private static ObjectNode objectNodeFromElement(final AtlasElement element, final List<String> propertyKeys,
-                                                    final AtlasGraphSONMode mode) {
-        final AtlasGraphSONUtility graphson = element instanceof AtlasEdge
-                ? new AtlasGraphSONUtility(mode, null, new HashSet<String>(propertyKeys))
-                : new AtlasGraphSONUtility(mode, new HashSet<String>(propertyKeys), null);
-        return graphson.objectNodeFromElement(element);
-    }
-
-    private static boolean includeReservedKey(final AtlasGraphSONMode mode, final String key,
-                                              final List<String> propertyKeys, final ElementPropertiesRule rule) {
-        // the key is always included in modes other than compact.  if it is compact, then validate that the
-        // key is in the property key list
-        return mode != AtlasGraphSONMode.COMPACT || includeKey(key, propertyKeys, rule);
-    }
-
-    private static boolean includeKey(final String key, final List<String> propertyKeys,
-                                      final ElementPropertiesRule rule) {
-        if (propertyKeys == null) {
-            // when null always include the key and shortcut this piece
-            return true;
-        }
-
-        // default the key situation.  if it's included then it should be explicitly defined in the
-        // property getPropertyKeys() list to be included or the reverse otherwise
-        boolean keySituation = rule == ElementPropertiesRule.INCLUDE;
-
-        switch (rule) {
-        case INCLUDE:
-            keySituation = propertyKeys.contains(key);
-            break;
-        case EXCLUDE:
-            keySituation = !propertyKeys.contains(key);
-            break;
-        default:
-            throw new RuntimeException("Unhandled rule: " + rule);
-        }
-
-        return keySituation;
-    }
-
-    private static ArrayNode createJSONList(final List<Object> list, final List<String> propertyKeys,
-                                            final boolean showTypes) {
-        final ArrayNode jsonList = JSON_NODE_FACTORY.arrayNode();
-        for (Object item : list) {
-            if (item instanceof AtlasElement) {
-                jsonList.add(objectNodeFromElement((AtlasElement) item, propertyKeys,
-                        showTypes ? AtlasGraphSONMode.EXTENDED : AtlasGraphSONMode.NORMAL));
-            } else if (item instanceof List) {
-                jsonList.add(createJSONList((List<Object>) item, propertyKeys, showTypes));
-            } else if (item instanceof Map) {
-                jsonList.add(createJSONMap((Map<String, Object>) item, propertyKeys, showTypes));
-            } else if (item != null && item.getClass().isArray()) {
-                jsonList.add(createJSONList(convertArrayToList(item), propertyKeys, showTypes));
-            } else {
-                addObject(jsonList, item);
-            }
-        }
-        return jsonList;
-    }
-
-    private static ObjectNode createJSONMap(final Map<String, Object> map, final List<String> propertyKeys,
-                                            final boolean showTypes) {
-        final ObjectNode jsonMap = JSON_NODE_FACTORY.objectNode();
-        for (Object key : map.keySet()) {
-            Object value = map.get(key);
-            if (value != null) {
-                if (value instanceof List) {
-                    value = createJSONList((List<Object>) value, propertyKeys, showTypes);
-                } else if (value instanceof Map) {
-                    value = createJSONMap((Map<String, Object>) value, propertyKeys, showTypes);
-                } else if (value instanceof AtlasElement) {
-                    value = objectNodeFromElement((AtlasElement) value, propertyKeys,
-                            showTypes ? AtlasGraphSONMode.EXTENDED : AtlasGraphSONMode.NORMAL);
-                } else if (value.getClass().isArray()) {
-                    value = createJSONList(convertArrayToList(value), propertyKeys, showTypes);
-                }
-            }
-
-            putObject(jsonMap, key.toString(), getValue(value, showTypes));
-        }
-        return jsonMap;
-
-    }
-
-    private static void addObject(final ArrayNode jsonList, final Object value) {
-        if (value == null) {
-            jsonList.add((JsonNode) null);
-        } else if (value.getClass() == Boolean.class) {
-            jsonList.add((Boolean) value);
-        } else if (value.getClass() == Long.class) {
-            jsonList.add((Long) value);
-        } else if (value.getClass() == Integer.class) {
-            jsonList.add((Integer) value);
-        } else if (value.getClass() == Float.class) {
-            jsonList.add((Float) value);
-        } else if (value.getClass() == Double.class) {
-            jsonList.add((Double) value);
-        } else if (value.getClass() == Byte.class) {
-            jsonList.add((Byte) value);
-        } else if (value.getClass() == Short.class) {
-            jsonList.add((Short) value);
-        } else if (value.getClass() == String.class) {
-            jsonList.add((String) value);
-        } else if (value instanceof ObjectNode) {
-            jsonList.add((ObjectNode) value);
-        } else if (value instanceof ArrayNode) {
-            jsonList.add((ArrayNode) value);
-        } else {
-            jsonList.add(value.toString());
-        }
-    }
-
-    private static void putObject(final ObjectNode jsonMap, final String key, final Object value) {
-        if (value == null) {
-            jsonMap.put(key, (JsonNode) null);
-        } else if (value.getClass() == Boolean.class) {
-            jsonMap.put(key, (Boolean) value);
-        } else if (value.getClass() == Long.class) {
-            jsonMap.put(key, (Long) value);
-        } else if (value.getClass() == Integer.class) {
-            jsonMap.put(key, (Integer) value);
-        } else if (value.getClass() == Float.class) {
-            jsonMap.put(key, (Float) value);
-        } else if (value.getClass() == Double.class) {
-            jsonMap.put(key, (Double) value);
-        } else if (value.getClass() == Short.class) {
-            jsonMap.put(key, (Short) value);
-        } else if (value.getClass() == Byte.class) {
-            jsonMap.put(key, (Byte) value);
-        } else if (value.getClass() == String.class) {
-            jsonMap.put(key, (String) value);
-        } else if (value instanceof ObjectNode) {
-            jsonMap.put(key, (ObjectNode) value);
-        } else if (value instanceof ArrayNode) {
-            jsonMap.put(key, (ArrayNode) value);
-        } else {
-            jsonMap.put(key, value.toString());
-        }
-    }
-
-    private static Map<String, Object> createPropertyMap(final AtlasElement element, final List<String> propertyKeys,
-                                                         final ElementPropertiesRule rule, final boolean normalized) {
-        final Map<String, Object> map = new HashMap<String, Object>();
-        final List<String> propertyKeyList;
-        if (normalized) {
-            final List<String> sorted = new ArrayList<String>(element.getPropertyKeys());
-            Collections.sort(sorted);
-            propertyKeyList = sorted;
-        } else {
-            propertyKeyList = new ArrayList<String>(element.getPropertyKeys());
-        }
-
-        if (propertyKeys == null) {
-            for (String key : propertyKeyList) {
-                final Object valToPutInMap = element.getProperty(key, Object.class);
-                if (valToPutInMap != null) {
-                    map.put(key, valToPutInMap);
-                }
-            }
-        } else {
-            if (rule == ElementPropertiesRule.INCLUDE) {
-                for (String key : propertyKeys) {
-                    final Object valToPutInMap = element.getProperty(key, Object.class);
-                    if (valToPutInMap != null) {
-                        map.put(key, valToPutInMap);
-                    }
-                }
-            } else {
-                for (String key : propertyKeyList) {
-                    if (!propertyKeys.contains(key)) {
-                        final Object valToPutInMap = element.getProperty(key, Object.class);
-                        if (valToPutInMap != null) {
-                            map.put(key, valToPutInMap);
-                        }
-                    }
-                }
-            }
-        }
-
-        return map;
-    }
-
-    private static Object getValue(Object value, final boolean includeType) {
-
-        Object returnValue = value;
-
-        // if the includeType is set to true then show the data types of the properties
-        if (includeType) {
-
-            // type will be one of: map, list, string, long, int, double, float.
-            // in the event of a complex object it will call a toString and store as a
-            // string
-            String type = determineType(value);
-
-            ObjectNode valueAndType = JSON_NODE_FACTORY.objectNode();
-            valueAndType.put(AtlasGraphSONTokens.TYPE, type);
-
-            if (type.equals(AtlasGraphSONTokens.TYPE_LIST)) {
-
-                // values of lists must be accumulated as ObjectNode objects under the value key.
-                // will return as a ArrayNode. called recursively to traverse the entire
-                // object graph of each item in the array.
-                ArrayNode list = (ArrayNode) value;
-
-                // there is a set of values that must be accumulated as an array under a key
-                ArrayNode valueArray = valueAndType.putArray(AtlasGraphSONTokens.VALUE);
-                for (int ix = 0; ix < list.size(); ix++) {
-                    // the value of each item in the array is a node object from an ArrayNode...must
-                    // get the value of it.
-                    addObject(valueArray, getValue(getTypedValueFromJsonNode(list.get(ix)), includeType));
-                }
-
-            } else if (type.equals(AtlasGraphSONTokens.TYPE_MAP)) {
-
-                // maps are converted to a ObjectNode.  called recursively to traverse
-                // the entire object graph within the map.
-                ObjectNode convertedMap = JSON_NODE_FACTORY.objectNode();
-                ObjectNode jsonObject = (ObjectNode) value;
-                Iterator<?> keyIterator = jsonObject.fieldNames();
-                while (keyIterator.hasNext()) {
-                    Object key = keyIterator.next();
-
-                    // no need to getValue() here as this is already a ObjectNode and should have type info
-                    convertedMap.put(key.toString(), jsonObject.get(key.toString()));
-                }
-
-                valueAndType.put(AtlasGraphSONTokens.VALUE, convertedMap);
-            } else {
-
-                // this must be a primitive value or a complex object.  if a complex
-                // object it will be handled by a call to toString and stored as a
-                // string value
-                putObject(valueAndType, AtlasGraphSONTokens.VALUE, value);
-            }
-
-            // this goes back as a JSONObject with data type and value
-            returnValue = valueAndType;
-        }
-
-        return returnValue;
-    }
-
-    private static Object getTypedValueFromJsonNode(JsonNode node) {
-        Object theValue = null;
-
-        if (node != null && !node.isNull()) {
-            if (node.isBoolean()) {
-                theValue = node.booleanValue();
-            } else if (node.isDouble()) {
-                theValue = node.doubleValue();
-            } else if (node.isFloatingPointNumber()) {
-                theValue = node.floatValue();
-            } else if (node.isInt()) {
-                theValue = node.intValue();
-            } else if (node.isLong()) {
-                theValue = node.longValue();
-            } else if (node.isTextual()) {
-                theValue = node.textValue();
-            } else if (node.isArray()) {
-                // this is an array so just send it back so that it can be
-                // reprocessed to its primitive components
-                theValue = node;
-            } else if (node.isObject()) {
-                // this is an object so just send it back so that it can be
-                // reprocessed to its primitive components
-                theValue = node;
-            } else {
-                theValue = node.textValue();
-            }
-        }
-
-        return theValue;
-    }
-
-    private static List<Object> convertArrayToList(final Object value) {
-        final ArrayList<Object> list = new ArrayList<Object>();
-        int arrlength = Array.getLength(value);
-        for (int i = 0; i < arrlength; i++) {
-            Object object = Array.get(value, i);
-            list.add(object);
-        }
-        return list;
-    }
-
-    private static String determineType(final Object value) {
-        String type = AtlasGraphSONTokens.TYPE_STRING;
-        if (value == null) {
-            type = AtlasGraphSONTokens.TYPE_UNKNOWN;
-        } else if (value.getClass() == Double.class) {
-            type = AtlasGraphSONTokens.TYPE_DOUBLE;
-        } else if (value.getClass() == Float.class) {
-            type = AtlasGraphSONTokens.TYPE_FLOAT;
-        } else if (value.getClass() == Byte.class) {
-            type = AtlasGraphSONTokens.TYPE_BYTE;
-        } else if (value.getClass() == Short.class) {
-            type = AtlasGraphSONTokens.TYPE_SHORT;
-        } else if (value.getClass() == Integer.class) {
-            type = AtlasGraphSONTokens.TYPE_INTEGER;
-        } else if (value.getClass() == Long.class) {
-            type = AtlasGraphSONTokens.TYPE_LONG;
-        } else if (value.getClass() == Boolean.class) {
-            type = AtlasGraphSONTokens.TYPE_BOOLEAN;
-        } else if (value instanceof ArrayNode) {
-            type = AtlasGraphSONTokens.TYPE_LIST;
-        } else if (value instanceof ObjectNode) {
-            type = AtlasGraphSONTokens.TYPE_MAP;
-        }
-
-        return type;
-    }
-
-    static class ElementFactory {
-
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/NativeTitan1GraphQuery.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/NativeTitan1GraphQuery.java
deleted file mode 100644
index 733964d..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/NativeTitan1GraphQuery.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.query;
-
-import com.thinkaurelius.titan.core.TitanEdge;
-import com.thinkaurelius.titan.core.TitanGraphQuery;
-import com.thinkaurelius.titan.core.TitanVertex;
-import com.thinkaurelius.titan.core.attribute.Contain;
-import com.thinkaurelius.titan.core.attribute.Text;
-import com.thinkaurelius.titan.graphdb.query.TitanPredicate;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery.MatchingOperator;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery.QueryOperator;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.repository.graphdb.tinkerpop.query.NativeTinkerpopGraphQuery;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Edge;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Graph;
-import org.apache.atlas.repository.graphdb.titan1.Titan1GraphDatabase;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Vertex;
-import org.apache.tinkerpop.gremlin.process.traversal.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.*;
-
-/**
- * Titan 1.0.0 implementation of NativeTinkerpopGraphQuery.
- */
-public class NativeTitan1GraphQuery implements NativeTinkerpopGraphQuery<Titan1Vertex, Titan1Edge> {
-
-    private Titan1Graph graph;
-    private TitanGraphQuery<?> query;
-
-    public NativeTitan1GraphQuery(Titan1Graph graph) {
-        this.query = Titan1GraphDatabase.getGraphInstance().query();
-        this.graph = graph;
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> vertices() {
-        Iterable<TitanVertex> it = query.vertices();
-        return graph.wrapVertices(it);
-    }
-
-    @Override
-    public Iterable<AtlasEdge<Titan1Vertex, Titan1Edge>> edges() {
-        Iterable<TitanEdge> it = query.edges();
-        return graph.wrapEdges(it);
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> vertices(int limit) {
-        Iterable<TitanVertex> it = query.limit(limit).vertices();
-        return graph.wrapVertices(it);
-    }
-
-    @Override
-    public Iterable<AtlasVertex<Titan1Vertex, Titan1Edge>> vertices(int offset, int limit) {
-        List<Vertex>               result = new ArrayList<>(limit);
-        Iterator<? extends Vertex> iter   = query.limit(offset + limit).vertices().iterator();
-
-        for (long resultIdx = 0; iter.hasNext() && result.size() < limit; resultIdx++) {
-            if (resultIdx < offset) {
-                continue;
-            }
-
-            result.add(iter.next());
-        }
-
-        return graph.wrapVertices(result);
-    }
-
-    @Override
-    public void in(String propertyName, Collection<? extends Object> values) {
-        query.has(propertyName, Contain.IN, values);
-
-    }
-
-    @Override
-    public void has(String propertyName, QueryOperator op, Object value) {
-        TitanPredicate pred;
-        if (op instanceof ComparisionOperator) {
-            Compare c = getGremlinPredicate((ComparisionOperator) op);
-            pred = TitanPredicate.Converter.convert(c);
-        } else {
-            pred = getGremlinPredicate((MatchingOperator)op);
-        }
-        query.has(propertyName, pred, value);
-    }
-
-    private Text getGremlinPredicate(MatchingOperator op) {
-        switch (op) {
-            case CONTAINS:
-                return Text.CONTAINS;
-            case PREFIX:
-                return Text.PREFIX;
-            case SUFFIX:
-                return Text.CONTAINS_REGEX;
-            case REGEX:
-                return Text.REGEX;
-            default:
-                throw new RuntimeException("Unsupported matching operator:" + op);
-        }
-    }
-
-    private Compare getGremlinPredicate(ComparisionOperator op) {
-        switch (op) {
-            case EQUAL:
-                return Compare.eq;
-            case GREATER_THAN:
-                return Compare.gt;
-            case GREATER_THAN_EQUAL:
-                return Compare.gte;
-            case LESS_THAN:
-                return Compare.lt;
-            case LESS_THAN_EQUAL:
-                return Compare.lte;
-            case NOT_EQUAL:
-                return Compare.neq;
-
-            default:
-                throw new RuntimeException("Unsupported comparison operator:" + op);
-        }
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/Titan1GraphQuery.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/Titan1GraphQuery.java
deleted file mode 100644
index dd0176b..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/query/Titan1GraphQuery.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.query;
-
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
-import org.apache.atlas.repository.graphdb.tinkerpop.query.TinkerpopGraphQuery;
-import org.apache.atlas.repository.graphdb.tinkerpop.query.NativeTinkerpopGraphQuery;
-import org.apache.atlas.repository.graphdb.tinkerpop.query.NativeTinkerpopQueryFactory;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Edge;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Graph;
-import org.apache.atlas.repository.graphdb.titan1.Titan1Vertex;
-/**
- * Titan 1.0.0 implementation of TitanGraphQuery.
- */
-public class Titan1GraphQuery extends TinkerpopGraphQuery<Titan1Vertex, Titan1Edge>
-        implements NativeTinkerpopQueryFactory<Titan1Vertex, Titan1Edge> {
-
-    public Titan1GraphQuery(Titan1Graph graph, boolean isChildQuery) {
-        super(graph, isChildQuery);
-    }
-
-    public Titan1GraphQuery(Titan1Graph graph) {
-        super(graph);
-    }
-
-    @Override
-    public AtlasGraphQuery<Titan1Vertex, Titan1Edge> createChildQuery() {
-        return new Titan1GraphQuery((Titan1Graph) graph, true);
-    }
-
-    @Override
-    protected NativeTinkerpopQueryFactory<Titan1Vertex, Titan1Edge> getQueryFactory() {
-        return this;
-    }
-
-    @Override
-    public NativeTinkerpopGraphQuery<Titan1Vertex, Titan1Edge> createNativeTinkerpopQuery() {
-        return new NativeTitan1GraphQuery((Titan1Graph) graph);
-    }
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigDecimalSerializer.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigDecimalSerializer.java
deleted file mode 100644
index c1a096d..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigDecimalSerializer.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.serializer;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import com.thinkaurelius.titan.core.attribute.AttributeSerializer;
-import com.thinkaurelius.titan.diskstorage.ScanBuffer;
-import com.thinkaurelius.titan.diskstorage.WriteBuffer;
-/**
- * Serializer for BigDecimal values.
- */
-public class BigDecimalSerializer implements AttributeSerializer<BigDecimal> {
-
-    private final BigIntegerSerializer bigIntegerDelegate = new BigIntegerSerializer();
-
-    @Override
-    public BigDecimal read(ScanBuffer buffer) {
-        BigInteger unscaledVal = bigIntegerDelegate.read(buffer);
-        int scale = buffer.getInt();
-        return new BigDecimal(unscaledVal, scale);
-    }
-
-    @Override
-    public void write(WriteBuffer buffer, BigDecimal attribute) {
-        BigInteger unscaledVal = attribute.unscaledValue();
-        int scale = attribute.scale();
-        bigIntegerDelegate.write(buffer, unscaledVal);
-        buffer.putInt(scale);
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigIntegerSerializer.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigIntegerSerializer.java
deleted file mode 100644
index dfda9f6..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/BigIntegerSerializer.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.serializer;
-
-import java.math.BigInteger;
-
-import com.thinkaurelius.titan.core.attribute.AttributeSerializer;
-import com.thinkaurelius.titan.diskstorage.ScanBuffer;
-import com.thinkaurelius.titan.diskstorage.WriteBuffer;
-import com.thinkaurelius.titan.graphdb.database.serialize.attribute.ByteArraySerializer;
-
-/**
- * Serializer for BigInteger values.
- */
-public class BigIntegerSerializer implements AttributeSerializer<BigInteger> {
-
-    private final ByteArraySerializer delegate = new ByteArraySerializer();
-
-    @Override
-    public BigInteger read(ScanBuffer buffer) {
-        byte[] value = delegate.read(buffer);
-        return new BigInteger(value);
-    }
-
-    @Override
-    public void write(WriteBuffer buffer, BigInteger attribute) {
-        byte[] value = attribute.toByteArray();
-        delegate.write(buffer, value);
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/StringListSerializer.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/StringListSerializer.java
deleted file mode 100644
index eb99fae..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/StringListSerializer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.serializer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import com.thinkaurelius.titan.core.attribute.AttributeSerializer;
-import com.thinkaurelius.titan.diskstorage.ScanBuffer;
-import com.thinkaurelius.titan.diskstorage.WriteBuffer;
-import com.thinkaurelius.titan.graphdb.database.idhandling.VariableLong;
-import com.thinkaurelius.titan.graphdb.database.serialize.attribute.StringSerializer;
-/**
- * Serializer for String lists.
- */
-public class StringListSerializer implements AttributeSerializer<List<String>> {
-
-    private final StringSerializer stringSerializer = new StringSerializer();
-
-    @Override
-    public List<String> read(ScanBuffer buffer) {
-        int length = (int)VariableLong.readPositive(buffer);
-        List<String> result = new ArrayList<String>(length);
-        for(int i = 0; i < length; i++) {
-            result.add(stringSerializer.read(buffer));
-        }
-        return result;
-    }
-
-    @Override
-    public void write(WriteBuffer buffer, List<String> attributes) {
-        VariableLong.writePositive(buffer, attributes.size());
-        for(String attr : attributes) {
-            stringSerializer.write(buffer, attr);
-        }
-    }
-
-}
diff --git a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/TypeCategorySerializer.java b/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/TypeCategorySerializer.java
deleted file mode 100644
index c3e2d1c..0000000
--- a/graphdb/titan1/src/main/java/org/apache/atlas/repository/graphdb/titan1/serializer/TypeCategorySerializer.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1.serializer;
-
-import org.apache.atlas.typesystem.types.DataTypes.TypeCategory;
-
-import com.thinkaurelius.titan.graphdb.database.serialize.attribute.EnumSerializer;
-
-/**
- * Serializer for TypeCategory value.
- */
-public class TypeCategorySerializer extends EnumSerializer<TypeCategory> {
-    public TypeCategorySerializer() {
-        super(TypeCategory.class);
-    }
-}
diff --git a/graphdb/titan1/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory b/graphdb/titan1/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
deleted file mode 100644
index 24c8a75..0000000
--- a/graphdb/titan1/src/main/resources/META-INF/services/javax.script.ScriptEngineFactory
+++ /dev/null
@@ -1 +0,0 @@
-org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngineFactory
diff --git a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/AbstractGraphDatabaseTest.java b/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/AbstractGraphDatabaseTest.java
deleted file mode 100644
index 06e2785..0000000
--- a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/AbstractGraphDatabaseTest.java
+++ /dev/null
@@ -1,189 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import org.apache.atlas.graph.GraphSandboxUtil;
-import org.apache.atlas.repository.Constants;
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.AfterMethod;
-import org.testng.annotations.BeforeClass;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-/**
- *
- */
-public abstract class AbstractGraphDatabaseTest {
-
-    protected static final String WEIGHT_PROPERTY = "weight";
-    protected static final String TRAIT_NAMES = Constants.TRAIT_NAMES_PROPERTY_KEY;
-    protected static final String TYPE_PROPERTY_NAME = "__type";
-    protected static final String TYPESYSTEM = "TYPESYSTEM";
-
-    private static final String BACKING_INDEX_NAME = "backing";
-
-    private AtlasGraph<?, ?> graph = null;
-
-    @BeforeClass
-    public static void createIndices() {
-        GraphSandboxUtil.create();
-
-        Titan1GraphDatabase db = new Titan1GraphDatabase();
-        AtlasGraphManagement mgmt = db.getGraph().getManagementSystem();
-
-        if (mgmt.getGraphIndex(BACKING_INDEX_NAME) == null) {
-            mgmt.createVertexIndex(BACKING_INDEX_NAME, Constants.BACKING_INDEX,
-                    Collections.<AtlasPropertyKey>emptyList());
-        }
-        mgmt.makePropertyKey("age13", Integer.class, AtlasCardinality.SINGLE);
-
-        createIndices(mgmt, "name", String.class, false, AtlasCardinality.SINGLE);
-        createIndices(mgmt, WEIGHT_PROPERTY, Integer.class, false, AtlasCardinality.SINGLE);
-        createIndices(mgmt, "size15", String.class, false, AtlasCardinality.SINGLE);
-        createIndices(mgmt, "typeName", String.class, false, AtlasCardinality.SINGLE);
-        createIndices(mgmt, "__type", String.class, false, AtlasCardinality.SINGLE);
-        createIndices(mgmt, Constants.GUID_PROPERTY_KEY, String.class, true, AtlasCardinality.SINGLE);
-        createIndices(mgmt, Constants.TRAIT_NAMES_PROPERTY_KEY, String.class, false, AtlasCardinality.SET);
-        createIndices(mgmt, Constants.SUPER_TYPES_PROPERTY_KEY, String.class, false, AtlasCardinality.SET);
-        mgmt.commit();
-    }
-
-    @AfterMethod
-    public void commitGraph() {
-        //force any pending actions to be committed so we can be sure they don't cause errors.
-        pushChangesAndFlushCache();
-        getGraph().commit();
-    }
-
-    @AfterClass
-    public static void cleanUp() {
-        Titan1Graph graph = new Titan1Graph();
-        graph.clear();
-
-    }
-
-    protected <V, E> void pushChangesAndFlushCache() {
-        getGraph().commit();
-    }
-
-    private static void createIndices(AtlasGraphManagement management, String propertyName, Class propertyClass,
-            boolean isUnique, AtlasCardinality cardinality) {
-
-        if (management.containsPropertyKey(propertyName)) {
-            //index was already created
-            return;
-        }
-
-        AtlasPropertyKey key = management.makePropertyKey(propertyName, propertyClass, cardinality);
-        try {
-            if (propertyClass != Integer.class) {
-                management.addVertexIndexKey(BACKING_INDEX_NAME, key);
-            }
-        } catch(Throwable t) {
-            //ok
-            t.printStackTrace();
-        }
-        try {
-            management.createExactMatchIndex(propertyName, isUnique, Collections.singletonList(key));
-
-        } catch(Throwable t) {
-            //ok
-            t.printStackTrace();
-        }
-
-
-    }
-
-
-
-
-    protected final <V, E> AtlasGraph<V, E> getGraph() {
-        if (graph == null) {
-            graph = new Titan1Graph();
-        }
-        return (AtlasGraph<V, E>)graph;
-    }
-
-    protected Titan1Graph getTitan1Graph() {
-        AtlasGraph g = getGraph();
-        return (Titan1Graph)g;
-    }
-
-
-    protected List<AtlasVertex> newVertices = new ArrayList<>();
-
-    protected final <V, E> AtlasVertex<V, E> createVertex(AtlasGraph<V, E> theGraph) {
-        AtlasVertex<V, E> vertex = theGraph.addVertex();
-        newVertices.add(vertex);
-        return vertex;
-    }
-
-    @AfterMethod
-    public void removeVertices() {
-        for(AtlasVertex vertex : newVertices) {
-            if (vertex.exists()) {
-                getGraph().removeVertex(vertex);
-            }
-        }
-        getGraph().commit();
-        newVertices.clear();
-    }
-    protected void runSynchronouslyInNewThread(final Runnable r) throws Throwable {
-
-        RunnableWrapper wrapper = new RunnableWrapper(r);
-        Thread th = new Thread(wrapper);
-        th.start();
-        th.join();
-        Throwable ex = wrapper.getExceptionThrown();
-        if (ex != null) {
-            throw ex;
-        }
-    }
-
-    private static final class RunnableWrapper implements Runnable {
-        private final Runnable r;
-        private Throwable exceptionThrown = null;
-
-        private RunnableWrapper(Runnable r) {
-            this.r = r;
-        }
-
-        @Override
-        public void run() {
-            try {
-                r.run();
-            } catch(Throwable e) {
-                exceptionThrown = e;
-            }
-
-        }
-
-        public Throwable getExceptionThrown() {
-            return exceptionThrown;
-        }
-    }
-
-}
diff --git a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/GraphQueryTest.java b/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/GraphQueryTest.java
deleted file mode 100644
index 45fbbea..0000000
--- a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/GraphQueryTest.java
+++ /dev/null
@@ -1,451 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-
-
-import static org.testng.AssertJUnit.assertEquals;
-import static org.testng.AssertJUnit.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.testng.annotations.Test;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Collections2;
-
-
-
-/**
- * Tests for Titan1GraphQuery.
- */
-@Test
-public class GraphQueryTest extends AbstractGraphDatabaseTest {
-
-
-    @Test
-    public <V, E> void testQueryThatCannotRunInMemory() throws AtlasException {
-        AtlasGraph<V, E> graph = getGraph();
-        AtlasVertex<V, E> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-
-        AtlasVertex<V, E> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-
-        graph.commit();
-
-        AtlasVertex<V, E> v4 = createVertex(graph);
-        v4.setProperty("name", "Fred");
-        v4.setProperty("size15", "15");
-
-        AtlasGraphQuery q = graph.query();
-        q.has("name", ComparisionOperator.NOT_EQUAL, "George");
-        q.has("size15", "15");
-        graph.commit();
-        pause(); //pause to let the index get updated
-
-        assertQueryMatches(q, v1, v3, v4);
-
-    }
-
-    @Test
-    public  void testCombinationOfAndsAndOrs() throws AtlasException {
-        Titan1Graph graph = getTitan1Graph();
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-        v1.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v2 = createVertex(graph);
-        v2.setProperty("name", "George");
-        v2.setProperty("size15", "16");
-        v2.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v3 = createVertex(graph);
-        v3.setProperty("name", "Jane");
-        v3.setProperty("size15", "17");
-        v3.setProperty("typeName", "Person");
-
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v4 = createVertex(graph);
-        v4.setProperty("name", "Bob");
-        v4.setProperty("size15", "18");
-        v4.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v5 = createVertex(graph);
-        v5.setProperty("name", "Julia");
-        v5.setProperty("size15", "19");
-        v5.setProperty("typeName", "Manager");
-
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("typeName", "Person");
-        //initially match
-        AtlasGraphQuery inner1a = q.createChildQuery();
-        AtlasGraphQuery inner1b = q.createChildQuery();
-        inner1a.has("name", "Fred");
-        inner1b.has("name", "Jane");
-        q.or(toList(inner1a, inner1b));
-
-
-        AtlasGraphQuery inner2a = q.createChildQuery();
-        AtlasGraphQuery inner2b = q.createChildQuery();
-        AtlasGraphQuery inner2c = q.createChildQuery();
-        inner2a.has("size15", "18");
-        inner2b.has("size15", "15");
-        inner2c.has("size15", "16");
-        q.or(toList(inner2a, inner2b, inner2c));
-
-        assertQueryMatches(q, v1);
-        graph.commit();
-        pause(); //let the index update
-        assertQueryMatches(q, v1);
-    }
-
-    @Test
-    public  void testWithinStep() throws AtlasException {
-        Titan1Graph graph = getTitan1Graph();
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-        v1.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v2 = createVertex(graph);
-        v2.setProperty("name", "George");
-        v2.setProperty("size15", "16");
-        v2.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v3 = createVertex(graph);
-        v3.setProperty("name", "Jane");
-        v3.setProperty("size15", "17");
-        v3.setProperty("typeName", "Person");
-
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v4 = createVertex(graph);
-        v4.setProperty("name", "Bob");
-        v4.setProperty("size15", "18");
-        v4.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v5 = createVertex(graph);
-        v5.setProperty("name", "Julia");
-        v5.setProperty("size15", "19");
-        v5.setProperty("typeName", "Manager");
-
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("typeName", "Person");
-        //initially match
-        q.in("name", toList("Fred", "Jane"));
-        q.in("size15", toList("18", "15", "16"));
-
-        assertQueryMatches(q, v1);
-        graph.commit();
-        pause(); //let the index update
-        assertQueryMatches(q, v1);
-    }
-
-    @Test
-    public  void testWithinStepWhereGraphIsStale() throws AtlasException {
-        Titan1Graph graph = getTitan1Graph();
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-        v1.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v2 = createVertex(graph);
-        v2.setProperty("name", "George");
-        v2.setProperty("size15", "16");
-        v2.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v3 = createVertex(graph);
-        v3.setProperty("name", "Jane");
-        v3.setProperty("size15", "17");
-        v3.setProperty("typeName", "Person");
-
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v4 = createVertex(graph);
-        v4.setProperty("name", "Bob");
-        v4.setProperty("size15", "18");
-        v4.setProperty("typeName", "Person");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v5 = createVertex(graph);
-        v5.setProperty("name", "Julia");
-        v5.setProperty("size15", "19");
-        v5.setProperty("typeName", "Manager");
-
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("typeName", "Person");
-        //initially match
-        q.in("name", toList("Fred", "Jane"));
-
-        graph.commit();
-        pause(); //let the index update
-        assertQueryMatches(q, v1, v3);
-      //make v3 no longer match the query.  Within step should filter out the vertex since it no longer matches.
-        v3.setProperty("name", "Janet");
-        assertQueryMatches(q, v1);
-    }
-
-    @Test
-    public  void testSimpleOrQuery() throws AtlasException {
-        Titan1Graph graph = getTitan1Graph();
-
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-
-        graph.commit();
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v4 = createVertex(graph);
-        v4.setProperty("name", "Fred");
-        v4.setProperty("size15", "15");
-
-        AtlasVertex<Titan1Vertex, Titan1Edge> v5 = createVertex(graph);
-        v5.setProperty("name", "George");
-        v5.setProperty("size15", "16");
-
-        AtlasGraphQuery q = graph.query();
-        AtlasGraphQuery inner1 = q.createChildQuery().has("name", "Fred");
-        AtlasGraphQuery inner2 = q.createChildQuery().has("size15", "15");
-        q.or(toList(inner1, inner2));
-        assertQueryMatches(q, v1, v2, v3, v4);
-        graph.commit();
-        pause(); //pause to let the indexer get updated (this fails frequently without a pause)
-        assertQueryMatches(q, v1, v2, v3, v4);
-    }
-
-
-
-
-    @Test
-    public <V, E> void testQueryMatchesAddedVertices() throws AtlasException {
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-
-        AtlasVertex<V, E> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-
-        graph.commit();
-
-        AtlasVertex<V, E> v4 = createVertex(graph);
-        v4.setProperty("name", "Fred");
-        v4.setProperty("size15", "15");
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("name", "Fred");
-        q.has("size15", "15");
-
-        assertQueryMatches(q, v1, v4);
-        graph.commit();
-        assertQueryMatches(q, v1, v4);
-
-    }
-
-
-    @Test
-    public <V, E> void testQueryDoesNotMatchRemovedVertices() throws AtlasException {
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-
-        AtlasVertex<V, E> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v4 = createVertex(graph);
-        v4.setProperty("name", "Fred");
-        v4.setProperty("size15", "15");
-
-        graph.commit();
-
-        graph.removeVertex(v1);
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("name", "Fred");
-        q.has("size15", "15");
-
-        assertQueryMatches(q, v4);
-        graph.commit();
-
-        assertQueryMatches(q, v4);
-    }
-
-    @Test
-    public <V, E> void testQueryDoesNotMatchUncommittedAddedAndRemovedVertices() throws AtlasException {
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> v1 = createVertex(graph);
-
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-
-        AtlasVertex<V, E> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-
-        AtlasVertex<V, E> v4 = createVertex(graph);
-        v4.setProperty("name", "Fred");
-        v4.setProperty("size15", "15");
-
-
-        AtlasGraphQuery q = getGraphQuery();
-        q.has("name", "Fred");
-        q.has("size15", "15");
-
-        assertQueryMatches(q, v1, v4);
-
-        graph.removeVertex(v1);
-
-
-        assertQueryMatches(q, v4);
-        graph.commit();
-
-        assertQueryMatches(q, v4);
-    }
-
-
-    @Test
-    public <V, E> void testQueryResultsReflectPropertyAdd() throws AtlasException {
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> v1 = createVertex(graph);
-        v1.setProperty("name", "Fred");
-        v1.setProperty("size15", "15");
-        v1.addProperty(TRAIT_NAMES, "trait1");
-        v1.addProperty(TRAIT_NAMES, "trait2");
-
-        AtlasVertex<V, E> v2 = createVertex(graph);
-        v2.setProperty("name", "Fred");
-        v2.addProperty(TRAIT_NAMES, "trait1");
-
-        AtlasVertex<V, E> v3 = createVertex(graph);
-        v3.setProperty("size15", "15");
-        v3.addProperty(TRAIT_NAMES, "trait2");
-
-        AtlasGraphQuery query = getGraphQuery();
-        query.has("name", "Fred");
-        query.has(TRAIT_NAMES, "trait1");
-        query.has("size15", "15");
-
-        assertQueryMatches(query, v1);
-        //make v3 match the query
-        v3.setProperty("name", "Fred");
-        v3.addProperty(TRAIT_NAMES, "trait1");
-        assertQueryMatches(query, v1, v3);
-        v3.removeProperty(TRAIT_NAMES);
-        assertQueryMatches(query, v1);
-        v3.addProperty(TRAIT_NAMES, "trait2");
-        assertQueryMatches(query, v1);
-        v1.removeProperty(TRAIT_NAMES);
-        assertQueryMatches(query);
-        graph.commit();
-        assertQueryMatches(query);
-
-    }
-
-    private static <T> List<T> toList(Iterable<T> itr) {
-        List<T> result = new ArrayList<T>();
-        for(T object : itr) {
-            result.add(object);
-        }
-        return result;
-
-    }
-
-    private <V, E> void assertQueryMatches(AtlasGraphQuery expr, AtlasVertex... expectedResults) throws AtlasException {
-
-        //getGraph().commit();
-        Collection<AtlasVertex<Titan1Vertex, Titan1Edge>> temp = toList(expr.vertices());
-        //filter out vertices from previous test executions
-        Collection<AtlasVertex<Titan1Vertex, Titan1Edge>> result =
-                Collections2.filter(temp, new Predicate<AtlasVertex<Titan1Vertex, Titan1Edge>>() {
-
-                    @Override
-                    public boolean apply(AtlasVertex<Titan1Vertex, Titan1Edge> input) {
-                        return newVertices.contains(input);
-                    }
-
-                });
-        String errorMessage = "Expected/found result sizes differ.  Expected: "
-                + Arrays.asList(expectedResults).toString() +", found: " + result;
-        assertEquals(errorMessage, expectedResults.length, result.size());
-
-        for(AtlasVertex<V, E> v : expectedResults) {
-            assertTrue(result.contains(v));
-        }
-    }
-
-    private static List<Object> toList(Object...objects) {
-        return Arrays.asList(objects);
-    }
-
-    private AtlasGraphQuery<Titan1Vertex, Titan1Edge> getGraphQuery() {
-        return getTitan1Graph().query();
-    }
-
-    private void pause() {
-        try {
-            Thread.sleep(5000);
-        } catch(InterruptedException e) {
-           //ignore
-        }
-    }
-}
diff --git a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/Titan1DatabaseTest.java b/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/Titan1DatabaseTest.java
deleted file mode 100644
index ab2c8c9..0000000
--- a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/Titan1DatabaseTest.java
+++ /dev/null
@@ -1,430 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.graph.GraphSandboxUtil;
-import org.apache.atlas.repository.Constants;
-import org.apache.atlas.repository.graphdb.AtlasCardinality;
-import org.apache.atlas.repository.graphdb.AtlasEdge;
-import org.apache.atlas.repository.graphdb.AtlasEdgeDirection;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.atlas.repository.graphdb.AtlasGraphManagement;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery;
-import org.apache.atlas.repository.graphdb.AtlasGraphQuery.ComparisionOperator;
-import org.apache.atlas.repository.graphdb.AtlasPropertyKey;
-import org.apache.atlas.repository.graphdb.AtlasVertex;
-import org.apache.atlas.typesystem.types.DataTypes.TypeCategory;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.Test;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-
-import static org.testng.Assert.*;
-
-/**
- * Sanity test of basic graph operations using the Titan 0.5.4 graphdb
- * abstraction layer implementation.
- */
-public class Titan1DatabaseTest {
-
-    private AtlasGraph<?, ?> atlasGraph;
-
-    private <V, E> AtlasGraph<V, E> getGraph() {
-        GraphSandboxUtil.create();
-
-        if (atlasGraph == null) {
-            Titan1GraphDatabase db = new Titan1GraphDatabase();
-            atlasGraph = db.getGraph();
-            AtlasGraphManagement mgmt = atlasGraph.getManagementSystem();
-            // create the index (which defines these properties as being mult
-            // many)
-            for (String propertyName : new String[]{"__superTypeNames", "__traitNames"}) {
-                AtlasPropertyKey propertyKey = mgmt.getPropertyKey(propertyName);
-                if (propertyKey == null) {
-                    propertyKey = mgmt.makePropertyKey(propertyName, String.class, AtlasCardinality.SET);
-                    mgmt.createExactMatchIndex(propertyName, false, Collections.singletonList(propertyKey));
-                }
-            }
-            mgmt.commit();
-        }
-        return (AtlasGraph<V, E>) atlasGraph;
-    }
-
-    @AfterClass
-    public void cleanup() {
-        atlasGraph.clear();
-        atlasGraph = null;
-
-    }
-
-    @Test
-    public <V, E> void testPropertyDataTypes() {
-
-        // primitives
-        AtlasGraph<V, E> graph = getGraph();
-
-        testProperty(graph, "booleanProperty", Boolean.TRUE);
-        testProperty(graph, "booleanProperty", Boolean.FALSE);
-        testProperty(graph, "booleanProperty", new Boolean(Boolean.TRUE));
-        testProperty(graph, "booleanProperty", new Boolean(Boolean.FALSE));
-
-        testProperty(graph, "byteProperty", Byte.MAX_VALUE);
-        testProperty(graph, "byteProperty", Byte.MIN_VALUE);
-        testProperty(graph, "byteProperty", new Byte(Byte.MAX_VALUE));
-        testProperty(graph, "byteProperty", new Byte(Byte.MIN_VALUE));
-
-        testProperty(graph, "shortProperty", Short.MAX_VALUE);
-        testProperty(graph, "shortProperty", Short.MIN_VALUE);
-        testProperty(graph, "shortProperty", new Short(Short.MAX_VALUE));
-        testProperty(graph, "shortProperty", new Short(Short.MIN_VALUE));
-
-        testProperty(graph, "intProperty", Integer.MAX_VALUE);
-        testProperty(graph, "intProperty", Integer.MIN_VALUE);
-        testProperty(graph, "intProperty", new Integer(Integer.MAX_VALUE));
-        testProperty(graph, "intProperty", new Integer(Integer.MIN_VALUE));
-
-        testProperty(graph, "longProperty", Long.MIN_VALUE);
-        testProperty(graph, "longProperty", Long.MAX_VALUE);
-        testProperty(graph, "longProperty", new Long(Long.MIN_VALUE));
-        testProperty(graph, "longProperty", new Long(Long.MAX_VALUE));
-
-        testProperty(graph, "doubleProperty", Double.MAX_VALUE);
-        testProperty(graph, "doubleProperty", Double.MIN_VALUE);
-        testProperty(graph, "doubleProperty", new Double(Double.MAX_VALUE));
-        testProperty(graph, "doubleProperty", new Double(Double.MIN_VALUE));
-
-        testProperty(graph, "floatProperty", Float.MAX_VALUE);
-        testProperty(graph, "floatProperty", Float.MIN_VALUE);
-        testProperty(graph, "floatProperty", new Float(Float.MAX_VALUE));
-        testProperty(graph, "floatProperty", new Float(Float.MIN_VALUE));
-
-        // enumerations - TypeCategory
-        testProperty(graph, "typeCategoryProperty", TypeCategory.CLASS);
-
-        // biginteger
-        testProperty(graph, "bigIntegerProperty",
-                new BigInteger(String.valueOf(Long.MAX_VALUE)).multiply(BigInteger.TEN));
-
-        // bigdecimal
-        BigDecimal bigDecimal = new BigDecimal(Double.MAX_VALUE);
-        testProperty(graph, "bigDecimalProperty", bigDecimal.multiply(bigDecimal));
-    }
-
-    private <V, E> void testProperty(AtlasGraph<V, E> graph, String name, Object value) {
-
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        vertex.setProperty(name, value);
-        assertEquals(value, vertex.getProperty(name, value.getClass()));
-        AtlasVertex<V, E> loaded = graph.getVertex(vertex.getId().toString());
-        assertEquals(value, loaded.getProperty(name, value.getClass()));
-    }
-
-    @Test
-    public <V, E> void testMultiplicityOnePropertySupport() {
-
-        AtlasGraph<V, E> graph = (AtlasGraph<V, E>) getGraph();
-
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        vertex.setProperty("name", "Jeff");
-        vertex.setProperty("location", "Littleton");
-        assertEquals("Jeff", vertex.getProperty("name", String.class));
-        assertEquals("Littleton", vertex.getProperty("location", String.class));
-
-        AtlasVertex<V, E> vertexCopy = graph.getVertex(vertex.getId().toString());
-
-        assertEquals("Jeff", vertexCopy.getProperty("name", String.class));
-        assertEquals("Littleton", vertexCopy.getProperty("location", String.class));
-
-        assertTrue(vertexCopy.getPropertyKeys().contains("name"));
-        assertTrue(vertexCopy.getPropertyKeys().contains("location"));
-
-        assertTrue(vertexCopy.getPropertyValues("name", String.class).contains("Jeff"));
-        assertTrue(vertexCopy.getPropertyValues("location", String.class).contains("Littleton"));
-        assertTrue(vertexCopy.getPropertyValues("test", String.class).isEmpty());
-        assertNull(vertexCopy.getProperty("test", String.class));
-
-        vertex.removeProperty("name");
-        assertFalse(vertex.getPropertyKeys().contains("name"));
-        assertNull(vertex.getProperty("name", String.class));
-        assertTrue(vertex.getPropertyValues("name", String.class).isEmpty());
-
-        vertexCopy = graph.getVertex(vertex.getId().toString());
-        assertFalse(vertexCopy.getPropertyKeys().contains("name"));
-        assertNull(vertexCopy.getProperty("name", String.class));
-        assertTrue(vertexCopy.getPropertyValues("name", String.class).isEmpty());
-
-    }
-
-    @Test
-    public <V, E> void testRemoveEdge() {
-
-        AtlasGraph<V, E> graph = (AtlasGraph<V, E>) getGraph();
-        AtlasVertex<V, E> v1 = graph.addVertex();
-        AtlasVertex<V, E> v2 = graph.addVertex();
-
-        AtlasEdge<V, E> edge = graph.addEdge(v1, v2, "knows");
-
-        // make sure the edge exists
-        AtlasEdge<V, E> edgeCopy = graph.getEdge(edge.getId().toString());
-        assertNotNull(edgeCopy);
-        assertEquals(edgeCopy, edge);
-
-        graph.removeEdge(edge);
-
-        edgeCopy = graph.getEdge(edge.getId().toString());
-        // should return null now, since edge was deleted
-        assertNull(edgeCopy);
-
-    }
-
-    @Test
-    public <V, E> void testRemoveVertex() {
-
-        AtlasGraph<V, E> graph = (AtlasGraph<V, E>) getGraph();
-
-        AtlasVertex<V, E> v1 = graph.addVertex();
-
-        assertNotNull(graph.getVertex(v1.getId().toString()));
-
-        graph.removeVertex(v1);
-
-        assertNull(graph.getVertex(v1.getId().toString()));
-    }
-
-    @Test
-    public <V, E> void testGetEdges() {
-
-        AtlasGraph<V, E> graph = (AtlasGraph<V, E>) getGraph();
-        AtlasVertex<V, E> v1 = graph.addVertex();
-        AtlasVertex<V, E> v2 = graph.addVertex();
-        AtlasVertex<V, E> v3 = graph.addVertex();
-
-        AtlasEdge<V, E> knows = graph.addEdge(v2, v1, "knows");
-        AtlasEdge<V, E> eats = graph.addEdge(v3, v1, "eats");
-        AtlasEdge<V, E> drives = graph.addEdge(v3, v2, "drives");
-        AtlasEdge<V, E> sleeps = graph.addEdge(v2, v3, "sleeps");
-
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.IN), knows, eats);
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.OUT));
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.BOTH), knows, eats);
-
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.IN, "knows"), knows);
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.OUT, "knows"));
-        assertEdgesMatch(v1.getEdges(AtlasEdgeDirection.BOTH, "knows"), knows);
-
-        assertEdgesMatch(v2.getEdges(AtlasEdgeDirection.IN), drives);
-        assertEdgesMatch(v2.getEdges(AtlasEdgeDirection.OUT), knows, sleeps);
-        assertEdgesMatch(v2.getEdges(AtlasEdgeDirection.BOTH), knows, sleeps, drives);
-
-        assertEdgesMatch(v2.getEdges(AtlasEdgeDirection.BOTH, "delivers"));
-    }
-
-    private <V, E> void assertEdgesMatch(Iterable<AtlasEdge<V, E>> edgesIt, AtlasEdge<V, E>... expected) {
-        List<AtlasEdge<V, E>> edges = toList(edgesIt);
-        assertEquals(expected.length, edges.size());
-        for (AtlasEdge<V, E> edge : expected) {
-            assertTrue(edges.contains(edge));
-        }
-    }
-
-    @Test
-    public <V, E> void testMultiplictyManyPropertySupport() {
-
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        String vertexId = vertex.getId().toString();
-        vertex.setProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait1");
-        vertex.setProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait2");
-        assertEquals(vertex.getPropertyValues(Constants.TRAIT_NAMES_PROPERTY_KEY, String.class).size(), 2);
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait3");
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait4");
-
-        assertTrue(vertex.getPropertyKeys().contains(Constants.TRAIT_NAMES_PROPERTY_KEY));
-        validateMultManyPropertiesInVertex(vertex);
-        // fetch a copy of the vertex, make sure result
-        // is the same
-
-        validateMultManyPropertiesInVertex(graph.getVertex(vertexId));
-
-    }
-
-    private <V, E> void validateMultManyPropertiesInVertex(AtlasVertex<V, E> vertex) {
-
-        assertTrue(vertex.getPropertyKeys().contains(Constants.TRAIT_NAMES_PROPERTY_KEY));
-        Collection<String> traitNames = vertex.getPropertyValues(Constants.TRAIT_NAMES_PROPERTY_KEY, String.class);
-        assertTrue(traitNames.contains("trait1"));
-        assertTrue(traitNames.contains("trait2"));
-        assertTrue(traitNames.contains("trait3"));
-        assertTrue(traitNames.contains("trait4"));
-
-        try {
-            vertex.getProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, String.class);
-            fail("Expected exception not thrown");
-        } catch (IllegalStateException expected) {
-            // multiple property values exist
-        }
-    }
-
-    @Test
-    public <V, E> void testListProperties() throws AtlasException {
-
-        AtlasGraph<V, E> graph = getGraph();
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        List<String> colorsToSet = new ArrayList<String>();
-        colorsToSet.add("red");
-        colorsToSet.add("blue");
-        colorsToSet.add("green");
-        vertex.setListProperty("colors", colorsToSet);
-        List<String> colors = vertex.getListProperty("colors");
-        assertTrue(colors.contains("red"));
-        assertTrue(colors.contains("blue"));
-        assertTrue(colors.contains("green"));
-
-        AtlasVertex<V, E> vertexCopy = graph.getVertex(vertex.getId().toString());
-        colors = vertexCopy.getListProperty("colors");
-        assertTrue(colors.contains("red"));
-        assertTrue(colors.contains("blue"));
-        assertTrue(colors.contains("green"));
-
-    }
-
-    @Test
-    public <V, E> void testRemoveProperty() {
-
-        AtlasGraph<V, E> graph = getGraph();
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait1");
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait1");
-        vertex.setProperty("name", "Jeff");
-
-        // remove existing property - multiplicity one
-        vertex.removeProperty("jeff");
-
-        assertFalse(vertex.getPropertyKeys().contains("jeff"));
-
-        // remove existing property - multiplicity many
-        vertex.removeProperty(Constants.TRAIT_NAMES_PROPERTY_KEY);
-        assertFalse(vertex.getPropertyKeys().contains(Constants.TRAIT_NAMES_PROPERTY_KEY));
-
-        AtlasVertex<V, E> vertexCopy = graph.getVertex(vertex.getId().toString());
-        assertFalse(vertexCopy.getPropertyKeys().contains("jeff"));
-        assertFalse(vertexCopy.getPropertyKeys().contains(Constants.TRAIT_NAMES_PROPERTY_KEY));
-
-        // remove non-existing property
-        vertex.removeProperty(Constants.TRAIT_NAMES_PROPERTY_KEY);
-        vertex.removeProperty("jeff");
-
-    }
-
-    @Test
-    public <V, E> void getGetGraphQueryForVertices() {
-
-        AtlasGraph<V, E> graph = getGraph();
-
-        AtlasVertex<V, E> v1 = graph.addVertex();
-        AtlasVertex<V, E> v2 = graph.addVertex();
-        AtlasVertex<V, E> v3 = graph.addVertex();
-
-        v1.setProperty("name", "Jeff");
-        v1.setProperty("weight", 1);
-
-        v2.setProperty("name", "Fred");
-        v2.setProperty("weight", 2);
-
-        v3.setProperty("name", "Chris");
-        v3.setProperty("weight", 3);
-
-        AtlasEdge<V, E> knows = graph.addEdge(v2, v1, "knows");
-        knows.setProperty("weight", 1);
-        AtlasEdge<V, E> eats = graph.addEdge(v3, v1, "eats");
-        eats.setProperty("weight", 2);
-        AtlasEdge<V, E> drives = graph.addEdge(v3, v2, "drives");
-        drives.setProperty("weight", 3);
-
-        AtlasEdge<V, E> sleeps = graph.addEdge(v2, v3, "sleeps");
-        sleeps.setProperty("weight", 4);
-
-        testExecuteGraphQuery("name", null, "Jeff", v1);
-        testExecuteGraphQuery("weight", ComparisionOperator.EQUAL, 2, v2);
-        testExecuteGraphQuery("weight", ComparisionOperator.GREATER_THAN_EQUAL, 2, v2, v3);
-        testExecuteGraphQuery("weight", ComparisionOperator.LESS_THAN_EQUAL, 2, v2, v1);
-
-    }
-
-    private <V, E> void testExecuteGraphQuery(String property, ComparisionOperator op, Object value,
-            AtlasVertex<V, E>... expected) {
-        AtlasGraph<V, E> graph = getGraph();
-        AtlasGraphQuery<V, E> query = graph.query();
-        if (op != null) {
-            query.has(property, op, value);
-        } else {
-            query.has(property, value);
-        }
-        Iterable<? extends AtlasVertex<V, E>> result = query.vertices();
-        List<AtlasVertex<V, E>> list = toList(result);
-        assertEquals(expected.length, list.size());
-        for (AtlasVertex<V, E> vertex : expected) {
-            assertTrue(list.contains(vertex));
-        }
-    }
-
-    @Test
-    public <V, E> void testAddMultManyPropertyValueTwice() {
-
-        AtlasGraph<V, E> graph = getGraph();
-        String vertexId;
-
-        AtlasVertex<V, E> vertex = graph.addVertex();
-        vertexId = vertex.getId().toString();
-        vertex.setProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait1");
-        vertex.setProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait1");
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait2");
-        vertex.addProperty(Constants.TRAIT_NAMES_PROPERTY_KEY, "trait2");
-
-        validateDuplicatePropertyVertex(vertex);
-
-        // fetch a copy of the vertex, make sure result is the same
-
-        validateDuplicatePropertyVertex(graph.getVertex(vertexId));
-    }
-
-    private <V, E> void validateDuplicatePropertyVertex(AtlasVertex<V, E> vertex) {
-        assertEquals(2, vertex.getPropertyValues(Constants.TRAIT_NAMES_PROPERTY_KEY, String.class).size());
-        assertTrue(vertex.getPropertyKeys().contains(Constants.TRAIT_NAMES_PROPERTY_KEY));
-        Collection<String> traitNames = vertex.getPropertyValues(Constants.TRAIT_NAMES_PROPERTY_KEY, String.class);
-        assertTrue(traitNames.contains("trait1"));
-        assertTrue(traitNames.contains("trait2"));
-    }
-
-    private static <T> List<T> toList(Iterable<? extends T> iterable) {
-        List<T> result = new ArrayList<T>();
-        for (T item : iterable) {
-            result.add(item);
-        }
-        return result;
-    }
-
-}
diff --git a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/TitanGraphProviderTest.java b/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/TitanGraphProviderTest.java
deleted file mode 100644
index 53148fa..0000000
--- a/graphdb/titan1/src/test/java/org/apache/atlas/repository/graphdb/titan1/TitanGraphProviderTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * 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.atlas.repository.graphdb.titan1;
-
-import org.apache.atlas.ApplicationProperties;
-import org.apache.atlas.AtlasException;
-import org.apache.atlas.graph.GraphSandboxUtil;
-import org.apache.atlas.repository.graphdb.AtlasGraph;
-import org.apache.commons.configuration.Configuration;
-import org.testng.Assert;
-import org.testng.annotations.AfterClass;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.Test;
-
-@Test
-public class TitanGraphProviderTest {
-
-    private Configuration configuration;
-    private AtlasGraph<?, ?> graph;
-
-    @BeforeTest
-    public void setUp() throws AtlasException {
-        GraphSandboxUtil.create();
-
-        //First get Instance
-        graph = new Titan1Graph();
-        configuration = ApplicationProperties.getSubsetConfiguration(ApplicationProperties.get(),
-                Titan1GraphDatabase.GRAPH_PREFIX);
-    }
-
-    @AfterClass
-    public void tearDown() throws Exception {
-        try {
-            graph.shutdown();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        try {
-            graph.clear();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    @Test
-    public void testValidate() throws AtlasException {
-        try {
-            Titan1GraphDatabase.validateIndexBackend(configuration);
-        } catch (Exception e) {
-            Assert.fail("Unexpected exception ", e);
-        }
-
-        //Change backend
-        configuration.setProperty(Titan1GraphDatabase.INDEX_BACKEND_CONF, Titan1GraphDatabase.INDEX_BACKEND_LUCENE);
-        try {
-            Titan1GraphDatabase.validateIndexBackend(configuration);
-            Assert.fail("Expected exception");
-        } catch (Exception e) {
-            Assert.assertEquals(e.getMessage(),
-                    "Configured Index Backend lucene differs from earlier configured "
-                    + "Index Backend elasticsearch. Aborting!");
-        }
-    }
-}
diff --git a/graphdb/titan1/src/test/resources/atlas-application.properties b/graphdb/titan1/src/test/resources/atlas-application.properties
deleted file mode 100644
index af63dd8..0000000
--- a/graphdb/titan1/src/test/resources/atlas-application.properties
+++ /dev/null
@@ -1,97 +0,0 @@
-#
-# 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.
-#
-
-#########  Graph Database to Use #########
-atlas.graphdb.backend=org.apache.atlas.repository.graphdb.titan1.Titan1Database
-
-#########  Atlas Server Configs #########
-atlas.rest.address=http://localhost:31000
-
-#########  Graph Database Configs  #########
-# Graph Storage
-atlas.graph.storage.backend=${graph.storage.backend}
-
-# Graph Search Index Backend
-atlas.graph.index.search.backend=${graph.index.backend}
-
-#Berkeley storage directory
-atlas.graph.storage.directory=${sys:atlas.data}/berkeley
-
-#hbase
-#For standalone mode , specify localhost
-#for distributed mode, specify zookeeper quorum here - For more information refer http://s3.thinkaurelius.com/docs/titan/current/hbase.html#_remote_server_mode_2
-
-atlas.graph.storage.hostname=${graph.storage.hostname}
-atlas.graph.storage.hbase.regions-per-server=1
-atlas.graph.storage.lock.wait-time=10000
-
-#ElasticSearch
-atlas.graph.index.search.directory=${sys:atlas.data}/es
-atlas.graph.index.search.elasticsearch.client-only=false
-atlas.graph.index.search.elasticsearch.local-mode=true
-atlas.graph.index.search.elasticsearch.create.sleep=2000
-
-# Solr cloud mode properties
-atlas.graph.index.search.solr.mode=cloud
-atlas.graph.index.search.solr.zookeeper-url=${solr.zk.address}
-
-
-#########  Hive Lineage Configs  #########
-# This models reflects the base super types for Data and Process
-#atlas.lineage.hive.table.type.name=DataSet
-#atlas.lineage.hive.process.type.name=Process
-#atlas.lineage.hive.process.inputs.name=inputs
-#atlas.lineage.hive.process.outputs.name=outputs
-
-## Schema
-atlas.lineage.hive.table.schema.query.hive_table=hive_table where name='%s'\, columns
-
-#########  Notification Configs  #########
-atlas.notification.embedded=true
-
-atlas.kafka.zookeeper.connect=localhost:19026
-atlas.kafka.bootstrap.servers=localhost:19027
-atlas.kafka.data=${sys:atlas.data}/kafka
-atlas.kafka.zookeeper.session.timeout.ms=4000
-atlas.kafka.zookeeper.sync.time.ms=20
-atlas.kafka.consumer.timeout.ms=100
-atlas.kafka.auto.commit.interval.ms=100
-atlas.kafka.hook.group.id=atlas
-atlas.kafka.entities.group.id=atlas_entities
-
-#########  Entity Audit Configs  #########
-atlas.audit.hbase.tablename=ATLAS_ENTITY_AUDIT_EVENTS
-atlas.audit.zookeeper.session.timeout.ms=1000
-atlas.audit.hbase.zookeeper.quorum=localhost
-atlas.audit.hbase.zookeeper.property.clientPort=19026
-
-#########  Security Properties  #########
-
-# SSL config
-atlas.enableTLS=false
-atlas.server.https.port=31443
-
-#########  Security Properties  #########
-
-hbase.security.authentication=simple
-
-atlas.hook.falcon.synchronous=true
-#########  High Availability Configuration ########
-atlas.server.ha.enabled=false
-#atlas.server.ids=id1
-#atlas.server.address.id1=localhost:21000
diff --git a/pom.xml b/pom.xml
index 4ee2d9e..233506c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -660,28 +660,6 @@
         </profile>
 
         <profile>
-            <!-- Activated by setting -DGRAPH-PROVIDER=titan0 -->
-            <id>graph-provider-titan0</id>
-            <activation>
-                <property>
-                    <name>GRAPH-PROVIDER</name>
-                    <value>titan0</value>
-                </property>
-            </activation>
-            <properties>
-                <!-- Define graph dependency type/version -->
-                <graphGroup>org.apache.atlas</graphGroup>
-                <graphArtifact>atlas-graphdb-titan0</graphArtifact>
-                <skipDocs>false</skipDocs>
-                <graphdb.backend.impl>org.apache.atlas.repository.graphdb.titan0.Titan0GraphDatabase</graphdb.backend.impl>
-                <graph.index.backend>elasticsearch</graph.index.backend>
-                <tests.solr.embedded>false</tests.solr.embedded>
-                <distro.exclude.packages>WEB-INF/lib/titan-*.jar,WEB-INF/lib/je-*.jar,WEB-INF/lib/elasticsearch-*.jar,WEB-INF/lib/lucene-*.jar</distro.exclude.packages>
-            </properties>
-        </profile>
-
-        <profile>
-            <!-- Explicitly activate by setting -DGRAPH-PROVIDER=janus -->
             <id>graph-provider-janus</id>
             <activation>
                 <property>
@@ -702,6 +680,26 @@
         </profile>
 
         <profile>
+            <id>graph-provider-titan0</id>
+            <activation>
+                <property>
+                    <name>GRAPH-PROVIDER</name>
+                    <value>titan0</value>
+                </property>
+            </activation>
+            <properties>
+                <!-- Define graph dependency type/version -->
+                <graphGroup>org.apache.atlas</graphGroup>
+                <graphArtifact>atlas-graphdb-titan0</graphArtifact>
+                <skipDocs>false</skipDocs>
+                <graphdb.backend.impl>org.apache.atlas.repository.graphdb.titan0.Titan0GraphDatabase</graphdb.backend.impl>
+                <graph.index.backend>elasticsearch</graph.index.backend>
+                <tests.solr.embedded>false</tests.solr.embedded>
+                <distro.exclude.packages>WEB-INF/lib/titan-*.jar,WEB-INF/lib/je-*.jar,WEB-INF/lib/elasticsearch-*.jar,WEB-INF/lib/lucene-*.jar</distro.exclude.packages>
+            </properties>
+        </profile>
+
+        <profile>
             <id>skipMinify</id>
             <properties>
                 <project.build.dashboardv2.gruntBuild>build</project.build.dashboardv2.gruntBuild>
