diff --git a/pom.xml b/pom.xml
index d2d6535..3cd33e9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -432,7 +432,7 @@
     <dependency>
       <groupId>com.tinkerpop.blueprints.impls.ramcloud</groupId>
       <artifactId>blueprints-ramcloud-graph</artifactId>
-      <version>2.0.0</version>
+      <version>2.5.0</version>
     </dependency>
   </dependencies>
 </project>
diff --git a/src/main/java/net/onrc/onos/graph/DBOperation.java b/src/main/java/net/onrc/onos/graph/DBOperation.java
index b58198a..d965ad5 100644
--- a/src/main/java/net/onrc/onos/graph/DBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/DBOperation.java
@@ -20,6 +20,7 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage;
+import net.onrc.onos.ofcontroller.util.FlowEntryId;
 import net.onrc.onos.ofcontroller.util.FlowId;
 
 /**
@@ -252,17 +253,19 @@
 	 * Search and get a flow path object with specified flow ID.
 	 * @param flowId flow ID to search
 	 */
-	protected IFlowPath searchFlowPath(final FlowId flowId, final FramedGraph fg) {
-	    return fg.getVertices("flow_id", flowId.toString()).iterator().hasNext()
-		    ? (IFlowPath) fg.getVertices("flow_id", flowId.toString(),
+	@Override
+	public IFlowPath searchFlowPath(final FlowId flowId) {
+	    return conn.getFramedGraph().getVertices("flow_id", flowId.toString()).iterator().hasNext()
+		    ? (IFlowPath) conn.getFramedGraph().getVertices("flow_id", flowId.toString(),
 		    IFlowPath.class).iterator().next() : null;
 	}
 
 	/**
 	 * Get all flow path objects.
 	 */
-	protected Iterable<IFlowPath> getAllFlowPaths(final FramedGraph fg) {
-	    Iterable<IFlowPath> flowPaths = fg.getVertices("type", "flow", IFlowPath.class);
+	@Override
+	public Iterable<IFlowPath> getAllFlowPaths() {
+	    Iterable<IFlowPath> flowPaths = conn.getFramedGraph().getVertices("type", "flow", IFlowPath.class);
 
 	    List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
 
@@ -275,6 +278,43 @@
 	}
 	
 	/**
+	 * Remove the specified flow path.
+	 * @param flowPath flow path object to remove
+	 */
+	@Override
+	public void removeFlowPath(IFlowPath flowPath) {
+	    conn.getFramedGraph().removeVertex(flowPath.asVertex());
+	}
+	
+	/**
+	 * Search and get a flow entry object with flow entry ID.
+	 * @param flowEntryId flow entry ID to search
+	 */
+	@Override
+	public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
+	    return conn.getFramedGraph().getVertices("flow_entry_id", flowEntryId.toString()).iterator().hasNext()
+		    ? (IFlowEntry)conn.getFramedGraph().getVertices("flow_entry_id", flowEntryId.toString(),
+		    IFlowEntry.class).iterator().next() : null;
+	}
+
+	/**
+	 * Get all flow entry objects.
+	 */
+	@Override
+	public Iterable<IFlowEntry> getAllFlowEntries() {
+	    return conn.getFramedGraph().getVertices("type", "flow_entry", IFlowEntry.class);
+	}
+
+	/**
+	 * Remove the specified flow entry.
+	 * @param flowEntry flow entry object to remove
+	 */
+	@Override
+	public void removeFlowEntry(IFlowEntry flowEntry) {
+	    conn.getFramedGraph().removeVertex(flowEntry.asVertex());
+	}
+	
+	/**
 	 * Create and return a flow entry object.
 	 */
 	@Override
@@ -328,9 +368,26 @@
 		conn.getFramedGraph().removeVertex(ipv4Address.asVertex());
 	}
 
-	
+	/**
+	 * Get the instance of GraphDBConnection assigned to this class.
+	 */
 	@Override
 	public IDBConnection getDBConnection() {
 	    return conn;
 	}	
+	
+	@Override
+	public void commit() {
+	    conn.commit();
+	}
+
+	@Override
+	public void rollback() {
+	    conn.rollback();
+	}
+
+	@Override
+	public void close() {
+	    conn.close();
+	}
 }
diff --git a/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java b/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
index 657c521..1487be7 100644
--- a/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
@@ -24,59 +24,4 @@
 
     public RamCloudDBOperation() {
     }
-
-    @Override
-    public IFlowPath searchFlowPath(FlowId flowId) {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-        return searchFlowPath(flowId, fg);
-    }
-
-    @Override
-    public Iterable<IFlowPath> getAllFlowPaths() {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-        return getAllFlowPaths(fg);
-    }
-
-    @Override
-    public void removeFlowPath(IFlowPath flowPath) {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-        fg.removeVertex(flowPath.asVertex());
-    }
-
-    @Override
-    public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-
-        return fg.getVertices("flow_entry_id", flowEntryId.toString()).iterator().hasNext()
-                ? fg.getVertices("flow_entry_id", flowEntryId.toString(),
-                IFlowEntry.class).iterator().next() : null;
-    }
-
-    @Override
-    public Iterable<IFlowEntry> getAllFlowEntries() {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-
-        return fg.getVertices("type", "flow_entry", IFlowEntry.class);
-    }
-
-    @Override
-    public void removeFlowEntry(IFlowEntry flowEntry) {
-        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
-        fg.removeVertex(flowEntry.asVertex());
-    }
-
-    @Override
-    public void commit() {
-        conn.commit();
-    }
-
-    @Override
-    public void rollback() {
-        conn.rollback();
-    }
-
-    @Override
-    public void close() {
-        conn.close();
-    }
 }
diff --git a/src/main/java/net/onrc/onos/graph/TitanDBOperation.java b/src/main/java/net/onrc/onos/graph/TitanDBOperation.java
index 3a6f13d..1b211d6 100644
--- a/src/main/java/net/onrc/onos/graph/TitanDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/TitanDBOperation.java
@@ -22,59 +22,5 @@
  * @author nickkaranatsios
  */
 public class TitanDBOperation extends DBOperation {
-	
-    @Override
-    public IFlowPath searchFlowPath(FlowId flowId) {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-        return searchFlowPath(flowId, fg);
-    }
 
-    @Override
-    public Iterable<IFlowPath> getAllFlowPaths() {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-        return getAllFlowPaths(fg);
-    }
-
-    @Override
-    public void removeFlowPath(IFlowPath flowPath) {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-        fg.removeVertex(flowPath.asVertex());
-    }
-
-    @Override
-    public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-
-        return fg.getVertices("flow_entry_id", flowEntryId.toString()).iterator().hasNext()
-                ? fg.getVertices("flow_entry_id", flowEntryId.toString(),
-                IFlowEntry.class).iterator().next() : null;
-    }
-
-    @Override
-    public Iterable<IFlowEntry> getAllFlowEntries() {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-
-        return fg.getVertices("type", "flow_entry", IFlowEntry.class);
-    }
-
-    @Override
-    public void removeFlowEntry(IFlowEntry flowEntry) {
-        FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-        fg.removeVertex(flowEntry.asVertex());
-    }
-
-    @Override
-    public void commit() {
-        conn.commit();
-    }
-
-    @Override
-    public void rollback() {
-        conn.rollback();
-    }
-
-    @Override
-    public void close() {
-        conn.close();
-    }
 }
\ No newline at end of file
