diff --git a/src/main/java/net/onrc/onos/graph/RamCloudDBConnection.java b/src/main/java/net/onrc/onos/graph/RamCloudDBConnection.java
index a4fc6de..7841d3e 100644
--- a/src/main/java/net/onrc/onos/graph/RamCloudDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/RamCloudDBConnection.java
@@ -10,6 +10,8 @@
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationException;
 import org.apache.commons.configuration.PropertiesConfiguration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  *
@@ -17,6 +19,7 @@
  */
 public class RamCloudDBConnection extends DBConnection {
     private RamCloudGraph graph;
+    private static Logger log = LoggerFactory.getLogger(RamCloudDBConnection.class);
 
     public RamCloudDBConnection(final String dbConfigFile) {
         System.out.println("dbconfigfile is + "+ dbConfigFile);
@@ -27,32 +30,46 @@
     
     @Override
     public FramedGraph getFramedGraph() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (isValid()) {
+            FramedGraph<RamCloudGraph> fg = new FramedGraph<RamCloudGraph>(graph);
+            return fg;
+        } else {
+            log.error("new FramedGraph failed");
+            return null;
+        }
     }
 
     @Override
     public void addEventListener(LocalGraphChangedListener listener) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        //TO-DO
     }
 
     @Override
     public Boolean isValid() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        return (graph != null);
     }
 
     @Override
     public void commit() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        try {
+            graph.commit();
+        } catch (Exception e) {
+            log.error("{}", e.toString());
+        }
     }
 
     @Override
     public void rollback() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        try {
+            graph.rollback();
+        } catch (Exception e) {
+            log.error("{}", e.toString());
+        }
     }
 
     @Override
     public void close() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        commit();
     }
     
      private static final Configuration getConfiguration(final File dirOrFile) {
diff --git a/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java b/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
index 69248a2..80c3109 100644
--- a/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/RamCloudDBOperation.java
@@ -4,15 +4,14 @@
  */
 package net.onrc.onos.graph;
 
-import com.thinkaurelius.titan.core.TitanGraph;
 import com.tinkerpop.blueprints.impls.ramcloud.RamCloudGraph;
 import com.tinkerpop.frames.FramedGraph;
-import java.io.File;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.util.FlowEntryId;
 import net.onrc.onos.ofcontroller.util.FlowId;
 import org.apache.commons.configuration.Configuration;
@@ -24,49 +23,29 @@
 public class RamCloudDBOperation extends DBOperation {
 
     public RamCloudDBOperation() {
-        //Configuration configuration= getConfiguration(new File(dbConfigFile));
-        //final String coordinatorURL = configuration.getProperty("connect.coordinator");
     }
 
     @Override
-    public INetMapTopologyObjects.ISwitchObject searchSwitch(String dpid) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    public ISwitchObject searchSwitch(String dpid) {
+        final FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
+
+        return searchSwitch(dpid, fg);
     }
 
     @Override
-    public INetMapTopologyObjects.ISwitchObject searchActiveSwitch(String dpid) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
-
-    @Override
-    public Iterable<INetMapTopologyObjects.ISwitchObject> getActiveSwitches() {
+    public Iterable<ISwitchObject> getActiveSwitches() {
         final FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
         
         return getActiveSwitches(fg);
     }
 
     @Override
-    public Iterable<INetMapTopologyObjects.ISwitchObject> getAllSwitches() {
+    public Iterable<ISwitchObject> getAllSwitches() {
         return getAllSwitches(conn.getFramedGraph());
     }
 
     @Override
-    public Iterable<INetMapTopologyObjects.ISwitchObject> getInactiveSwitches() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
-
-    @Override
-    public Iterable<INetMapTopologyObjects.IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
-
-    @Override
-    public void removeSwitch(INetMapTopologyObjects.ISwitchObject sw) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
-
-    @Override
-    public INetMapTopologyObjects.IPortObject newPort(Short portNumber) {
+    public IPortObject newPort(Short portNumber) {
         final FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
         IPortObject obj = fg.addVertex(null, IPortObject.class);
         if (obj != null) {
@@ -77,7 +56,7 @@
     }
 
     @Override
-    public INetMapTopologyObjects.IPortObject newPort(String dpid, Short portNum) {
+    public IPortObject newPort(String dpid, Short portNum) {
         return super.newPort(dpid, portNum);
     }
 
@@ -95,7 +74,6 @@
         }
     }
 
-
     @Override
     public IDeviceObject searchDevice(String macAddr) {
         FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
@@ -118,7 +96,7 @@
 
 
     @Override
-    public INetMapTopologyObjects.IFlowPath searchFlowPath(FlowId flowId) {
+    public IFlowPath searchFlowPath(FlowId flowId) {
         FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
         return searchFlowPath(flowId, fg);
     }
@@ -130,7 +108,7 @@
     }
 
     @Override
-    public void removeFlowPath(INetMapTopologyObjects.IFlowPath flowPath) {
+    public void removeFlowPath(IFlowPath flowPath) {
         FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
         fg.removeVertex(flowPath.asVertex());
     }
@@ -142,18 +120,25 @@
     }
 
     @Override
-    public INetMapTopologyObjects.IFlowEntry searchFlowEntry(FlowEntryId flowEntryId) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    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<INetMapTopologyObjects.IFlowEntry> getAllFlowEntries() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    public Iterable<IFlowEntry> getAllFlowEntries() {
+        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
+
+        return fg.getVertices("type", "flow_entry", IFlowEntry.class);
     }
 
     @Override
-    public void removeFlowEntry(INetMapTopologyObjects.IFlowEntry flowEntry) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+    public void removeFlowEntry(IFlowEntry flowEntry) {
+        FramedGraph<RamCloudGraph> fg = conn.getFramedGraph();
+        fg.removeVertex(flowEntry.asVertex());
     }
 
     @Override
@@ -163,16 +148,16 @@
 
     @Override
     public void commit() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        conn.commit();
     }
 
     @Override
     public void rollback() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        conn.rollback();
     }
 
     @Override
     public void close() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        conn.close();
     }
 }
