Merge pull request #385 from effy/master

Refactoring of Network Graph classes
diff --git a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
index a6c291f..f8f50a3 100644
--- a/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
+++ b/src/main/java/net/floodlightcontroller/linkdiscovery/internal/LinkStorageImpl.java
@@ -9,7 +9,7 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.linkdiscovery.ILinkStorage;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.util.HexString;
 import org.slf4j.Logger;
@@ -26,7 +26,7 @@
 public class LinkStorageImpl implements ILinkStorage {
 	
 	protected static Logger log = LoggerFactory.getLogger(LinkStorageImpl.class);
-	protected String conf;
+	protected GraphDBOperation dbop;
 
 	@Override
 	public void update(Link link, DM_OPERATION op) {
@@ -55,7 +55,6 @@
 	}
 	
 	public void updateLink(Link lt, LinkInfo linkinfo, DM_OPERATION op) {
-		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
 		IPortObject vportSrc = null, vportDst = null;
 	
 		log.trace("updateLink(): op {} {} {}", new Object[]{op, lt, linkinfo});
@@ -64,12 +63,12 @@
             // get source port vertex
         	String dpid = HexString.toHexString(lt.getSrc());
         	short port = lt.getSrcPort();
-        	vportSrc = conn.utils().searchPort(conn, dpid, port);
+        	vportSrc = dbop.searchPort(dpid, port);
             
             // get dest port vertex
             dpid = HexString.toHexString(lt.getDst());
             port = lt.getDstPort();
-            vportDst = conn.utils().searchPort(conn, dpid, port);
+            vportDst = dbop.searchPort(dpid, port);
                         
             if (vportSrc != null && vportDst != null) {
          	       	
@@ -90,12 +89,12 @@
             	} else {
             		vportSrc.setLinkPort(vportDst);
 
-            		conn.endTx(Transaction.COMMIT);
+            		dbop.commit();
             		log.debug("updateLink(): link added {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
             	}
             } else {
             	log.error("updateLink(): failed invalid vertices {} {} src {} dst {}", new Object[]{op, lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+            	dbop.rollback();
             }
         } catch (TitanException e) {
             /*
@@ -117,7 +116,6 @@
 
 	@Override
 	public void deleteLink(Link lt) {
-		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
 		IPortObject vportSrc = null, vportDst = null;
 		int count = 0;
 		
@@ -127,12 +125,12 @@
             // get source port vertex
          	String dpid = HexString.toHexString(lt.getSrc());
          	short port = lt.getSrcPort();
-         	vportSrc = conn.utils().searchPort(conn, dpid, port);
+         	vportSrc = dbop.searchPort(dpid, port);
             
             // get dst port vertex
          	dpid = HexString.toHexString(lt.getDst());
          	port = lt.getDstPort();
-         	vportDst = conn.utils().searchPort(conn, dpid, port);
+         	vportDst = dbop.searchPort(dpid, port);
      		// FIXME: This needs to remove all edges
          	
          	if (vportSrc != null && vportDst != null) {
@@ -146,13 +144,13 @@
          			}
          		}*/
          		vportSrc.removeLink(vportDst);
-        		conn.endTx(Transaction.COMMIT);
+        		dbop.commit();
             	log.debug("deleteLink(): deleted edges src {} dst {}", new Object[]{
             			lt, vportSrc, vportDst});
             	
             } else {
             	log.error("deleteLink(): failed invalid vertices {} src {} dst {}", new Object[]{lt, vportSrc, vportDst});
-            	conn.endTx(Transaction.ROLLBACK);
+            	dbop.rollback();
             }
          	
         } catch (TitanException e) {
@@ -160,7 +158,7 @@
              * retry till we succeed?
              */
         	log.error("deleteLink(): titan exception {} {}", new Object[]{lt, e.toString()});
-        	conn.endTx(Transaction.ROLLBACK);
+        	dbop.rollback();
         	e.printStackTrace();
         }
 	}
@@ -168,12 +166,11 @@
 	// TODO: Fix me
 	@Override
 	public List<Link> getLinks(Long dpid, short port) {
-		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
 		IPortObject vportSrc, vportDst;
     	List<Link> links = null;
     	Link lt;
     	
-		vportSrc = conn.utils().searchPort(conn, HexString.toHexString(dpid), port);
+		vportSrc = dbop.searchPort(HexString.toHexString(dpid), port);
 		if (vportSrc != null) {
 			
      		for (Edge e : vportSrc.asVertex().getEdges(Direction.OUT)) {
@@ -188,9 +185,7 @@
 	@Override
 	public void init(String conf) {
 		//TODO extract the DB location from properties
-	
-		this.conf = conf;
-		
+		this.dbop = new GraphDBOperation(GraphDBConnection.getInstance(conf));
 	}
 
 	@Override
@@ -206,10 +201,7 @@
 	}
 
 	public List<Link> getActiveLinks() {
-
-		GraphDBConnection conn = GraphDBConnection.getInstance(this.conf);
-		
-		Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
+		Iterable<ISwitchObject> switches = dbop.getActiveSwitches();
 
 		List<Link> links = new ArrayList<Link>(); 
 		for (ISwitchObject sw : switches) {
diff --git a/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java b/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
index d7f3e60..dafbf32 100644
--- a/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
+++ b/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
@@ -31,13 +31,14 @@
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBOperation;
 import net.onrc.onos.util.LocalTopologyEventListener;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
 
 public class FlowManagerImpl implements IFlowManager {
 	
 	protected static Logger log = LoggerFactory.getLogger(LocalTopologyEventListener.class);
-	protected static GraphDBConnection conn;
+	protected GraphDBOperation op;
 
 	@Override
 	public void createFlow(IPortObject src_port, IPortObject dest_port) {
@@ -87,8 +88,8 @@
 		Short dst_port = flow.getDstPort();
 		IPortObject src = null;
 		IPortObject dst = null;
-		src = conn.utils().searchPort(conn, src_dpid, src_port);
-		dst = conn.utils().searchPort(conn, dst_dpid, dst_port);
+		src = op.searchPort(src_dpid, src_port);
+		dst = op.searchPort(dst_dpid, dst_port);
 		if (src != null && dst != null) {
 			FlowPath newFlow = this.computeFlowPath(src,dst);
 			installFlow(newFlow);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
index c540e14..ea7fdf0 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImpl.java
@@ -6,8 +6,7 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.protocol.OFPhysicalPort;
 import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
@@ -16,7 +15,7 @@
 import org.slf4j.LoggerFactory;
 
 public class SwitchStorageImpl implements ISwitchStorage {
-	protected GraphDBConnection conn;
+	protected GraphDBOperation op;
 	protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
 
 	@Override
@@ -41,13 +40,13 @@
 	}
 
 	private void setStatus(String dpid, SwitchState state) {
-		ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+		ISwitchObject sw = op.searchSwitch(dpid);
 		if (sw != null) {
 			sw.setState(state.toString());
-			conn.endTx(Transaction.COMMIT);
+			op.commit();
 			log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
 		} 	else {
-			conn.endTx(Transaction.ROLLBACK);
+			op.rollback();
 			log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
 		}
 	}
@@ -64,24 +63,20 @@
        }
              
 		try {
-			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			ISwitchObject sw = op.searchSwitch(dpid);
 
             if (sw != null) {
-            	IPortObject p = conn.utils().searchPort(conn, dpid, port.getPortNumber());
+            	IPortObject p = op.searchPort(dpid, port.getPortNumber());
             	log.info("SwitchStorage:addPort dpid:{} port:{}", dpid, port.getPortNumber());
             	if (p != null) {
             		log.error("SwitchStorage:addPort dpid:{} port:{} exists", dpid, port.getPortNumber());
             	} else {
-            		p = conn.utils().newPort(conn);
-
-            		p.setType("port");
-            		p.setNumber(port.getPortNumber());
+            		p = op.newPort(port.getPortNumber());
             		p.setState("ACTIVE");
             		p.setPortState(port.getState());
             		p.setDesc(port.getName());
             		sw.addPort(p);
-            		conn.endTx(Transaction.COMMIT);
-  
+            		op.commit();
             	}
             } else {
         		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
@@ -89,7 +84,7 @@
 		} catch (Exception e) {
              // TODO: handle exceptions
 			e.printStackTrace();
-			conn.endTx(Transaction.ROLLBACK);
+			op.rollback();
 			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
 		}	
 
@@ -119,7 +114,7 @@
 		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
 		
 		try {
-			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			ISwitchObject sw = op.searchSwitch(dpid);
 			if (sw != null) {
 				/*
 				 *  Do nothing or throw exception?
@@ -127,15 +122,13 @@
 
 				log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
 				sw.setState(SwitchState.ACTIVE.toString());
-				conn.endTx(Transaction.COMMIT);
+				op.commit();
 			} else {
-				sw = conn.utils().newSwitch(conn);
+				sw = op.newSwitch(dpid);
 
 				if (sw != null) {
-					sw.setType("switch");
-					sw.setDPID(dpid);
 					sw.setState(SwitchState.ACTIVE.toString());
-					conn.endTx(Transaction.COMMIT);
+					op.commit();
 					log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
 				} else {
 					log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
@@ -146,7 +139,7 @@
 			 * retry?
 			 */
 			e.printStackTrace();
-			conn.endTx(Transaction.ROLLBACK);
+			op.rollback();
 			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
 		}
 
@@ -159,17 +152,17 @@
 
 		try {
 
-			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			ISwitchObject sw = op.searchSwitch(dpid);
             if (sw  != null) {
-            	conn.utils().removeSwitch(conn, sw);
+            	op.removeSwitch(sw);
  
-            	conn.endTx(Transaction.COMMIT);
+            	op.commit();
             	log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
 			e.printStackTrace();
-			conn.endTx(Transaction.ROLLBACK);			
+			op.rollback();			
 			log.error("SwitchStorage:deleteSwitch {} failed", dpid);
 		}
 
@@ -179,21 +172,21 @@
 	public void deletePort(String dpid, short port) {
 		// TODO Auto-generated method stub
 		try {
-			ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+			ISwitchObject sw = op.searchSwitch(dpid);
 
             if (sw != null) {
-            	IPortObject p = conn.utils().searchPort(conn, dpid, port);
+            	IPortObject p = op.searchPort(dpid, port);
                 if (p != null) {
             		log.info("SwitchStorage:deletePort dpid:{} port:{} found and deleted", dpid, port);
             		sw.removePort(p);
-            		conn.utils().removePort(conn, p);
-            		conn.endTx(Transaction.COMMIT);
+            		op.removePort(p);
+            		op.commit();
             	}
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
 			e.printStackTrace();
-			conn.endTx(Transaction.ROLLBACK);
+			op.rollback();
 			log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
 		}	
 	}
@@ -208,9 +201,8 @@
 
 	@Override
 	public void init(String conf) {
-
-		conn = GraphDBConnection.getInstance(conf);
-        
+		GraphDBConnection conn = GraphDBConnection.getInstance(conf);
+		op = new GraphDBOperation(conn);
 	}
 
 
@@ -221,7 +213,7 @@
 	
 	@Override
 	public void close() {
-		conn.close();		
+		op.close();		
 	}
 
 	
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoSwitchServiceImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoSwitchServiceImpl.java
index a540d64..e279422 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoSwitchServiceImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoSwitchServiceImpl.java
@@ -4,49 +4,52 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoSwitchService;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class TopoSwitchServiceImpl implements ITopoSwitchService {
 	
-	private GraphDBConnection conn;
+	private GraphDBOperation op;
 	protected static Logger log = LoggerFactory.getLogger(TopoSwitchServiceImpl.class);
 
+	public TopoSwitchServiceImpl(String conf) {
+		op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
+	}
 
+	public TopoSwitchServiceImpl() {
+		this("/tmp/cassandra.titan");
+	}
+	
 	public void finalize() {
 		close();
 	}
 	
 	@Override
 	public void close() {
-
-		conn.close();
+		op.close();
 	}
 	
 	@Override
 	public Iterable<ISwitchObject> getActiveSwitches() {
 		// TODO Auto-generated method stub
-		conn = GraphDBConnection.getInstance("/tmp/cassandra.titan");
-		conn.close(); //Commit to ensure we see latest data
-		return conn.utils().getActiveSwitches(conn);
+		op.close(); //Commit to ensure we see latest data
+		return op.getActiveSwitches();
 	}
 
 	@Override
 	public Iterable<ISwitchObject> getAllSwitches() {
 		// TODO Auto-generated method stub
-		conn = GraphDBConnection.getInstance("/tmp/cassandra.titan");
-		conn.close(); //Commit to ensure we see latest data
-		return conn.utils().getAllSwitches(conn);
+		op.close(); //Commit to ensure we see latest data
+		return op.getAllSwitches();
 	}
 
 	@Override
 	public Iterable<ISwitchObject> getInactiveSwitches() {
 		// TODO Auto-generated method stub
-		conn = GraphDBConnection.getInstance("/tmp/cassandra.titan");
-		conn.close(); //Commit to ensure we see latest data
-		return conn.utils().getInactiveSwitches(conn);
+		op.close(); //Commit to ensure we see latest data
+		return op.getInactiveSwitches();
 	}
 
 	@Override
diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImpl.java
index d6c83c5..cca4794 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImpl.java
@@ -14,16 +14,16 @@
 import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
 import net.onrc.onos.ofcontroller.devicemanager.IDeviceStorage;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 public class DeviceStorageImpl implements IDeviceStorage {
 	
-	public GraphDBConnection conn;
+	public GraphDBOperation op;
 	protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
 
 	@Override
 	public void init(String conf) {
-		conn = GraphDBConnection.getInstance(conf);
+		op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
 	}	
 
 	public void finalize() {		
@@ -32,7 +32,7 @@
 	
 	@Override
 	public void close() {
-		conn.close();
+		op.close();
 	}
 
 	@Override
@@ -40,24 +40,23 @@
 		// TODO Auto-generated method stub
 		IDeviceObject obj = null;
  		try {
-            if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+            if ((obj = op.searchDevice(device.getMACAddressString())) != null) {
                 log.debug("Adding device {}: found existing device",device.getMACAddressString());
             } else {
-            	obj = conn.utils().newDevice(conn);
+            	obj = op.newDevice();
                 log.debug("Adding device {}: creating new device",device.getMACAddressString());
             }
             changeDeviceAttachments(device, obj);
             
  			obj.setIPAddress(device.getIPv4Addresses().toString());
  			obj.setMACAddress(device.getMACAddressString());
- 			obj.setType("device");
  			obj.setState("ACTIVE");
- 			conn.endTx(Transaction.COMMIT);
+ 			op.commit();
  			
  			log.debug("Adding device {}",device.getMACAddressString());
 		} catch (Exception e) {
             // TODO: handle exceptions
-          	conn.endTx(Transaction.ROLLBACK);
+          	op.rollback();
 			log.error(":addDevice mac:{} failed", device.getMACAddressString());
 		}	
 		
@@ -74,21 +73,21 @@
 		// TODO Auto-generated method stub
 		IDeviceObject dev;
 		try {
-			if ((dev = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
-             	conn.utils().removeDevice(conn, dev);
-              	conn.endTx(Transaction.COMMIT);
+			if ((dev = op.searchDevice(device.getMACAddressString())) != null) {
+             	op.removeDevice(dev);
+              	op.commit();
             	log.error("DeviceStorage:removeDevice mac:{} done", device.getMACAddressString());
             }
 		} catch (Exception e) {
              // TODO: handle exceptions
-          	conn.endTx(Transaction.ROLLBACK);
+          	op.rollback();
 			log.error("DeviceStorage:removeDevice mac:{} failed", device.getMACAddressString());
 		}
 	}
 
 	@Override
 	public IDeviceObject getDeviceByMac(String mac) {
-		return conn.utils().searchDevice(conn, mac);
+		return op.searchDevice(mac);
 	}
 
 	@Override
@@ -102,17 +101,17 @@
 		// TODO Auto-generated method stub
 		IDeviceObject obj = null;
  		try {
-            if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+            if ((obj = op.searchDevice(device.getMACAddressString())) != null) {
                 log.debug("Changing device ports {}: found existing device",device.getMACAddressString());
                 changeDeviceAttachments(device, obj);
-     			conn.endTx(Transaction.COMMIT);
+     			op.commit();
            } else {
    				log.debug("failed to search device...now adding {}",device.getMACAddressString());
    				addDevice(device);
            }            			
 		} catch (Exception e) {
             // TODO: handle exceptions
-          	conn.endTx(Transaction.ROLLBACK);
+          	op.rollback();
 			log.error(":addDevice mac:{} failed", device.getMACAddressString());
 		}	
 	}
@@ -122,9 +121,9 @@
 		List<IPortObject> attachedPorts = Lists.newArrayList(obj.getAttachedPorts());
 
         for (SwitchPort ap : attachmentPoints) {
-       	 IPortObject port = conn.utils().searchPort(conn,
-       			 									HexString.toHexString(ap.getSwitchDPID()),
-       												(short) ap.getPort());
+       	 IPortObject port = op.searchPort(
+       			 HexString.toHexString(ap.getSwitchDPID()),
+       			 (short) ap.getPort());
        	if (attachedPorts.contains(port)) {
        		attachedPorts.remove(port);
        	} else {
@@ -144,15 +143,15 @@
 		// TODO Auto-generated method stub
 		IDeviceObject obj;
   		try {
-  			if ((obj = conn.utils().searchDevice(conn, device.getMACAddressString())) != null) {
+  			if ((obj = op.searchDevice(device.getMACAddressString())) != null) {
             	obj.setIPAddress(device.getIPv4Addresses().toString());
-              	conn.endTx(Transaction.COMMIT); 
+              	op.commit(); 
   			} else {
             	log.error(":changeDeviceIPv4Address mac:{} failed", device.getMACAddressString());
              }		
   		} catch (TitanException e) {
             // TODO: handle exceptions
-          	conn.endTx(Transaction.ROLLBACK);
+          	op.rollback();
 			log.error(":changeDeviceIPv4Address mac:{} failed due to exception {}", device.getMACAddressString(),e);
 		}
 	}
diff --git a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/web/TopoDevicesResource.java b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/web/TopoDevicesResource.java
index e476f02..1cd6b90 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/devicemanager/web/TopoDevicesResource.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/devicemanager/web/TopoDevicesResource.java
@@ -4,6 +4,7 @@
 
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.restlet.resource.Get;
 import org.restlet.resource.ServerResource;
@@ -14,8 +15,9 @@
 	public Iterator<IDeviceObject> retrieve() {
 		
 		GraphDBConnection conn = GraphDBConnection.getInstance("");
+		GraphDBOperation op = new GraphDBOperation(conn);
 		
-		return conn.utils().getDevices(conn).iterator();
+		return op.getDevices().iterator();
 		
 	}
 	
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowcache/FlowManager.java b/src/main/java/net/onrc/onos/ofcontroller/flowcache/FlowManager.java
index 9c38cdd..125acf3 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowcache/FlowManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowcache/FlowManager.java
@@ -50,7 +50,7 @@
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.protocol.OFFlowMod;
 import org.openflow.protocol.OFMatch;
@@ -65,7 +65,7 @@
 
 public class FlowManager implements IFloodlightModule, IFlowService, INetMapStorage {
 
-    public GraphDBConnection conn;
+    protected GraphDBOperation op;
 
     protected IRestApiService restApi;
     protected volatile IFloodlightProviderService floodlightProvider;
@@ -114,7 +114,7 @@
 		    runImpl();
 		} catch (Exception e) {
 		    log.debug("Exception processing All Flow Entries from the Network MAP: ", e);
-		    conn.endTx(Transaction.ROLLBACK);
+		    op.rollback();
 		    return;
 		}
 	    }
@@ -141,7 +141,7 @@
 		//
 		boolean processed_measurement_flow = false;
 		Iterable<IFlowEntry> allFlowEntries =
-		    conn.utils().getAllSwitchNotUpdatedFlowEntries(conn);
+		    op.getAllSwitchNotUpdatedFlowEntries();
 		for (IFlowEntry flowEntryObj : allFlowEntries) {
 		    counterAllFlowEntries++;
 
@@ -154,7 +154,7 @@
 			continue;	// Ignore the entry: not my switch
 
 		    IFlowPath flowObj =
-			conn.utils().getFlowPathByFlowEntry(conn, flowEntryObj);
+			op.getFlowPathByFlowEntry(flowEntryObj);
 		    if (flowObj == null)
 			continue;		// Should NOT happen
 		    if (flowObj.getFlowId() == null)
@@ -192,8 +192,7 @@
 		//
 		for (IFlowEntry flowEntryObj : addFlowEntries) {
 		    IFlowPath flowObj =
-			conn.utils().getFlowPathByFlowEntry(conn,
-							    flowEntryObj);
+			op.getFlowPathByFlowEntry(flowEntryObj);
 		    if (flowObj == null)
 			continue;		// Should NOT happen
 		    if (flowObj.getFlowId() == null)
@@ -217,16 +216,16 @@
 		while (! deleteFlowEntries.isEmpty()) {
 		    IFlowEntry flowEntryObj = deleteFlowEntries.poll();
 		    IFlowPath flowObj =
-			conn.utils().getFlowPathByFlowEntry(conn, flowEntryObj);
+			op.getFlowPathByFlowEntry(flowEntryObj);
 		    if (flowObj == null) {
 			log.debug("Did not find FlowPath to be deleted");
 			continue;
 		    }
 		    flowObj.removeFlowEntry(flowEntryObj);
-		    conn.utils().removeFlowEntry(conn, flowEntryObj);
+		    op.removeFlowEntry(flowEntryObj);
 		}
 
-		conn.endTx(Transaction.COMMIT);
+		op.commit();
 
 		if (processed_measurement_flow) {
 		    long estimatedTime =
@@ -255,7 +254,7 @@
 		    runImpl();
 		} catch (Exception e) {
 		    log.debug("Exception processing All Flows from the Network MAP: ", e);
-		    conn.endTx(Transaction.ROLLBACK);
+		    op.rollback();
 		    return;
 		}
 	    }
@@ -281,7 +280,7 @@
 		//
 		Map<Long, ?> shortestPathTopo =
 		    topoRouteService.prepareShortestPathTopo();
-		Iterable<IFlowPath> allFlowPaths = conn.utils().getAllFlowPaths(conn);
+		Iterable<IFlowPath> allFlowPaths = op.getAllFlowPaths();
 		for (IFlowPath flowPathObj : allFlowPaths) {
 		    counterAllFlowPaths++;
 		    if (flowPathObj == null)
@@ -378,12 +377,12 @@
 		//
 		while (! deleteFlows.isEmpty()) {
 		    IFlowPath flowPathObj = deleteFlows.poll();
-		    conn.utils().removeFlowPath(conn, flowPathObj);
+		    op.removeFlowPath(flowPathObj);
 		}
 
 		topoRouteService.dropShortestPathTopo(shortestPathTopo);
 
-		conn.endTx(Transaction.COMMIT);
+		op.commit();
 
 		if (processed_measurement_flow) {
 		    long estimatedTime =
@@ -414,16 +413,16 @@
 
     @Override
     public void init(String conf) {
-    	conn = GraphDBConnection.getInstance(conf);
+    	op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
     }
 
     public void finalize() {
-	close();
+    	close();
     }
 
     @Override
     public void close() {
-	conn.close();
+    	op.close();
     }
 
     @Override
@@ -530,19 +529,19 @@
 	IFlowPath flowObj = null;
 	boolean found = false;
 	try {
-	    if ((flowObj = conn.utils().searchFlowPath(conn, flowPath.flowId()))
+	    if ((flowObj = op.searchFlowPath(flowPath.flowId()))
 		!= null) {
 		log.debug("Adding FlowPath with FlowId {}: found existing FlowPath",
 			  flowPath.flowId().toString());
 		found = true;
 	    } else {
-		flowObj = conn.utils().newFlowPath(conn);
+		flowObj = op.newFlowPath();
 		log.debug("Adding FlowPath with FlowId {}: creating new FlowPath",
 			  flowPath.flowId().toString());
 	    }
 	} catch (Exception e) {
 	    // TODO: handle exceptions
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 
 	    StringWriter sw = new StringWriter();
 	    e.printStackTrace(new PrintWriter(sw));
@@ -555,7 +554,7 @@
 	if (flowObj == null) {
 	    log.error(":addFlow FlowId:{} failed: Flow object not created",
 		      flowPath.flowId().toString());
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 	    return false;
 	}
 
@@ -619,11 +618,11 @@
 	//
 	for (FlowEntry flowEntry : flowPath.dataPath().flowEntries()) {
 	    if (addFlowEntry(flowObj, flowEntry) == null) {
-		conn.endTx(Transaction.ROLLBACK);
+		op.rollback();
 		return false;
 	    }
 	}
-	conn.endTx(Transaction.COMMIT);
+	op.commit();
 
 	//
 	// TODO: We need a proper Flow ID allocation mechanism.
@@ -657,12 +656,12 @@
 	boolean found = false;
 	try {
 	    if ((flowEntryObj =
-		 conn.utils().searchFlowEntry(conn, flowEntry.flowEntryId())) != null) {
+		 op.searchFlowEntry(flowEntry.flowEntryId())) != null) {
 		log.debug("Adding FlowEntry with FlowEntryId {}: found existing FlowEntry",
 			  flowEntry.flowEntryId().toString());
 		found = true;
 	    } else {
-		flowEntryObj = conn.utils().newFlowEntry(conn);
+		flowEntryObj = op.newFlowEntry();
 		log.debug("Adding FlowEntry with FlowEntryId {}: creating new FlowEntry",
 			  flowEntry.flowEntryId().toString());
 	    }
@@ -705,12 +704,12 @@
 	// - flowEntry.actionOutput()
 	//
 	ISwitchObject sw =
-	    conn.utils().searchSwitch(conn, flowEntry.dpid().toString());
+	    op.searchSwitch(flowEntry.dpid().toString());
 	flowEntryObj.setSwitchDpid(flowEntry.dpid().toString());
 	flowEntryObj.setSwitch(sw);
 	if (flowEntry.flowEntryMatch().matchInPort()) {
 	    IPortObject inport =
-		conn.utils().searchPort(conn, flowEntry.dpid().toString(),
+		op.searchPort(flowEntry.dpid().toString(),
 					flowEntry.flowEntryMatch().inPort().value());
 	    flowEntryObj.setMatchInPort(flowEntry.flowEntryMatch().inPort().value());
 	    flowEntryObj.setInPort(inport);
@@ -734,9 +733,8 @@
 	for (FlowEntryAction fa : flowEntry.flowEntryActions()) {
 	    if (fa.actionOutput() != null) {
 		IPortObject outport =
-		    conn.utils().searchPort(conn,
-					    flowEntry.dpid().toString(),
-					    fa.actionOutput().port().value());
+		    op.searchPort(flowEntry.dpid().toString(),
+					      fa.actionOutput().port().value());
 		flowEntryObj.setActionOutput(fa.actionOutput().port().value());
 		flowEntryObj.setOutPort(outport);
 	    }
@@ -774,7 +772,7 @@
 	    new ConcurrentLinkedQueue<FlowId>();
 
 	// Get all Flow IDs
-	Iterable<IFlowPath> allFlowPaths = conn.utils().getAllFlowPaths(conn);
+	Iterable<IFlowPath> allFlowPaths = op.getAllFlowPaths();
 	for (IFlowPath flowPathObj : allFlowPaths) {
 	    if (flowPathObj == null)
 		continue;
@@ -851,7 +849,7 @@
 	// it has been removed from the switches.
 	//
 	try {
-	    if ((flowObj = conn.utils().searchFlowPath(conn, flowId))
+	    if ((flowObj = op.searchFlowPath(flowId))
 		!= null) {
 		log.debug("Deleting FlowPath with FlowId {}: found existing FlowPath",
 			  flowId.toString());
@@ -861,11 +859,11 @@
 	    }
 	} catch (Exception e) {
 	    // TODO: handle exceptions
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 	    log.error(":deleteFlow FlowId:{} failed", flowId.toString());
 	}
 	if (flowObj == null) {
-	    conn.endTx(Transaction.COMMIT);
+	    op.commit();
 	    return true;		// OK: No such flow
 	}
 
@@ -885,8 +883,8 @@
 	}
 	// Remove from the database empty flows
 	if (empty)
-	    conn.utils().removeFlowPath(conn, flowObj);
-	conn.endTx(Transaction.COMMIT);
+	    op.removeFlowPath(flowObj);
+	op.commit();
 
 	return true;
     }
@@ -901,7 +899,7 @@
 	List<FlowId> allFlowIds = new LinkedList<FlowId>();
 
 	// Get all Flow IDs
-	Iterable<IFlowPath> allFlowPaths = conn.utils().getAllFlowPaths(conn);
+	Iterable<IFlowPath> allFlowPaths = op.getAllFlowPaths();
 	for (IFlowPath flowPathObj : allFlowPaths) {
 	    if (flowPathObj == null)
 		continue;
@@ -930,7 +928,7 @@
     public boolean clearFlow(FlowId flowId) {
 	IFlowPath flowObj = null;
 	try {
-	    if ((flowObj = conn.utils().searchFlowPath(conn, flowId))
+	    if ((flowObj = op.searchFlowPath(flowId))
 		!= null) {
 		log.debug("Clearing FlowPath with FlowId {}: found existing FlowPath",
 			  flowId.toString());
@@ -940,11 +938,11 @@
 	    }
 	} catch (Exception e) {
 	    // TODO: handle exceptions
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 	    log.error(":clearFlow FlowId:{} failed", flowId.toString());
 	}
 	if (flowObj == null) {
-	    conn.endTx(Transaction.COMMIT);
+	    op.commit();
 	    return true;		// OK: No such flow
 	}
 
@@ -954,11 +952,11 @@
 	Iterable<IFlowEntry> flowEntries = flowObj.getFlowEntries();
 	for (IFlowEntry flowEntryObj : flowEntries) {
 	    flowObj.removeFlowEntry(flowEntryObj);
-	    conn.utils().removeFlowEntry(conn, flowEntryObj);
+	    op.removeFlowEntry(flowEntryObj);
 	}
 	// Remove the Flow itself
-	conn.utils().removeFlowPath(conn, flowObj);
-	conn.endTx(Transaction.COMMIT);
+	op.removeFlowPath(flowObj);
+	op.commit();
 
 	return true;
     }
@@ -973,7 +971,7 @@
     public FlowPath getFlow(FlowId flowId) {
 	IFlowPath flowObj = null;
 	try {
-	    if ((flowObj = conn.utils().searchFlowPath(conn, flowId))
+	    if ((flowObj = op.searchFlowPath(flowId))
 		!= null) {
 		log.debug("Get FlowPath with FlowId {}: found existing FlowPath",
 			  flowId.toString());
@@ -983,11 +981,11 @@
 	    }
 	} catch (Exception e) {
 	    // TODO: handle exceptions
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 	    log.error(":getFlow FlowId:{} failed", flowId.toString());
 	}
 	if (flowObj == null) {
-	    conn.endTx(Transaction.COMMIT);
+	    op.commit();
 	    return null;		// Flow not found
 	}
 
@@ -995,7 +993,7 @@
 	// Extract the Flow state
 	//
 	FlowPath flowPath = extractFlowPath(flowObj);
-	conn.endTx(Transaction.COMMIT);
+	op.commit();
 
 	return flowPath;
     }
@@ -1186,18 +1184,18 @@
 	ArrayList<FlowPath> flowPaths = new ArrayList<FlowPath>();
 
 	try {
-	    if ((flowPathsObj = conn.utils().getAllFlowPaths(conn)) != null) {
+	    if ((flowPathsObj = op.getAllFlowPaths()) != null) {
 		log.debug("Get all FlowPaths: found FlowPaths");
 	    } else {
 		log.debug("Get all FlowPaths: no FlowPaths found");
 	    }
 	} catch (Exception e) {
 	    // TODO: handle exceptions
-	    conn.endTx(Transaction.ROLLBACK);
+	    op.rollback();
 	    log.error(":getAllFlowPaths failed");
 	}
 	if ((flowPathsObj == null) || (flowPathsObj.iterator().hasNext() == false)) {
-	    conn.endTx(Transaction.COMMIT);
+	    op.commit();
 	    return flowPaths;	// No Flows found
 	}
 
@@ -1210,7 +1208,7 @@
 		flowPaths.add(flowPath);
 	}
 
-	conn.endTx(Transaction.COMMIT);
+	op.commit();
 
 	return flowPaths;
     }
@@ -1220,17 +1218,17 @@
     	ArrayList<IFlowPath> flowPathsObjArray = new ArrayList<IFlowPath>();
     	ArrayList<FlowPath> flowPaths = new ArrayList<FlowPath>();
 
-    	conn.endTx(Transaction.COMMIT);
+    	op.commit();
     	
     	try {
-    	    if ((flowPathsObj = conn.utils().getAllFlowPaths(conn)) != null) {
+    	    if ((flowPathsObj = op.getAllFlowPaths()) != null) {
     		log.debug("Get all FlowPaths: found FlowPaths");
     	    } else {
     		log.debug("Get all FlowPaths: no FlowPaths found");
     	    }
     	} catch (Exception e) {
     	    // TODO: handle exceptions
-    	    conn.endTx(Transaction.ROLLBACK);
+    	    op.rollback();
     	    log.error(":getAllFlowPaths failed");
     	}
     	if ((flowPathsObj == null) || (flowPathsObj.iterator().hasNext() == false)) {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
index c2e8efe..1fe12c4 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/linkdiscovery/internal/TopoLinkServiceImpl.java
@@ -9,7 +9,7 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoLinkService;
 import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -19,25 +19,24 @@
 
 public class TopoLinkServiceImpl implements ITopoLinkService {
 	
-	public GraphDBConnection conn;
+	protected GraphDBOperation op;
 	protected static Logger log = LoggerFactory.getLogger(TopoLinkServiceImpl.class);
 
-
 	public void finalize() {
 		close();
 	}
 	
 	@Override
 	public void close() {
-		conn.close();
+		op.close();
 	}
  
 	@Override
 	public List<Link> getActiveLinks() {
 		// TODO Auto-generated method stub
-		conn = GraphDBConnection.getInstance("");
-		conn.close(); //Commit to ensure we see latest data
-		Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
+		op = new GraphDBOperation(GraphDBConnection.getInstance(""));
+		op.close(); //Commit to ensure we see latest data
+		Iterable<ISwitchObject> switches = op.getActiveSwitches();
 		List<Link> links = new ArrayList<Link>(); 
 		for (ISwitchObject sw : switches) {
 			GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
@@ -53,7 +52,7 @@
 			}
 						
 		}
-		conn.endTx(Transaction.COMMIT);
+		op.commit();
 		return links;
 	}
 
@@ -61,7 +60,7 @@
 	public List<Link> getLinksOnSwitch(String dpid) {
 		// TODO Auto-generated method stub
 		List<Link> links = new ArrayList<Link>(); 
-		ISwitchObject sw = conn.utils().searchSwitch(conn, dpid);
+		ISwitchObject sw = op.searchSwitch(dpid);
 		GremlinPipeline<Vertex, Link> pipe = new GremlinPipeline<Vertex, Link>();
 		ExtractLink extractor = new ExtractLink();
 
diff --git a/src/main/java/net/onrc/onos/ofcontroller/onoslistener/OnosPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/onoslistener/OnosPublisher.java
index 2b30bbf..6a9d433 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/onoslistener/OnosPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/onoslistener/OnosPublisher.java
@@ -41,6 +41,8 @@
 import net.onrc.onos.registry.controller.IControllerRegistryService.ControlChangeCallback;
 import net.onrc.onos.registry.controller.RegistryException;
 import net.onrc.onos.util.GraphDBConnection;
+import net.onrc.onos.util.GraphDBOperation;
+import net.onrc.onos.util.IDBConnection;
 import net.onrc.onos.util.LocalTopologyEventListener;
 
 public class OnosPublisher implements IDeviceListener, IOFSwitchListener,
@@ -52,7 +54,7 @@
 	protected static Logger log;
 	protected IDeviceService deviceService;
 	protected IControllerRegistryService registryService;
-	protected GraphDBConnection conn;
+	protected GraphDBOperation op;
 	
 	protected static final String DBConfigFile = "dbconf";
 	protected static final String CleanupEnabled = "EnableCleanup";
@@ -76,7 +78,7 @@
             catch (Exception e) {
                 log.error("Error in cleanup thread", e);
             } finally {
-            	conn.close();
+            	op.close();
                     cleanupTask.reschedule(CLEANUP_TASK_INTERVAL,
                                               TimeUnit.SECONDS);
             }
@@ -95,8 +97,8 @@
     }
 
     protected void switchCleanup() {
-    	conn.close();
-    	Iterable<ISwitchObject> switches = conn.utils().getActiveSwitches(conn);
+    	op.close();
+    	Iterable<ISwitchObject> switches = op.getActiveSwitches();
     	
     	log.debug("Checking for inactive switches");
     	// For each switch check if a controller exists in controller registry
@@ -119,7 +121,7 @@
 				e.printStackTrace();
 			}			
 		}
-    	conn.close();
+    	op.close();
     }
 
 	@Override
@@ -251,7 +253,7 @@
 		// TODO Auto-generated method stub
 		Map<String, String> configMap = context.getConfigParams(this);
 		String conf = configMap.get(DBConfigFile);
-		conn = GraphDBConnection.getInstance(conf);
+		op = new GraphDBOperation(GraphDBConnection.getInstance(conf));
 		
 		log = LoggerFactory.getLogger(OnosPublisher.class);
 		floodlightProvider =
@@ -285,7 +287,8 @@
 		linkDiscovery.addListener(this);
 		
 		log.debug("Adding EventListener");
-		conn.addEventListener(new LocalTopologyEventListener(conn));
+		IDBConnection conn = op.getDBConnection();
+		conn.addEventListener(new LocalTopologyEventListener((GraphDBConnection) conn));
 	       // Setup the Cleanup task. 
 		if (cleanupNeeded == null || !cleanupNeeded.equals("False")) {
 				ScheduledExecutorService ses = threadPool.getScheduledExecutor();
diff --git a/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java b/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java
index f20f7ca..a051d4c 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java
@@ -25,6 +25,7 @@
 import net.onrc.onos.ofcontroller.util.SwitchPort;
 import net.onrc.onos.util.GraphDBConnection;
 import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.util.HexString;
 import org.slf4j.Logger;
@@ -99,7 +100,7 @@
     private static Logger log =
 	LoggerFactory.getLogger(TopoRouteService.class);
     
-    GraphDBConnection conn;
+    protected GraphDBOperation op;
 
     @Override
     public Collection<Class<? extends IFloodlightService>> getModuleServices() {
@@ -134,7 +135,7 @@
     public void init(FloodlightModuleContext context)
 	throws FloodlightModuleException {
 	// TODO: Add the appropriate initialization
-    	conn = GraphDBConnection.getInstance("");
+    	op = new GraphDBOperation(GraphDBConnection.getInstance(""));
     }
 
     @Override
@@ -193,7 +194,7 @@
 	// Fetch the relevant info from the Switch and Port vertices
 	// from the Titan Graph.
 	//
-	Iterable<ISwitchObject> nodes = conn.utils().getActiveSwitches(conn);
+	Iterable<ISwitchObject> nodes = op.getActiveSwitches();
 	for (ISwitchObject switchObj : nodes) {
 	    Vertex nodeVertex = switchObj.asVertex();
 	    //
@@ -253,7 +254,7 @@
 		}
 	    }
 	}
-	conn.endTx(Transaction.COMMIT);
+	op.commit();
 
 	return shortestPathTopo;
     }
@@ -416,9 +417,9 @@
 
 	// Get the source and destination switches
 	ISwitchObject srcSwitch =
-	    conn.utils().searchActiveSwitch(conn, dpid_src);
+	    op.searchActiveSwitch(dpid_src);
 	ISwitchObject destSwitch =
-	    conn.utils().searchActiveSwitch(conn, dpid_dest);
+	    op.searchActiveSwitch(dpid_dest);
 	if (srcSwitch == null || destSwitch == null) {
 	    return null;
 	}
@@ -433,7 +434,7 @@
 	    flowEntry.setInPort(src.port());
 	    flowEntry.setOutPort(dest.port());
 	    result_data_path.flowEntries().add(flowEntry);
-	    conn.endTx(Transaction.COMMIT);
+	    op.commit();
 	    return result_data_path;
 	}
 
@@ -552,7 +553,7 @@
 	    result_data_path.flowEntries().add(flowEntry);
 	}
 
-	conn.endTx(Transaction.COMMIT);
+	op.commit();
 	if (result_data_path.flowEntries().size() > 0)
 	    return result_data_path;
 
diff --git a/src/main/java/net/onrc/onos/util/GraphDBConnection.java b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
index 7ea0ab8..e25a0c6 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/util/GraphDBConnection.java
@@ -12,165 +12,159 @@
 import com.tinkerpop.blueprints.util.wrappers.event.EventTransactionalGraph;
 import com.tinkerpop.frames.FramedGraph;
 
-public class GraphDBConnection {
+public class GraphDBConnection implements IDBConnection {
 	public enum Transaction {
-		COMMIT,
-		ROLLBACK
+		COMMIT, ROLLBACK
 	}
+
 	public enum GenerateEvent {
-		TRUE,
-		FALSE
+		TRUE, FALSE
 	}
+
 	class TransactionHandle {
 		protected TransactionalGraph tr;
+
 		public void create() {
-			tr = graph.newTransaction();			
+			tr = graph.newTransaction();
 		}
 	}
-	protected static Logger log = LoggerFactory.getLogger(GraphDBConnection.class);
-	private static GraphDBConnection singleton = new GraphDBConnection( );
+
+	protected static Logger log = LoggerFactory
+			.getLogger(GraphDBConnection.class);
+	private static GraphDBConnection singleton = new GraphDBConnection();
 	private static TitanGraph graph;
 	private static EventTransactionalGraph<TitanGraph> eg;
-	private static GraphDBUtils utils;
 	private static String configFile;
 
-	   
-	   /* A private Constructor prevents any other 
-	    * class from instantiating.
-	    */
-	   private GraphDBConnection(){ }
-	   
-	   /* Static 'instance' method */
-	   public static synchronized GraphDBConnection getInstance(final String conf) {
-		   if (GraphDBConnection.configFile == null || GraphDBConnection.configFile.isEmpty()) {
-			   GraphDBConnection.configFile = conf;
-			   log.debug("GraphDBConnection::Setting Config File {}", GraphDBConnection.configFile);
-		   }
-		   if (!GraphDBConnection.configFile.isEmpty() && 
-				   (graph == null||graph.isOpen() == Boolean.FALSE)) {
-		        graph = TitanFactory.open(GraphDBConnection.configFile);		        
-		        // FIXME: Creation on Indexes should be done only once
-		        Set<String> s = graph.getIndexedKeys(Vertex.class);
-		        if (!s.contains("dpid")) {
-		           graph.createKeyIndex("dpid", Vertex.class);
-		        }
-		        if (!s.contains("type")) {
-		        	graph.createKeyIndex("type", Vertex.class);
-		        }
-		        if (!s.contains("dl_address")) {
-		        	graph.createKeyIndex("dl_address", Vertex.class);
-		        }
-		        if (!s.contains("flow_id")) {
-		        	graph.createKeyIndex("flow_id", Vertex.class);
-		        }
-		        if (!s.contains("flow_entry_id")) {
-		        	graph.createKeyIndex("flow_entry_id",
-						     Vertex.class);
-		        }
-		        if (!s.contains("switch_state")) {
-		        	graph.createKeyIndex("switch_state",
-						     Vertex.class);
-		        }
-		        graph.commit();
-		        eg = new EventTransactionalGraph<TitanGraph>(graph);
-		   }		   
-		   if (utils == null) {
-			   utils = new GraphDBUtils();
-		   }
-	      return singleton;
-	   }
-	   
-	   public IDBUtils utils() {
-		   return utils;
-	   }
-	   
-	   public FramedGraph<TitanGraph> getFramedGraph() {
-	   
-		   	if (isValid()) {
-		   		FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
-		   		return fg;
-		   	} else {
-		   		log.error("new FramedGraph failed");
-		   		return null;
-		   	}
-	   }
-	   
-	   protected EventTransactionalGraph<TitanGraph> getEventGraph() {
-		   
-		   	if (isValid()) {		   		
-		   		return eg;
-		   	} else {
-		   		return null;
-		   	}
-	   }
-	   
-	   public void addEventListener(final LocalGraphChangedListener listener) {		   
-		   EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
-		   eg.addListener(listener);
-		   log.debug("Registered listener {}",listener.getClass());
-	   }
-	   
-	   public Boolean isValid() {
-		   
-		   return (graph != null||graph.isOpen());
-	   }
-	   
-	   public void startTx() {
-		   
-		   
-	   }
-	   
-	   public void endTx(Transaction tx) {
-		   try {
-			   switch (tx) {
-			   case COMMIT:
-				   graph.commit();
-			   case ROLLBACK:
-				   graph.rollback();
-			   }
-		   } catch (Exception e) {
-			   // TODO Auto-generated catch block
-			   log.error("{}",e.toString());
-		   }
-	   }
-	   
-	   public void endTx(TransactionHandle tr, Transaction tx) {
-		   switch (tx) {
-		   case COMMIT:
-			   if (tr != null && tr.tr != null) {
-				   tr.tr.commit();
-			   } else {
-				   graph.commit();
-			   }
-		   case ROLLBACK:
-			   if (tr != null && tr.tr != null) {
-				   tr.tr.rollback();
-			   } else {
-				   graph.rollback();
-			   }
-		   }
-	   }   
-	   
-	   public void endTx(Transaction tx, GenerateEvent fire) {
+	/*
+	 * A private Constructor prevents any other class from instantiating.
+	 */
+	private GraphDBConnection() {
+	}
 
-		   try {
+	/* Static 'instance' method */
+	public static synchronized GraphDBConnection getInstance(final String conf) {
+		if (GraphDBConnection.configFile == null
+				|| GraphDBConnection.configFile.isEmpty()) {
+			GraphDBConnection.configFile = conf;
+			log.debug("GraphDBConnection::Setting Config File {}",
+					GraphDBConnection.configFile);
+		}
+		if (!GraphDBConnection.configFile.isEmpty()
+				&& (graph == null || graph.isOpen() == Boolean.FALSE)) {
+			graph = TitanFactory.open(GraphDBConnection.configFile);
+			// FIXME: Creation on Indexes should be done only once
+			Set<String> s = graph.getIndexedKeys(Vertex.class);
+			if (!s.contains("dpid")) {
+				graph.createKeyIndex("dpid", Vertex.class);
+			}
+			if (!s.contains("type")) {
+				graph.createKeyIndex("type", Vertex.class);
+			}
+			if (!s.contains("dl_address")) {
+				graph.createKeyIndex("dl_address", Vertex.class);
+			}
+			if (!s.contains("flow_id")) {
+				graph.createKeyIndex("flow_id", Vertex.class);
+			}
+			if (!s.contains("flow_entry_id")) {
+				graph.createKeyIndex("flow_entry_id", Vertex.class);
+			}
+			if (!s.contains("switch_state")) {
+				graph.createKeyIndex("switch_state", Vertex.class);
+			}
+			graph.commit();
+			eg = new EventTransactionalGraph<TitanGraph>(graph);
+		}
+		return singleton;
+	}
+
+	public FramedGraph<TitanGraph> getFramedGraph() {
+
+		if (isValid()) {
+			FramedGraph<TitanGraph> fg = new FramedGraph<TitanGraph>(graph);
+			return fg;
+		} else {
+			log.error("new FramedGraph failed");
+			return null;
+		}
+	}
+
+	protected EventTransactionalGraph<TitanGraph> getEventGraph() {
+
+		if (isValid()) {
+			return eg;
+		} else {
+			return null;
+		}
+	}
+
+	public void addEventListener(final LocalGraphChangedListener listener) {
+		EventTransactionalGraph<TitanGraph> eg = this.getEventGraph();
+		eg.addListener(listener);
+		log.debug("Registered listener {}", listener.getClass());
+	}
+
+	public Boolean isValid() {
+
+		return (graph != null || graph.isOpen());
+	}
+
+	public void startTx() {
+
+	}
+
+	public void endTx(Transaction tx) {
+		try {
+			switch (tx) {
+			case COMMIT:
+				graph.commit();
+			case ROLLBACK:
+				graph.rollback();
+			}
+		} catch (Exception e) {
+			// TODO Auto-generated catch block
+			log.error("{}", e.toString());
+		}
+	}
+
+	public void endTx(TransactionHandle tr, Transaction tx) {
+		switch (tx) {
+		case COMMIT:
+			if (tr != null && tr.tr != null) {
+				tr.tr.commit();
+			} else {
+				graph.commit();
+			}
+		case ROLLBACK:
+			if (tr != null && tr.tr != null) {
+				tr.tr.rollback();
+			} else {
+				graph.rollback();
+			}
+		}
+	}
+
+	public void endTx(Transaction tx, GenerateEvent fire) {
+
+		try {
 			if (fire.equals(GenerateEvent.TRUE)) {
-				   switch (tx) {
-				   case COMMIT:
-					   eg.commit();
-				   case ROLLBACK:
-					   eg.rollback();
-				   }
-			   } else {
-					endTx(tx);   			   
-			   }
+				switch (tx) {
+				case COMMIT:
+					eg.commit();
+				case ROLLBACK:
+					eg.rollback();
+				}
+			} else {
+				endTx(tx);
+			}
 		} catch (Exception e) {
 			// TODO Auto-generated catch block
 			e.printStackTrace();
 		}
-	   }
-	   
-	   public void close() {
-		   endTx(Transaction.COMMIT);
-	   }	   
+	}
+
+	public void close() {
+		endTx(Transaction.COMMIT);
+	}
 }
diff --git a/src/main/java/net/onrc/onos/util/GraphDBOperation.java b/src/main/java/net/onrc/onos/util/GraphDBOperation.java
new file mode 100644
index 0000000..df68282
--- /dev/null
+++ b/src/main/java/net/onrc/onos/util/GraphDBOperation.java
@@ -0,0 +1,287 @@
+package net.onrc.onos.util;
+
+import java.util.ArrayList;
+import java.util.List;
+
+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.core.ISwitchStorage.SwitchState;
+import net.onrc.onos.ofcontroller.util.FlowEntryId;
+import net.onrc.onos.ofcontroller.util.FlowId;
+
+//import net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject;
+//import net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry;
+//import net.floodlightcontroller.core.INetMapTopologyObjects.IFlowPath;
+//import net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject;
+//import net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject;
+//import net.floodlightcontroller.core.ISwitchStorage.SwitchState;
+//import net.floodlightcontroller.util.FlowEntryId;
+//import net.floodlightcontroller.util.FlowId;
+import net.onrc.onos.util.GraphDBConnection.Transaction;
+
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.blueprints.Vertex;
+import com.tinkerpop.frames.FramedGraph;
+import com.tinkerpop.frames.structures.FramedVertexIterable;
+import com.tinkerpop.gremlin.java.GremlinPipeline;
+
+public class GraphDBOperation implements IDBOperation {
+	private GraphDBConnection conn;
+	
+	public GraphDBOperation(GraphDBConnection dbConnection) {
+		this.conn = dbConnection;
+	}
+
+	@Override
+	public ISwitchObject newSwitch(String dpid) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		ISwitchObject obj = fg.addVertex(null,ISwitchObject.class);
+		if (obj != null) {
+			obj.setType("switch");
+			obj.setDPID(dpid);
+		}
+		return obj;
+	}
+
+	@Override
+	public ISwitchObject searchSwitch(String dpid) {
+		// TODO Auto-generated method stub
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return (fg != null && fg.getVertices("dpid",dpid).iterator().hasNext()) ? 
+				fg.getVertices("dpid",dpid,ISwitchObject.class).iterator().next() : null;
+				
+	}
+
+	@Override
+	public ISwitchObject searchActiveSwitch(String dpid) {
+	
+	    ISwitchObject sw = searchSwitch(dpid);
+	    if ((sw != null) &&
+	        sw.getState().equals(SwitchState.ACTIVE.toString())) {
+	        return sw;
+	    }
+	    return null;
+	}
+
+	@Override
+	public Iterable<ISwitchObject> getAllSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		return switches;
+	}
+
+	@Override
+	public Iterable<ISwitchObject> getActiveSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
+	
+		for (ISwitchObject sw: switches) {
+			if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
+				activeSwitches.add(sw);
+			}
+		}
+		return activeSwitches;
+	}
+
+	@Override
+	public Iterable<ISwitchObject> getInactiveSwitches() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
+		List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
+	
+		for (ISwitchObject sw: switches) {
+			if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
+				inactiveSwitches.add(sw);
+			}
+		}
+		return inactiveSwitches;
+	}
+
+	@Override
+	public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		//TODO: Should use an enum for flow_switch_state
+		return fg.getVertices("switch_state", "FE_SWITCH_NOT_UPDATED", IFlowEntry.class);
+	}
+
+	@Override
+	public void removeSwitch(ISwitchObject sw) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		fg.removeVertex(sw.asVertex());		
+	}
+
+	@Override
+	public IPortObject newPort(Short portNumber) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IPortObject obj = fg.addVertex(null,IPortObject.class);
+		if (obj != null) {
+			obj.setType("port");
+			obj.setNumber(portNumber);
+		}
+		return obj;
+	}
+
+	@Override
+		public IPortObject searchPort(String dpid, short number) {
+			ISwitchObject sw = searchSwitch(dpid);
+			if (sw != null) {
+				
+				IPortObject port = null;
+				
+				// Requires Frames 2.3.0
+				
+				try {
+					port = sw.getPort(number);
+				} catch (Exception e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+				
+				return port;
+			}
+			
+	//		if (sw != null) {
+	//			GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
+	//			pipe.start(sw.asVertex());
+	//			pipe.out("on").has("number", number);
+	//			FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
+	//			return r != null && r.iterator().hasNext() ? r.iterator().next() : null;
+	//		}
+			return null;
+		}
+
+	@Override
+		public void removePort(IPortObject port) {
+			FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+	//		EventGraph<TitanGraph> eg = conn.getEventGraph();
+			if (fg != null) fg.removeVertex(port.asVertex());		
+		}
+
+	@Override
+	public IDeviceObject newDevice() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IDeviceObject obj = fg.addVertex(null,IDeviceObject.class);
+		if (obj != null) obj.setType("device");
+		return obj;
+	}
+
+	@Override
+	public IDeviceObject searchDevice(String macAddr) {
+		// TODO Auto-generated method stub
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		return (fg != null && fg.getVertices("dl_address",macAddr).iterator().hasNext()) ? fg.getVertices("dl_address",macAddr,
+    			IDeviceObject.class).iterator().next() : null;
+    			
+	}
+
+	@Override
+	public Iterable<IDeviceObject> getDevices() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		return fg != null ? fg.getVertices("type","device",IDeviceObject.class) : null;
+	}
+
+	@Override
+	public void removeDevice(IDeviceObject dev) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		if (fg != null) fg.removeVertex(dev.asVertex());		
+	}
+
+	@Override
+	public IFlowPath newFlowPath() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IFlowPath flowPath = fg.addVertex(null, IFlowPath.class);
+		if (flowPath != null) flowPath.setType("flow");
+		return flowPath;
+	}
+
+	@Override
+	public IFlowPath searchFlowPath(FlowId flowId) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		
+		return fg.getVertices("flow_id", flowId.toString()).iterator().hasNext() ? 
+		    fg.getVertices("flow_id", flowId.toString(),
+				   IFlowPath.class).iterator().next() : null;
+	}
+
+	@Override
+	public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
+		pipe.start(flowEntry.asVertex());
+		pipe.out("flow");
+		FramedVertexIterable<IFlowPath> r = new FramedVertexIterable(conn.getFramedGraph(), (Iterable) pipe, IFlowPath.class);
+		return r.iterator().hasNext() ? r.iterator().next() : null;
+	}
+
+	@Override
+    public Iterable<IFlowPath> getAllFlowPaths() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		Iterable<IFlowPath> flowPaths = fg.getVertices("type", "flow", IFlowPath.class);
+		
+		List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
+
+		for (IFlowPath fp: flowPaths) {
+			if (fp.getFlowId() != null) {
+				nonNullFlows.add(fp);
+			}
+		}
+		return nonNullFlows;
+	}
+
+	@Override
+	public void removeFlowPath(IFlowPath flowPath) {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
+		fg.removeVertex(flowPath.asVertex());
+	}
+
+	@Override
+	public IFlowEntry newFlowEntry() {
+		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
+		IFlowEntry flowEntry = fg.addVertex(null, IFlowEntry.class);
+		if (flowEntry != null) flowEntry.setType("flow_entry");
+		return flowEntry;
+	}
+
+	@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());
+	}
+	
+	public IDBConnection getDBConnection() {
+		return conn;
+	}
+	
+	public void commit() {
+		conn.endTx(Transaction.COMMIT);
+	}
+	
+	public void rollback() {
+		conn.endTx(Transaction.ROLLBACK);
+	}
+
+	public void close() {
+		conn.close();
+	}
+}
diff --git a/src/main/java/net/onrc/onos/util/GraphDBUtils.java b/src/main/java/net/onrc/onos/util/GraphDBUtils.java
deleted file mode 100644
index 92befe6..0000000
--- a/src/main/java/net/onrc/onos/util/GraphDBUtils.java
+++ /dev/null
@@ -1,250 +0,0 @@
-package net.onrc.onos.util;
-
-import java.util.ArrayList;
-import java.util.List;
-
-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.core.ISwitchStorage.SwitchState;
-import net.onrc.onos.ofcontroller.util.FlowEntryId;
-import net.onrc.onos.ofcontroller.util.FlowId;
-
-import com.thinkaurelius.titan.core.TitanGraph;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.frames.FramedGraph;
-import com.tinkerpop.frames.structures.FramedVertexIterable;
-import com.tinkerpop.gremlin.java.GremlinPipeline;
-
-public class GraphDBUtils implements IDBUtils {
-	
-	@Override
-	public ISwitchObject newSwitch(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		ISwitchObject obj = fg.addVertex(null,ISwitchObject.class);
-		return obj;
-	}
-
-	@Override
-	public void removeSwitch(GraphDBConnection conn, ISwitchObject sw) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		fg.removeVertex(sw.asVertex());		
-	}
-	
-	@Override
-	public ISwitchObject searchSwitch(GraphDBConnection conn, String dpid) {
-		// TODO Auto-generated method stub
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		
-		return (fg != null && fg.getVertices("dpid",dpid).iterator().hasNext()) ? 
-				fg.getVertices("dpid",dpid,ISwitchObject.class).iterator().next() : null;
-    			
-	}
-
-	@Override
-	public IDeviceObject searchDevice(GraphDBConnection conn, String macAddr) {
-		// TODO Auto-generated method stub
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		return (fg != null && fg.getVertices("dl_address",macAddr).iterator().hasNext()) ? fg.getVertices("dl_address",macAddr,
-    			IDeviceObject.class).iterator().next() : null;
-    			
-	}
-
-	@Override
-	public IPortObject searchPort(GraphDBConnection conn, String dpid, short number) {
-		ISwitchObject sw = searchSwitch(conn, dpid);
-		if (sw != null) {
-			
-			IPortObject port = null;
-			
-			// Requires Frames 2.3.0
-			
-			try {
-				port = sw.getPort(number);
-			} catch (Exception e) {
-				// TODO Auto-generated catch block
-				e.printStackTrace();
-			}
-			
-			return port;
-		}
-		
-//		if (sw != null) {
-//			GremlinPipeline<Vertex, IPortObject> pipe = new GremlinPipeline<Vertex, IPortObject>();
-//			pipe.start(sw.asVertex());
-//			pipe.out("on").has("number", number);
-//			FramedVertexIterable<IPortObject> r = new FramedVertexIterable<IPortObject>(conn.getFramedGraph(), (Iterable) pipe, IPortObject.class);
-//			return r != null && r.iterator().hasNext() ? r.iterator().next() : null;
-//		}
-		return null;
-	}
-
-	@Override
-	public IPortObject newPort(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		IPortObject obj = fg.addVertex(null,IPortObject.class);
-		return obj;
-	}
-	
-	@Override
-	public IDeviceObject newDevice(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		IDeviceObject obj = fg.addVertex(null,IDeviceObject.class);
-		return obj;
-	}
-	
-	@Override
-	public void removePort(GraphDBConnection conn, IPortObject port) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-//		EventGraph<TitanGraph> eg = conn.getEventGraph();
-		if (fg != null) fg.removeVertex(port.asVertex());		
-	}
-
-	@Override
-	public void removeDevice(GraphDBConnection conn, IDeviceObject dev) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		if (fg != null) fg.removeVertex(dev.asVertex());		
-	}
-
-	@Override
-	public Iterable<IDeviceObject> getDevices(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		return fg != null ? fg.getVertices("type","device",IDeviceObject.class) : null;
-	}
-
-	@Override
-	public IFlowPath searchFlowPath(GraphDBConnection conn,
-					FlowId flowId) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		
-		return fg.getVertices("flow_id", flowId.toString()).iterator().hasNext() ? 
-		    fg.getVertices("flow_id", flowId.toString(),
-				   IFlowPath.class).iterator().next() : null;
-	}
-
-	@Override
-	public IFlowPath newFlowPath(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		IFlowPath flowPath = fg.addVertex(null, IFlowPath.class);
-		return flowPath;
-	}
-
-	@Override
-	public void removeFlowPath(GraphDBConnection conn,
-				   IFlowPath flowPath) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		fg.removeVertex(flowPath.asVertex());
-	}
-
-	@Override
-	public IFlowPath getFlowPathByFlowEntry(GraphDBConnection conn,
-						IFlowEntry flowEntry) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
-		pipe.start(flowEntry.asVertex());
-		pipe.out("flow");
-		FramedVertexIterable<IFlowPath> r = new FramedVertexIterable(conn.getFramedGraph(), (Iterable) pipe, IFlowPath.class);
-		return r.iterator().hasNext() ? r.iterator().next() : null;
-	}
-
-	@Override
-    public Iterable<IFlowPath> getAllFlowPaths(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		Iterable<IFlowPath> flowPaths = fg.getVertices("type", "flow", IFlowPath.class);
-		
-		List<IFlowPath> nonNullFlows = new ArrayList<IFlowPath>();
-
-		for (IFlowPath fp: flowPaths) {
-			if (fp.getFlowId() != null) {
-				nonNullFlows.add(fp);
-			}
-		}
-		return nonNullFlows;
-	}
-
-	@Override
-	public IFlowEntry searchFlowEntry(GraphDBConnection conn,
-					  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 IFlowEntry newFlowEntry(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();	
-		IFlowEntry flowEntry = fg.addVertex(null, IFlowEntry.class);
-		return flowEntry;
-	}
-
-	@Override
-	public void removeFlowEntry(GraphDBConnection conn,
-				    IFlowEntry flowEntry) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		fg.removeVertex(flowEntry.asVertex());
-	}
-
-	@Override
-        public Iterable<IFlowEntry> getAllFlowEntries(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		
-		return fg.getVertices("type", "flow_entry", IFlowEntry.class);
-	}
-	
-	@Override
-	public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		//TODO: Should use an enum for flow_switch_state
-		return fg.getVertices("switch_state", "FE_SWITCH_NOT_UPDATED", IFlowEntry.class);
-	}
-
-	@Override
-	public Iterable<ISwitchObject> getActiveSwitches(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
-		List<ISwitchObject> activeSwitches = new ArrayList<ISwitchObject>();
-
-		for (ISwitchObject sw: switches) {
-			if(sw.getState().equals(SwitchState.ACTIVE.toString())) {
-				activeSwitches.add(sw);
-			}
-		}
-		return activeSwitches;
-	}
-
-	@Override
-	public Iterable<ISwitchObject> getAllSwitches(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
-		return switches;
-	}
-
-	@Override
-	public Iterable<ISwitchObject> getInactiveSwitches(GraphDBConnection conn) {
-		FramedGraph<TitanGraph> fg = conn.getFramedGraph();
-		Iterable<ISwitchObject> switches =  fg.getVertices("type","switch",ISwitchObject.class);
-		List<ISwitchObject> inactiveSwitches = new ArrayList<ISwitchObject>();
-
-		for (ISwitchObject sw: switches) {
-			if(sw.getState().equals(SwitchState.INACTIVE.toString())) {
-				inactiveSwitches.add(sw);
-			}
-		}
-		return inactiveSwitches;
-	}
-
-	@Override
-	public ISwitchObject searchActiveSwitch(GraphDBConnection conn, String dpid) {
-
-        ISwitchObject sw = searchSwitch(conn, dpid);
-        if ((sw != null) &&
-            sw.getState().equals(SwitchState.ACTIVE.toString())) {
-            return sw;
-        }
-        return null;
-	}
-}
diff --git a/src/main/java/net/onrc/onos/util/IDBConnection.java b/src/main/java/net/onrc/onos/util/IDBConnection.java
new file mode 100644
index 0000000..e599a5e
--- /dev/null
+++ b/src/main/java/net/onrc/onos/util/IDBConnection.java
@@ -0,0 +1,19 @@
+package net.onrc.onos.util;
+
+import net.onrc.onos.util.GraphDBConnection.GenerateEvent;
+import net.onrc.onos.util.GraphDBConnection.Transaction;
+import net.onrc.onos.util.GraphDBConnection.TransactionHandle;
+
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.frames.FramedGraph;
+
+public interface IDBConnection {
+	public FramedGraph<TitanGraph> getFramedGraph();
+	public void addEventListener(final LocalGraphChangedListener listener);
+	public Boolean isValid();
+	public void startTx();
+	public void endTx(Transaction tx);
+	public void endTx(TransactionHandle tr, Transaction tx);
+	public void endTx(Transaction tx, GenerateEvent fire);
+	public void close();
+}
diff --git a/src/main/java/net/onrc/onos/util/IDBOperation.java b/src/main/java/net/onrc/onos/util/IDBOperation.java
new file mode 100644
index 0000000..46245ae
--- /dev/null
+++ b/src/main/java/net/onrc/onos/util/IDBOperation.java
@@ -0,0 +1,45 @@
+package net.onrc.onos.util;
+
+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;
+
+public interface IDBOperation {	
+	public ISwitchObject newSwitch(String dpid);
+	public ISwitchObject searchSwitch(String dpid);
+	public ISwitchObject searchActiveSwitch(String dpid);
+	public Iterable<ISwitchObject> getActiveSwitches();
+	public Iterable<ISwitchObject> getAllSwitches();
+	public Iterable<ISwitchObject> getInactiveSwitches();
+	public Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries();
+	public void removeSwitch(ISwitchObject sw);
+	
+	public IPortObject newPort(Short portNumber);
+	public IPortObject searchPort(String dpid, short number);
+	public void removePort(IPortObject port);
+	
+	public IDeviceObject newDevice();
+	public IDeviceObject searchDevice(String macAddr);
+	public Iterable<IDeviceObject> getDevices();
+	public void removeDevice(IDeviceObject dev);
+
+	public IFlowPath newFlowPath();
+	public IFlowPath searchFlowPath(FlowId flowId);
+	public IFlowPath getFlowPathByFlowEntry(IFlowEntry flowEntry);
+	public Iterable<IFlowPath> getAllFlowPaths();
+	public void removeFlowPath(IFlowPath flowPath);
+
+	public IFlowEntry newFlowEntry();
+	public IFlowEntry searchFlowEntry(FlowEntryId flowEntryId);
+	public Iterable<IFlowEntry> getAllFlowEntries();
+	public void removeFlowEntry(IFlowEntry flowEntry);
+	
+	public IDBConnection getDBConnection();	
+	public void commit();
+	public void rollback();
+	public void close();
+}
diff --git a/src/main/java/net/onrc/onos/util/IDBUtils.java b/src/main/java/net/onrc/onos/util/IDBUtils.java
deleted file mode 100644
index a16e136..0000000
--- a/src/main/java/net/onrc/onos/util/IDBUtils.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package net.onrc.onos.util;
-
-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;
-
-public interface IDBUtils {	
-	public ISwitchObject searchSwitch(GraphDBConnection conn, String dpid);
-	public ISwitchObject searchActiveSwitch(GraphDBConnection conn, String dpid);
-	public Iterable<ISwitchObject> getActiveSwitches(GraphDBConnection conn);
-	public Iterable<ISwitchObject> getAllSwitches(GraphDBConnection conn);
-	public Iterable<ISwitchObject> getInactiveSwitches(GraphDBConnection conn);
-	
-
-	public IDeviceObject searchDevice(GraphDBConnection conn, String macAddr);
-	public IDeviceObject newDevice(GraphDBConnection conn);
-	public void removeDevice(GraphDBConnection conn, IDeviceObject dev);
-	public IPortObject searchPort(GraphDBConnection conn, String dpid, short number);
-	public Iterable<IDeviceObject> getDevices(GraphDBConnection conn);
-	public IFlowPath searchFlowPath(GraphDBConnection conn, FlowId flowId);
-	public IFlowPath newFlowPath(GraphDBConnection conn);
-	public void removeFlowPath(GraphDBConnection conn, IFlowPath flowPath);
-        public IFlowPath getFlowPathByFlowEntry(GraphDBConnection conn,
-						IFlowEntry flowEntry);
-	public Iterable<IFlowPath> getAllFlowPaths(GraphDBConnection conn);
-	public IFlowEntry searchFlowEntry(GraphDBConnection conn,
-					  FlowEntryId flowEntryId);
-	public IFlowEntry newFlowEntry(GraphDBConnection conn);
-	public void removeFlowEntry(GraphDBConnection conn,
-				    IFlowEntry flowEntry);
-	public Iterable<IFlowEntry> getAllFlowEntries(GraphDBConnection conn);
-	public IPortObject newPort(GraphDBConnection conn);
-	ISwitchObject newSwitch(GraphDBConnection conn);
-	void removePort(GraphDBConnection conn, IPortObject port);
-	void removeSwitch(GraphDBConnection conn, ISwitchObject sw);
-	Iterable<IFlowEntry> getAllSwitchNotUpdatedFlowEntries(GraphDBConnection conn);
-}
diff --git a/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java b/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java
new file mode 100644
index 0000000..d1e1c39
--- /dev/null
+++ b/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java
@@ -0,0 +1,319 @@
+/**
+ * 
+ */
+package net.onrc.onos.util;
+
+import static org.junit.Assert.*;
+
+import java.util.Iterator;
+
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
+import net.floodlightcontroller.core.internal.TestDatabaseManager;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.thinkaurelius.titan.core.TitanFactory;
+import com.thinkaurelius.titan.core.TitanGraph;
+import com.tinkerpop.blueprints.Vertex;
+
+/**
+ * @author Toshio Koide
+ *
+ */
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({TitanFactory.class})
+public class GraphDBOperationTest {
+	private static TitanGraph testdb;
+	private static GraphDBConnection conn;
+	private static GraphDBOperation op;
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@BeforeClass
+	public static void setUpBeforeClass() throws Exception {
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@AfterClass
+	public static void tearDownAfterClass() throws Exception {
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		TestDatabaseManager.deleteTestDatabase();
+		testdb = TestDatabaseManager.getTestDatabase();
+//		TestDatabaseManager.populateTestData(titanGraph);
+		
+		// replace return value of TitanFactory.open() to dummy DB created above
+		PowerMock.mockStatic(TitanFactory.class);
+		EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(testdb);
+		PowerMock.replay(TitanFactory.class);
+		
+		conn = GraphDBConnection.getInstance("/dummy/to/conf");
+		op = new GraphDBOperation(conn);
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+		conn.close();
+		testdb.shutdown();
+	}
+
+	private Iterator<Vertex> enumerateVertices(String vertexType) {
+		return testdb.getVertices("type", vertexType).iterator();
+	}
+	
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newSwitch(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testNewSwitch() {
+		Iterator<Vertex> vertices;
+		assertFalse(enumerateVertices("switch").hasNext());
+
+		ISwitchObject sw = op.newSwitch("123");
+		
+		assertEquals("123", sw.getDPID());
+		op.commit();
+
+		vertices = enumerateVertices("switch");
+		assertTrue(vertices.hasNext());
+		assertEquals(vertices.next().getProperty("dpid").toString(), "123");		
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 */
+	@Test
+	public final void testSearchSwitch() {
+		ISwitchObject sw = op.newSwitch("123");
+		op.commit();
+		
+		sw = op.searchSwitch("123");
+		
+		assertNotNull(sw);
+		assertEquals("123", sw.getDPID());
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchActiveSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 */
+	@Test
+	public final void testSearchActiveSwitch() {
+		ISwitchObject sw = op.newSwitch("111");
+		sw.setState(SwitchState.ACTIVE.toString());
+		sw = op.newSwitch("222");
+		sw.setState(SwitchState.INACTIVE.toString());
+		op.commit();
+		
+		sw = op.searchActiveSwitch("111");
+		assertNotNull(sw);
+		assertEquals("111", sw.getDPID());
+		
+		sw = op.searchActiveSwitch("222");
+		assertNull(sw);	
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getActiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetActiveSwitches() {
+		ISwitchObject sw = op.newSwitch("111");
+		sw.setState(SwitchState.ACTIVE.toString());
+		sw = op.newSwitch("222");
+		sw.setState(SwitchState.INACTIVE.toString());
+		op.commit();
+		
+		Iterator<ISwitchObject> i = op.getActiveSwitches().iterator();
+		assertTrue(i.hasNext());
+		assertEquals("111", i.next().getDPID());
+		assertFalse(i.hasNext());		
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeSwitch(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject)}.
+	 */
+	@Test
+	public final void testRemoveSwitch() {
+		ISwitchObject sw = op.newSwitch("123");
+		op.commit();	
+		sw = op.searchSwitch("123");
+		
+		op.removeSwitch(sw);
+
+		assertFalse(enumerateVertices("switch").hasNext());
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchDevice(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 */
+	@Test
+	public final void testSearchDevice() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchPort(net.onrc.onos.util.GraphDBConnection, java.lang.String, short)}.
+	 */
+	@Test
+	public final void testSearchPort() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newPort(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testNewPort() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newDevice(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testNewDevice() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removePort(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject)}.
+	 */
+	@Test
+	public final void testRemovePort() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeDevice(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject)}.
+	 */
+	@Test
+	public final void testRemoveDevice() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getDevices(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetDevices() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowId)}.
+	 */
+	@Test
+	public final void testSearchFlowPath() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowPath(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testNewFlowPath() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowPath)}.
+	 */
+	@Test
+	public final void testRemoveFlowPath() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getFlowPathByFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
+	 */
+	@Test
+	public final void testGetFlowPathByFlowEntry() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowPaths(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetAllFlowPaths() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowEntryId)}.
+	 */
+	@Test
+	public final void testSearchFlowEntry() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowEntry(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testNewFlowEntry() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
+	 */
+	@Test
+	public final void testRemoveFlowEntry() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetAllFlowEntries() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitchNotUpdatedFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetAllSwitchNotUpdatedFlowEntries() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetAllSwitches() {
+		fail("Not yet implemented");
+	}
+
+	/**
+	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getInactiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 */
+	@Test
+	public final void testGetInactiveSwitches() {
+		fail("Not yet implemented");
+	}
+
+}