diff --git a/src/main/java/net/onrc/onos/graph/DBOperation.java b/src/main/java/net/onrc/onos/graph/DBOperation.java
index 5983e7d..b58198a 100644
--- a/src/main/java/net/onrc/onos/graph/DBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/DBOperation.java
@@ -30,6 +30,10 @@
 
 	protected DBConnection conn;
 
+	/**
+	 * Search and get an active switch object with DPID.
+	 * @param dpid DPID of the switch 
+	 */
 	@Override
 	public ISwitchObject searchActiveSwitch(String dpid) {
 	    ISwitchObject sw = searchSwitch(dpid);
@@ -39,7 +43,11 @@
 	    }
 	    return null;
 	}
-
+	
+	/**
+	 * Create a new switch and return the created switch object.
+	 * @param dpid DPID of the switch
+	 */
 	@Override
 	public ISwitchObject newSwitch(final String dpid) {
 	    ISwitchObject obj = (ISwitchObject) conn.getFramedGraph().addVertex(null, ISwitchObject.class);
@@ -49,13 +57,19 @@
 	    }
 	    return obj;
 	}
-
+	
+	/**
+	 * Get all switch objects.
+	 */
 	@Override
 	public Iterable<ISwitchObject> getAllSwitches() {
 	    Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
 	    return switches;
 	}
 
+	/**
+	 * Get all inactive switch objects.
+	 */
 	@Override
 	public Iterable<ISwitchObject> getInactiveSwitches() {
 	    Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
@@ -68,7 +82,10 @@
 	    }
 	    return inactiveSwitches;
 	}
-
+	
+	/**
+	 * Get all flow entries objects where their switches are not updated.
+	 */
 	@Override
 	public Iterable<INetMapTopologyObjects.IFlowEntry> getAllSwitchNotUpdatedFlowEntries() {
 	    //TODO: Should use an enum for flow_switch_state
@@ -76,6 +93,10 @@
 
 	}
 
+	/**
+	 * Remove specified switch.
+	 * @param sw switch object to remove
+	 */
 	@Override
 	public void removeSwitch(ISwitchObject sw) {
 	    conn.getFramedGraph().removeVertex(sw.asVertex());
@@ -108,6 +129,11 @@
 	    return obj;
 	}
 
+	/**
+	 * Search and get a port object of specified switch and port number.
+	 * @param dpid DPID of a switch
+	 * @param number port number of the switch's port
+	 */
 	@Override
 	public IPortObject searchPort(String dpid, Short number) {
 	    String id = dpid + number.toString();
@@ -116,6 +142,10 @@
 
 	}
 
+	/**
+	 * Remove the specified switch port.
+	 * @param port switch port object to remove
+	 */
 	@Override
 	public void removePort(IPortObject port) {
 	    if (conn.getFramedGraph() != null) {
@@ -123,6 +153,9 @@
 	    }
 	}
 
+	/**
+	 * Create and return a device object.
+	 */
 	@Override
 	public IDeviceObject newDevice() {
 	    IDeviceObject obj = (IDeviceObject) conn.getFramedGraph().addVertex(null, IDeviceObject.class);
@@ -132,12 +165,18 @@
 	    return obj;
 	}
 
+	/**
+	 * Get all devices.
+	 */
 	@Override
 	public Iterable<IDeviceObject> getDevices() {
 	    return conn.getFramedGraph() != null ? conn.getFramedGraph().getVertices("type", "device", IDeviceObject.class) : null;
 	}
 
-
+	/**
+	 * Remove the specified device.
+	 * @param dev a device object to remove
+	 */
 	@Override
 	public void removeDevice(IDeviceObject dev) {
 	    if (conn.getFramedGraph() != null) {
@@ -148,7 +187,6 @@
 	/**
 	* Create and return a flow path object.
 	*/
-
 	@Override
 	public IFlowPath newFlowPath() {
 	    IFlowPath flowPath = (IFlowPath)conn.getFramedGraph().addVertex(null, IFlowPath.class);
@@ -158,6 +196,10 @@
 	    return flowPath;
 	}
 
+	/**
+	 * Get a flow path object with a flow entry.
+	 * @param flowEntry flow entry object
+	 */
 	@Override
 	public IFlowPath getFlowPathByFlowEntry(INetMapTopologyObjects.IFlowEntry flowEntry) {
 	    GremlinPipeline<Vertex, IFlowPath> pipe = new GremlinPipeline<Vertex, IFlowPath>();
@@ -179,6 +221,9 @@
 		    ? (ISwitchObject) (conn.getFramedGraph().getVertices("dpid", dpid, ISwitchObject.class).iterator().next()) : null;
 	}
 
+	/**
+	 * Get all active switch objects.
+	 */
 	@Override
 	public Iterable<ISwitchObject> getActiveSwitches() {
 	    Iterable<ISwitchObject> switches = conn.getFramedGraph().getVertices("type", "switch", ISwitchObject.class);
@@ -192,6 +237,10 @@
 	    return activeSwitches;
 	}
 
+	/**
+	 * Search and get a device object having specified MAC address.
+	 * @param macAddr MAC address to search and get
+	 */
 	@Override
 	public IDeviceObject searchDevice(String macAddr) {
 	    return (conn.getFramedGraph() != null && conn.getFramedGraph().getVertices("dl_addr", macAddr).iterator().hasNext())
@@ -199,12 +248,19 @@
 
 	}
 
+	/**
+	 * Search and get a flow path object with specified flow ID.
+	 * @param flowId flow ID to search
+	 */
 	protected IFlowPath searchFlowPath(final FlowId flowId, final FramedGraph fg) {
 	    return fg.getVertices("flow_id", flowId.toString()).iterator().hasNext()
 		    ? (IFlowPath) fg.getVertices("flow_id", flowId.toString(),
 		    IFlowPath.class).iterator().next() : null;
 	}
 
+	/**
+	 * Get all flow path objects.
+	 */
 	protected Iterable<IFlowPath> getAllFlowPaths(final FramedGraph fg) {
 	    Iterable<IFlowPath> flowPaths = fg.getVertices("type", "flow", IFlowPath.class);
 
@@ -217,7 +273,10 @@
 	    }
 	    return nonNullFlows;
 	}
-
+	
+	/**
+	 * Create and return a flow entry object.
+	 */
 	@Override
 	public IFlowEntry newFlowEntry() {
 	    IFlowEntry flowEntry = (IFlowEntry) conn.getFramedGraph().addVertex(null, IFlowEntry.class);
@@ -231,6 +290,7 @@
 	public IIpv4Address newIpv4Address() {
 		return newVertex("ipv4Address", IIpv4Address.class);
 	}
+	
 	private <T extends IBaseObject> T newVertex(String type, Class<T> vertexType) {
 		T newVertex = (T) conn.getFramedGraph().addVertex(null, vertexType);
 		if (newVertex != null) {
