Merge branch 'master' into release

Conflicts:
	src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
diff --git a/README.md b/README.md
index b10188e..8c0cc0a 100644
--- a/README.md
+++ b/README.md
@@ -31,12 +31,14 @@
 
 1. Start zookeeper
 
-    $ cd (ZOOKEEPER-INSTALL-DIR)/bin
-    
-    $ ./zkServer.sh start
+    $ cd (ONOS-INSTALL-DIR)/
+
+    $ ./start-zk.sh
 
 2. Start cassandra
 
+    $ cd (ONOS-INSTALL-DIR)/
+
     $ ./start-cassandra.sh start
 
   1. Confirm cassandra is running
@@ -58,8 +60,8 @@
 
 1. Start Zookeeper
 
-    $ cd (ZOOKEEPER-INSTALL-DIR)/bin
-    
+    $ cd (ONOS-INSTALL-DIR)/
+
     $ ./zkServer.sh start
     
 2. Start ONOS and Cassandra embedded
diff --git a/onos-embedded.sh b/onos-embedded.sh
index b5cfed6..fe0db44 100755
--- a/onos-embedded.sh
+++ b/onos-embedded.sh
@@ -1,9 +1,9 @@
 #!/bin/sh
 
 # Set paths
-FL_HOME=`dirname $0`
-FL_JAR="${FL_HOME}/target/floodlight.jar"
-FL_LOGBACK="${FL_HOME}/logback.xml"
+ONOS_HOME=`dirname $0`
+ONOS_JAR="${ONOS_HOME}/target/floodlight.jar"
+ONOS_LOGBACK="${ONOS_HOME}/logback.xml"
 TITAN_CONFIG="/tmp/cassandra.titan"
 CASSANDRA_CONFIG="/home/`whoami`/apache-cassandra-1.1.4/conf/cassandra.yaml"
 
@@ -17,15 +17,15 @@
 #JVM_OPTS="$JVM_OPTS -Dpython.security.respectJavaAccessibility=false"
 
 # Set classpath to include titan libs
-#CLASSPATH=`echo ${FL_HOME}/lib/*.jar ${FL_HOME}/lib/titan/*.jar | sed 's/ /:/g'`
-CLASSPATH="${FL_HOME}/lib/*.jar:${FL_HOME}/lib/titan/*.jar"
+#CLASSPATH=`echo ${ONOS_HOME}/lib/*.jar ${ONOS_HOME}/lib/titan/*.jar | sed 's/ /:/g'`
+CLASSPATH="${ONOS_HOME}/lib/*.jar:${ONOS_HOME}/lib/titan/*.jar"
 
 CASSANDRA_OPTS="-Dcom.sun.management.jmxremote.port=7199"
 CASSANDRA_OPTS="$CASSANDRA_OPTS -Dcom.sun.management.jmxremote.ssl=false"
 CASSANDRA_OPTS="$CASSANDRA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
 
 # Create a logback file if required
-cat <<EOF_LOGBACK >${FL_LOGBACK}
+cat <<EOF_LOGBACK >${ONOS_LOGBACK}
 <configuration scan="true" debug="true">
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
     <encoder>
@@ -64,5 +64,5 @@
 # Run floodlight
 echo "Starting ONOS controller ..."
 echo 
-#java ${JVM_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${FL_JAR} -cf ./onos.properties
-java ${JVM_OPTS} ${CASSANDRA_OPTS} -Dlogback.configurationFile=${FL_LOGBACK} -jar ${FL_JAR}
+#java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -Xbootclasspath/a:$CLASSPATH -jar ${ONOS_JAR} -cf ./onos.properties
+java ${JVM_OPTS} ${CASSANDRA_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR}
diff --git a/scripts/runiperf.sh b/scripts/runiperf.sh
index 4e26bd2..6233986 100755
--- a/scripts/runiperf.sh
+++ b/scripts/runiperf.sh
@@ -2,11 +2,17 @@
 import sys
 import os
 
+ONOSDIR=os.getenv("HOME") + "/ONOS"
+IPERF=ONOSDIR + "/scripts/iperf"
+IPERFLOGDIR=ONOSDIR + "/web/log"
+
 # Usage: flowid src_dpid dst_dpid params
 def usage():
   print "%s flowid src_dpid dst_dpid hw:svr|sw:svr|hw:client|sw:client <proto>/<duration>/<interval>/<samples>" % sys.argv[0]
   sys.exit()
 
+
+
 def main():
   flowid = sys.argv[1]
   src_dpid = sys.argv[2]
@@ -24,9 +30,16 @@
   src_hostid=int(src_dpid.split(':')[-1], 16)
   dst_hostid=int(dst_dpid.split(':')[-1], 16)
 
+  if (testbed == "SW"):
+    MRUN=ONOSDIR + "/test-network/mininet/mrun"
+    HOST_FMT="host%d.%d"
+  else:
+    MRUN=ONOSDIR + "$HOME/mininet/util/m"
+    HOST_FMT="g%sh%02d"
+
   if (proto == "tcp"):
-    if (testbed == "SW"):
-      cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperf_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
+      mininet_host = HOST_FMT % (dst_nwid, dst_hostid)
+      cmd="%s %s \'%s -t%s -i%s -k%s -yJ -o %s/iperf_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (MRUN, mininet_host, IPERF, src_hostid, duration, interval, samples, IPERFLOGDIR, flowid, dst_nwid, dst_hostid)
       killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperf_%s.out\"' % (flowid)
       print killcmd
       print cmd
@@ -34,21 +47,18 @@
       os.popen(cmd)
   else:
     if (server == 'S'):
-      if (testbed == "SW"): 
-        cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_hostid, interval, samples, flowid)
-      else:
-        cmd="~/mininet/util/m g%sh%02d '/home/ubuntu/ONOS/scripts/iperf -us -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfsvr_%s.out 2>&1 &' &" % (dst_nwid, dst_hostid, interval, samples, flowid)
+      mininet_host = HOST_FMT % (dst_nwid, dst_hostid)
+      cmd="%s %s \'%s -us -i%s -k%s -yJ -o %s/iperfsvr_%s.out 2>&1 &\' &" % (MRUN, mininet_host, IPERF, interval, samples, IPERFLOGDIR, flowid)
       killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfsvr_%s.out\"' % (flowid)
       print killcmd
       print cmd
     else:
-      if (testbed == "SW"): 
-        cmd="ssh -o StrictHostKeyChecking=no 1.1.%d.1 '/home/ubuntu/ONOS/scripts/iperf -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid)
-      else:
-        cmd="~/mininet/util/m g%sh%02d '/home/ubuntu/ONOS/scripts/iperf -u -t%s -i%s -k%s -yJ -o /home/ubuntu/ONOS/web/log/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &' &" % (src_nwid, src_hostid, duration, interval, samples, flowid, dst_nwid, dst_hostid )
+      mininet_host = HOST_FMT % (src_nwid, src_hostid)
+      cmd="%s %s \'%s -u  -t%s -i%s -k%s -yJ -o %s/iperfclient_%s.out -c 192.168.%d.%d 2>&1 &\' &" % (MRUN, mininet_host, IPERF, duration, interval, samples, IPERFLOGDIR, flowid, dst_nwid, dst_hostid)
       killcmd='sudo pkill -KILL -f \"iperf .* -o .*/iperfclient_%s.out\"' % (flowid)
       print killcmd
       print cmd
+
     os.popen(killcmd)
     os.popen(cmd)
 
diff --git a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
index 0eca19c..467c74a 100644
--- a/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
+++ b/src/main/java/net/floodlightcontroller/core/internal/OFSwitchImpl.java
@@ -402,7 +402,7 @@
      */
     @Override
     public String toString() {
-        return "OFSwitchImpl [" + channel.getRemoteAddress() + " DPID[" + ((stringId != null) ? stringId : "?") + "]]";
+        return "OFSwitchImpl [" + ((channel != null) ? channel.getRemoteAddress() : "?") + " DPID[" + ((stringId != null) ? stringId : "?") + "]]";
     }
 
     @Override
diff --git a/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java b/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
index 9e69115..1f041e6 100644
--- a/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
+++ b/src/main/java/net/onrc/onos/flow/FlowManagerImpl.java
@@ -18,6 +18,8 @@
 import com.tinkerpop.blueprints.Vertex;
 
 import net.floodlightcontroller.core.IOFSwitch;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.graph.LocalTopologyEventListener;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
@@ -30,8 +32,6 @@
 import net.onrc.onos.ofcontroller.util.FlowPath;
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
-import net.onrc.onos.util.GraphDBOperation;
-import net.onrc.onos.util.LocalTopologyEventListener;
 
 public class FlowManagerImpl implements IFlowManager {
 	
diff --git a/src/main/java/net/onrc/onos/util/GraphDBConnection.java b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
similarity index 98%
rename from src/main/java/net/onrc/onos/util/GraphDBConnection.java
rename to src/main/java/net/onrc/onos/graph/GraphDBConnection.java
index 1cc4e5a..53235ab 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBConnection.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import java.util.Set;
 
diff --git a/src/main/java/net/onrc/onos/util/GraphDBOperation.java b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
similarity index 99%
rename from src/main/java/net/onrc/onos/util/GraphDBOperation.java
rename to src/main/java/net/onrc/onos/graph/GraphDBOperation.java
index 92157fb..0718db2 100644
--- a/src/main/java/net/onrc/onos/util/GraphDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/GraphDBOperation.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/src/main/java/net/onrc/onos/util/IDBConnection.java b/src/main/java/net/onrc/onos/graph/IDBConnection.java
similarity index 92%
rename from src/main/java/net/onrc/onos/util/IDBConnection.java
rename to src/main/java/net/onrc/onos/graph/IDBConnection.java
index 995ce39..82ebba2 100644
--- a/src/main/java/net/onrc/onos/util/IDBConnection.java
+++ b/src/main/java/net/onrc/onos/graph/IDBConnection.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import com.thinkaurelius.titan.core.TitanGraph;
 import com.tinkerpop.frames.FramedGraph;
diff --git a/src/main/java/net/onrc/onos/util/IDBOperation.java b/src/main/java/net/onrc/onos/graph/IDBOperation.java
similarity index 98%
rename from src/main/java/net/onrc/onos/util/IDBOperation.java
rename to src/main/java/net/onrc/onos/graph/IDBOperation.java
index 335b08b..73e7651 100644
--- a/src/main/java/net/onrc/onos/util/IDBOperation.java
+++ b/src/main/java/net/onrc/onos/graph/IDBOperation.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
diff --git a/src/main/java/net/onrc/onos/util/LocalGraphChangedListener.java b/src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java
similarity index 84%
rename from src/main/java/net/onrc/onos/util/LocalGraphChangedListener.java
rename to src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java
index ac819f9..5f3bbf1 100644
--- a/src/main/java/net/onrc/onos/util/LocalGraphChangedListener.java
+++ b/src/main/java/net/onrc/onos/graph/LocalGraphChangedListener.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import com.tinkerpop.blueprints.util.wrappers.event.listener.GraphChangedListener;
 
diff --git a/src/main/java/net/onrc/onos/util/LocalTopologyEventListener.java b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
similarity index 98%
rename from src/main/java/net/onrc/onos/util/LocalTopologyEventListener.java
rename to src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
index dd3c2ec..f83e7c2 100644
--- a/src/main/java/net/onrc/onos/util/LocalTopologyEventListener.java
+++ b/src/main/java/net/onrc/onos/graph/LocalTopologyEventListener.java
@@ -1,4 +1,4 @@
-package net.onrc.onos.util;
+package net.onrc.onos.graph;
 
 import net.onrc.onos.flow.FlowManagerImpl;
 import net.onrc.onos.flow.IFlowManager;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java b/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
index d008220..79a4f76 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/ISwitchStorage.java
@@ -23,18 +23,6 @@
 	/*
 	 * Get all ports associated on a switch
 	 */
-	public Collection<OFPhysicalPort> getPorts(long dpid);
-	/*
-	 * Get Port by Number
-	 */
-	public OFPhysicalPort getPort(String dpid, short portnum);
-	/*
-	 * Get port by name
-	 */
-	public OFPhysicalPort getPort(String dpid, String portName);
-	/*
-	 * Add a switch
-	 */
 	public void addSwitch(String dpid);
 	/*
 	 * Delete switch and associated ports
@@ -45,12 +33,6 @@
 	 */
 	public void deletePort(String dpid, short port);
 	/*
-	 * Delete port on a switch by name
-	 */
-	public void deletePort(String dpid, String portName);
-	
-	
-	/*
 	 * Initialize
 	 */
 	public void init(String conf);
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
index dcb28ce..d4ab34f 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/DeviceStorageImpl.java
@@ -11,11 +11,11 @@
 import net.floodlightcontroller.devicemanager.IDevice;
 import net.floodlightcontroller.devicemanager.SwitchPort;
 import net.floodlightcontroller.packet.IPv4;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.IDeviceStorage;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
-import net.onrc.onos.util.GraphDBOperation;
 
 /**
  * This is the class for storing the information of devices into CassandraDB
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
index b33591e..50783c9 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImpl.java
@@ -4,11 +4,11 @@
 import java.util.List;
 
 import net.floodlightcontroller.routing.Link;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.ILinkStorage;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.util.HexString;
 import org.slf4j.Logger;
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 2e9ea60..f2b87ce 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
@@ -1,11 +1,10 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
-import java.util.Collection;
-
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.protocol.OFPhysicalPort;
 import org.openflow.protocol.OFPhysicalPort.OFPortConfig;
@@ -13,16 +12,99 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * This is the class for storing the information of switches into CassandraDB
+ */
 public class SwitchStorageImpl implements ISwitchStorage {
 	protected GraphDBOperation op;
 	protected static Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
-
+	
+	/***
+	 * Initialize function. Before you use this class, please call this method
+	 * @param conf configuration file for Cassandra DB
+	 */
 	@Override
-	public void update(String dpid, SwitchState state, DM_OPERATION op) {
-		// TODO Auto-generated method stub
-		log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
-        switch(op) {
+	public void init(String conf) {
+		GraphDBConnection conn = GraphDBConnection.getInstance(conf);
+		op = new GraphDBOperation(conn);
+	}
 
+	/***
+	 * Finalize/close function. After you use this class, please call this method.
+	 * It will close the DB connection.
+	 */
+	public void finalize() {
+		close();
+	}
+	
+	/***
+	 * Finalize/close function. After you use this class, please call this method.
+	 * It will close the DB connection. This is for Java gabage collection.
+	 */
+	@Override
+	public void close() {
+		op.close();		
+	}
+	
+	private void setStatus(String dpid, SwitchState state) {
+		ISwitchObject sw = op.searchSwitch(dpid);
+		
+		try {
+			if (sw != null) {
+				sw.setState(state.toString());
+				op.commit();
+				log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
+			}
+		} catch(Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);	
+		}
+	}
+
+	/***
+	 * This function is for adding the switch into the DB.
+	 * @param dpid The switch dpid you want to add into the DB.
+	 */
+	@Override
+	public void addSwitch(String dpid) {
+		
+		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
+		try {
+			ISwitchObject sw = op.searchSwitch(dpid);
+			if (sw != null) {
+				//If existing the switch. set The SW state ACTIVE. 
+				log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
+				sw.setState(SwitchState.ACTIVE.toString());
+				op.commit();
+			} else {
+				sw = op.newSwitch(dpid);
+
+				if (sw != null) {
+					sw.setState(SwitchState.ACTIVE.toString());
+					op.commit();
+					log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
+				} else {
+					log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
+				}
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();
+			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
+		}
+	}
+	
+	/***
+	 * This function is for updating the switch into the DB.
+	 * @param dpid The switch dpid you want to update from the DB
+	 * @param state The state of the switch like ACTIVE, INACTIVE
+	 * @param dmope	The DM_OPERATION of the switch
+	 */
+	@Override
+	public void update(String dpid, SwitchState state, DM_OPERATION dmope) {
+		log.info("SwitchStorage:update dpid:{} state: {} ", dpid, state);
+        switch(dmope) {
         	case UPDATE:
         	case INSERT:
         	case CREATE:
@@ -38,29 +120,41 @@
         }
 	}
 
-	private void setStatus(String dpid, SwitchState state) {
-		ISwitchObject sw = op.searchSwitch(dpid);
-		if (sw != null) {
-			sw.setState(state.toString());
-			op.commit();
-			log.info("SwitchStorage:setStatus dpid:{} state: {} done", dpid, state);
-		} 	else {
-			op.rollback();
-			log.info("SwitchStorage:setStatus dpid:{} state: {} failed: switch not found", dpid, state);
+	/***
+	 * This function is for deleting the switch into the DB.
+	 * @param dpid The switch dpid you want to delete from the DB.
+	 */
+	@Override
+	public void deleteSwitch(String dpid) {
+		try {
+			ISwitchObject sw = op.searchSwitch(dpid);
+            if (sw  != null) {
+            	op.removeSwitch(sw);
+            	op.commit();
+            	log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
+            }
+		} catch (Exception e) {
+			e.printStackTrace();
+			op.rollback();			
+			log.error("SwitchStorage:deleteSwitch {} failed", dpid);
 		}
+
 	}
 
+	/***
+	 * This function is for adding the switch port into the DB.
+	 * @param dpid The switch dpid that has the port.
+	 * @param port The port you want to add the switch.
+	 */
 	@Override
 	public void addPort(String dpid, OFPhysicalPort port) {
-		// TODO Auto-generated method stub
 		
-        boolean portDown = ((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
-        		((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0);
-       if (portDown) {
-             deletePort(dpid, port.getPortNumber());
-             return;
+       if(((OFPortConfig.OFPPC_PORT_DOWN.getValue() & port.getConfig()) > 0) ||
+        					((OFPortState.OFPPS_LINK_DOWN.getValue() & port.getState()) > 0)) {
+    	     deletePort(dpid, port.getPortNumber());
+             return;  
        }
-             
+
 		try {
 			ISwitchObject sw = op.searchSwitch(dpid);
 
@@ -81,95 +175,20 @@
         		log.error("SwitchStorage:addPort dpid:{} port:{} : failed switch does not exist", dpid, port.getPortNumber());
             }
 		} catch (Exception e) {
-             // TODO: handle exceptions
 			e.printStackTrace();
 			op.rollback();
 			log.error("SwitchStorage:addPort dpid:{} port:{} failed", dpid, port.getPortNumber());
 		}	
 
 	}
-
-	@Override
-	public Collection<OFPhysicalPort> getPorts(long dpid) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public OFPhysicalPort getPort(String dpid, short portnum) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public OFPhysicalPort getPort(String dpid, String portName) {
-		// TODO Auto-generated method stub
-		return null;
-	}
-
-	@Override
-	public void addSwitch(String dpid) {
-		
-		log.info("SwitchStorage:addSwitch(): dpid {} ", dpid);
-		
-		try {
-			ISwitchObject sw = op.searchSwitch(dpid);
-			if (sw != null) {
-				/*
-				 *  Do nothing or throw exception?
-				 */
-
-				log.info("SwitchStorage:addSwitch dpid:{} already exists", dpid);
-				sw.setState(SwitchState.ACTIVE.toString());
-				op.commit();
-			} else {
-				sw = op.newSwitch(dpid);
-
-				if (sw != null) {
-					sw.setState(SwitchState.ACTIVE.toString());
-					op.commit();
-					log.info("SwitchStorage:addSwitch dpid:{} added", dpid);
-				} else {
-					log.error("switchStorage:addSwitch dpid:{} failed -> newSwitch failed", dpid);
-				}
-			}
-		} catch (Exception e) {
-			/*
-			 * retry?
-			 */
-			e.printStackTrace();
-			op.rollback();
-			log.info("SwitchStorage:addSwitch dpid:{} failed", dpid);
-		}
-
-
-	}
-
-	@Override
-	public void deleteSwitch(String dpid) {
-		// TODO Setting inactive but we need to eventually remove data
-
-		try {
-
-			ISwitchObject sw = op.searchSwitch(dpid);
-            if (sw  != null) {
-            	op.removeSwitch(sw);
- 
-            	op.commit();
-            	log.info("SwitchStorage:DeleteSwitch dpid:{} done", dpid);
-            }
-		} catch (Exception e) {
-             // TODO: handle exceptions
-			e.printStackTrace();
-			op.rollback();			
-			log.error("SwitchStorage:deleteSwitch {} failed", dpid);
-		}
-
-	}
-
+	
+	/***
+	 * This function is for deleting the switch port from the DB.
+	 * @param dpid The switch dpid that has the port.
+	 * @param port The port you want to delete the switch.
+	 */
 	@Override
 	public void deletePort(String dpid, short port) {
-		// TODO Auto-generated method stub
 		try {
 			ISwitchObject sw = op.searchSwitch(dpid);
 
@@ -183,36 +202,9 @@
             	}
             }
 		} catch (Exception e) {
-             // TODO: handle exceptions
 			e.printStackTrace();
 			op.rollback();
 			log.info("SwitchStorage:deletePort dpid:{} port:{} failed", dpid, port);
 		}	
 	}
-
-	@Override
-	public void deletePort(String dpid, String portName) {
-		// TODO Auto-generated method stub
-
-	}
-
-
-
-	@Override
-	public void init(String conf) {
-		op = new GraphDBOperation(conf);
-	}
-
-
-
-	public void finalize() {
-		close();
-	}
-	
-	@Override
-	public void close() {
-		op.close();		
-	}
-
-	
-}
+}
\ No newline at end of file
diff --git a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
index 1222ff3..e810646 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/core/internal/TopoLinkServiceImpl.java
@@ -4,10 +4,10 @@
 import java.util.List;
 
 import net.floodlightcontroller.routing.Link;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoLinkService;
 import net.onrc.onos.ofcontroller.core.internal.LinkStorageImpl.ExtractLink;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 c1659fb..978fcde 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
@@ -1,9 +1,9 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoSwitchService;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
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 97ecfcc..ac9409f 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
@@ -2,8 +2,8 @@
 
 import java.util.Iterator;
 
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.restlet.resource.Get;
 import org.restlet.resource.ServerResource;
diff --git a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
index bb7318f..5b8e25b 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/floodlightlistener/NetworkGraphPublisher.java
@@ -24,6 +24,10 @@
 import net.floodlightcontroller.devicemanager.IDeviceService;
 import net.floodlightcontroller.routing.Link;
 import net.floodlightcontroller.threadpool.IThreadPoolService;
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.graph.IDBConnection;
+import net.onrc.onos.graph.LocalTopologyEventListener;
 import net.onrc.onos.ofcontroller.core.IDeviceStorage;
 import net.onrc.onos.ofcontroller.core.ILinkStorage;
 import net.onrc.onos.ofcontroller.core.IOFSwitchPortListener;
@@ -39,10 +43,6 @@
 import net.onrc.onos.registry.controller.IControllerRegistryService;
 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 NetworkGraphPublisher implements IDeviceListener, IOFSwitchListener, IOFSwitchPortListener,
 		ILinkDiscoveryListener, IFloodlightModule {
diff --git a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
index 2dc230c..2e0d837 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/flowmanager/FlowManager.java
@@ -27,6 +27,7 @@
 import net.floodlightcontroller.restserver.IRestApiService;
 import net.floodlightcontroller.util.MACAddress;
 import net.floodlightcontroller.util.OFMessageDamper;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapStorage;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
@@ -49,7 +50,6 @@
 import net.onrc.onos.ofcontroller.util.IPv4Net;
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.protocol.OFFlowMod;
 import org.openflow.protocol.OFMatch;
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 0184915..432e578 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/routing/TopoRouteService.java
@@ -15,6 +15,7 @@
 import net.floodlightcontroller.core.module.FloodlightModuleException;
 import net.floodlightcontroller.core.module.IFloodlightModule;
 import net.floodlightcontroller.core.module.IFloodlightService;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyService.ITopoRouteService;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
@@ -23,7 +24,6 @@
 import net.onrc.onos.ofcontroller.util.FlowEntry;
 import net.onrc.onos.ofcontroller.util.Port;
 import net.onrc.onos.ofcontroller.util.SwitchPort;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.openflow.util.HexString;
 import org.slf4j.Logger;
@@ -263,7 +263,7 @@
      * See the documentation for method @ref prepareShortestPathTopo()
      * for additional information and usage.
      *
-     * @shortestPathTopo the Shortest Path info handler to release.
+     * @param shortestPathTopo the Shortest Path info handler to release.
      */
     public void dropShortestPathTopo(Map<Long, ?> shortestPathTopo) {
 	shortestPathTopo = null;
diff --git a/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java b/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java
index 8a09139..f811c9d 100644
--- a/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java
+++ b/src/test/java/net/floodlightcontroller/core/internal/TestDatabaseManager.java
@@ -58,8 +58,17 @@
         Iterator<Vertex> it = titanGraph.getVertices("type", "port").iterator();
         while (it.hasNext()){
         	Vertex port = it.next();
-        	Integer portNum = (Integer) port.getProperty("number");
-        	port.setProperty("number", portNum.shortValue());
+
+        	if(port.getProperty("number") instanceof Short)
+        	{
+        		Short portNum = (Short) port.getProperty("number");
+        		port.setProperty("number", portNum.shortValue());
+        	}
+        	else{
+        		Integer portNum = (Integer) port.getProperty("number");	
+        		port.setProperty("number", portNum.shortValue());
+        	}
+
         }
         titanGraph.stopTransaction(Conclusion.SUCCESS);
 	}
@@ -73,4 +82,4 @@
 		}
 	}
 	
-}
\ No newline at end of file
+}
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
index b0577a5..5c42452 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/LinkStorageImplTest.java
@@ -11,13 +11,13 @@
 import java.util.Map;
 
 import net.floodlightcontroller.routing.Link;
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.ILinkStorage;
 import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.linkdiscovery.LinkInfo;
-import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBOperation;
 
 import org.easymock.*;
 import org.junit.After;
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java
index ebfb532..f65eb4f 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTest.java
@@ -1,278 +1,768 @@
 package net.onrc.onos.ofcontroller.core.internal;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
+import static org.easymock.EasyMock.*;
 
-import java.util.Collection;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Iterator;
-
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage;
 import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
-
+import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
+import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 import org.openflow.protocol.OFPhysicalPort;
+import org.openflow.protocol.OFPhysicalPort.OFPortState;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.LoggerFactory;
 
+import com.thinkaurelius.titan.core.TitanFactory;
 import com.thinkaurelius.titan.core.TitanGraph;
-import com.tinkerpop.blueprints.Vertex;
-import com.tinkerpop.gremlin.java.GremlinPipeline;
-import com.tinkerpop.pipes.PipeFunction;
-import com.tinkerpop.pipes.branch.LoopPipe.LoopBundle;
 
-import javax.script.ScriptContext;
-import javax.script.ScriptEngine;
-import javax.script.ScriptException;
-import com.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
-
-
+//Add Powermock preparation
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({TitanFactory.class, GraphDBConnection.class, GraphDBOperation.class, SwitchStorageImpl.class})
 public class SwitchStorageImplTest {
 
-	private ISwitchStorage switchStorage;
-	private TitanGraph titanGraph;
-	
+	protected static org.slf4j.Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
+
+	String conf;
+    private GraphDBConnection mockConn = null;
+    private GraphDBOperation mockOpe = null;
+    private GraphDBOperation realOpe = null;
+    private TitanGraph titanGraph = null;
+    ISwitchStorage swSt = null;
+    
 	@Before
 	public void setUp() throws Exception {
-		titanGraph = TestDatabaseManager.getTestDatabase();
-		TestDatabaseManager.populateTestData(titanGraph);
 		
-		switchStorage = new TestableSwitchStorageImpl();
+		swSt = new SwitchStorageImpl();
+		conf = "/dummy/path/to/db";
+		
+        // Make mock cassandra DB
+		// Replace TitanFactory.open() to return mock DB
+
+		PowerMock.mockStatic(GraphDBConnection.class);
+		mockConn = createMock(GraphDBConnection.class);
+		PowerMock.suppress(PowerMock.constructor(GraphDBConnection.class));
+		EasyMock.expect(GraphDBConnection.getInstance((String)EasyMock.anyObject())).andReturn(mockConn);
+		PowerMock.replay(GraphDBConnection.class);
+		
+		PowerMock.mockStatic(GraphDBOperation.class);
+		mockOpe = PowerMock.createStrictMock(GraphDBOperation.class);
+		PowerMock.expectNew(GraphDBOperation.class, mockConn).andReturn(mockOpe);
+		PowerMock.replay(GraphDBOperation.class);
+        // Replace the conf to dummy conf
+		// String conf = "/tmp/cassandra.titan";
+		
+
 	}
 
 	@After
 	public void tearDown() throws Exception {
-		titanGraph.shutdown();
+		swSt.close();
+		swSt = null;
+		
 	}
-
-	@Ignore @Test
-	public void testUpdate() {
-		fail("Not yet implemented");
-	}
-
-	@Test
-	public void testAddPort() {
-		
-		String dpid = "00:00:00:00:00:00:0a:01";
-		short portNumber = 5;
-		
-		OFPhysicalPort portToAdd = new OFPhysicalPort();
-		portToAdd.setName("port 5 at SEA switch");
-		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
-		portToAdd.setPortNumber(portNumber);
-		
-		switchStorage.addPort(dpid, portToAdd);
-		
-		Vertex sw = titanGraph.getVertices("dpid", dpid).iterator().next();
-		
-		GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
-		pipe.start(sw).out("on").has("number", portNumber);
-		
-		assertTrue(pipe.hasNext());
-		Vertex addedPort = pipe.next();
-		assertFalse(pipe.hasNext());
-		
-		assertEquals(addedPort.getProperty("number"), portNumber);
-	}
-
-	@Ignore @Test
-	public void testGetPorts() {
-		fail("Not yet implemented");
-	}
-
-	@Ignore @Test
-	public void testGetPortStringShort() {
-		fail("Not yet implemented");
-	}
-
-	@Ignore @Test
-	public void testGetPortStringString() {
-		fail("Not yet implemented");
-	}
-
+	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  Normal
+	 * Expect:
+	 * 	Call SwitchStorageImpl.addSwitch func with proper properties.
+	 */
+	@Ignore 
 	@Test
 	public void testAddSwitch() {
 		String dpid = "00:00:00:00:00:00:0a:07";
+		String state = "ACTIVE";
 		
-		switchStorage.addSwitch(dpid);
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		replay(mockISw);
 		
-		Iterator<Vertex> it = titanGraph.getVertices("dpid", dpid).iterator();
-		assertTrue(it.hasNext());
-		Vertex addedSwitch = it.next();
-		assertFalse(it.hasNext());
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
 		
-		assertEquals(addedSwitch.getProperty("type"), "switch");
-		assertEquals(addedSwitch.getProperty("dpid"), dpid);
-		assertEquals(addedSwitch.getProperty("state"), SwitchState.ACTIVE.toString());
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
 	}
-
 	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  The switch is already existing.
+	 * Expect:
+	 * 	Call SwitchStorageImpl.addSwitch func with proper properties.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddSwitchExisting() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		String state = "ACTIVE";
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.setState(state);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addSwitch(dpid);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  The switch construction is fail and return null
+	 * Expect:
+	 * 	Write the status as info log.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddSwitchAbnormal() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(null);
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  Tthrow runtimeException. 
+	 * Expect:
+	 * 	The rollback method is called.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddSwitchException() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		String state = "ACTIVE";
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expectLastCall().andThrow(new RuntimeException());
+		mockOpe.rollback();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for updateSwitch method.
+	 * Condition:
+	 *  SwitchState : INACTIVE
+	 *  DMOPERATION : UPDATE
+	 * Expect:
+	 * 	Should call addSwitch function and commit.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdateUPDATE() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		SwitchState stateINACTIVE = SwitchState.INACTIVE;
+		DM_OPERATION opUPDATE = DM_OPERATION.UPDATE;
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState("ACTIVE");
+		mockISw.setState(stateINACTIVE.toString());
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);	
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.update(dpid, stateINACTIVE, opUPDATE);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for updateSwitch method.
+	 * Condition:
+	 *  SwitchState : INACTIVE
+	 *  DMOPERATION : CREATE
+	 * Expect:
+	 * 	Should call addSwitch function and commit.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdateCREATE() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		SwitchState stateINACTIVE = SwitchState.INACTIVE;
+		DM_OPERATION opCREATE = DM_OPERATION.CREATE;
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState("ACTIVE");
+		mockISw.setState(stateINACTIVE.toString());
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);	
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.update(dpid, stateINACTIVE, opCREATE);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for updateSwitch method.
+	 * Condition:
+	 *  SwitchState : INACTIVE
+	 *  DMOPERATION : INSERT
+	 * Expect:
+	 * 	Should call addSwitch function and commit.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdateINSERT() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		SwitchState stateINACTIVE = SwitchState.INACTIVE;
+		DM_OPERATION opINSERT = DM_OPERATION.INSERT;
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState("ACTIVE");
+		mockISw.setState(stateINACTIVE.toString());
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.update(dpid, stateINACTIVE, opINSERT);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for updateSwitch method.
+	 * Condition:
+	 *  SwitchState : ACTIVE
+	 *  DMOPERATION : DELETE
+	 * Expect:
+	 * 	Should call removeSwitch function and commit.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdateDELETE() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		SwitchState stateACTIVE = SwitchState.ACTIVE;
+		DM_OPERATION opDELETE = DM_OPERATION.DELETE;
+		
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(stateACTIVE.toString());
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		mockOpe.removeSwitch(mockISw);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+		
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.update(dpid, stateACTIVE, opDELETE);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for deleteSwitch method.
+	 * Condition:
+	 *  The switch is existing.
+	 * Expect:
+	 * 	Should call removeSwitch function and commit.
+	 */
+	//@Ignore
 	@Test
 	public void testDeleteSwitch() {
-		String dpid = "00:00:00:00:00:00:0a:01";
+		String dpid = "00:00:00:00:00:00:0a:07";
+		String state = "ACTIVE";
+	
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		replay(mockISw);
 		
-		switchStorage.deleteSwitch(dpid);
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+    	mockOpe.removeSwitch(mockISw);
+    	mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
 		
-		Iterator<Vertex> it = titanGraph.getVertices("dpid", dpid).iterator();
-		assertFalse(it.hasNext());
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.deleteSwitch(dpid);
+		
+		//Iterator<Vertex> it = titanGraph.getVertices("dpid", dpid).iterator();
+		//assertFalse(it.hasNext());
 	}
-
+	
+	/**
+	 * Desc:
+	 *  Test method for deleteSwitch method.
+	 * Condition:
+	 *  The commit func throw exception.
+	 * Expect:
+	 * 	Should call rollback.
+	 */
+	//@Ignore
 	@Test
-	public void testDeletePortByPortNum() {
-		//FIXME fails because query for the port is wrong in SwitchStorageImpl
+	public void testDeleteSwitchException() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		String state = "ACTIVE";
+		String type = "";
 		
-		String dpid = "00:00:00:00:00:00:0a:01";
-		short portNum = 3;
+		//Mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		replay(mockISw);
 		
-		switchStorage.deletePort(dpid, portNum);
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+    	mockOpe.removeSwitch(mockISw);
+    	mockOpe.commit();
+		expectLastCall().andThrow(new RuntimeException());
+		mockOpe.rollback();
+		mockOpe.close();
+		replay(mockOpe);
 		
-		Vertex sw = titanGraph.getVertices("dpid", dpid).iterator().next();
-		
-		/*
-		Iterator<Vertex> it = sw.getVertices(Direction.OUT, "on").iterator();
-		
-		while (it.hasNext()){
-			System.out.println(it.next());
-		}
-		*/
-		
-		GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
-		pipe.start(sw).out("on").has("number", portNum);
-		assertFalse(pipe.hasNext());
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.deleteSwitch(dpid);
 	}
-
-	@Ignore @Test
-	public void testDeletePortStringString() {
-		fail("Not yet implemented");
-	}
-
-	@Ignore @Test
-	public void testGetActiveSwitches() {
-		fail("Not yet implemented");
-	}
-
-	static class MyLoopFunction implements PipeFunction<LoopBundle<Vertex>, Boolean> {
-	    String dpid;
-	    public MyLoopFunction(String dpid) {
-		super();
-		this.dpid = dpid;
-	    }
-	    public Boolean compute(LoopBundle<Vertex> bundle) {
-		Boolean output = false;
-		if (! bundle.getObject().getProperty("dpid").equals(dpid)) {
-		    output = true;
-		}
-		return output;
-	    }
-	}
-
+	
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  port is existing.
+	 * Expect:
+	 * 	Should call addPort and commit.
+	 */
+	//@Ignore
 	@Test
-	public void testShortestPath() {
-	    String dpid_src = "00:00:00:00:00:00:0a:01";
-	    String dpid_dest = "00:00:00:00:00:00:0a:06";
+	public void testAddPort() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.addPort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(null);
+		expect(mockOpe.newPort(portNumber)).andReturn(mockIPort);	
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
 
-	    //
-	    // Implement the Shortest Path between two vertices by using
-	    // the following Gremlin CLI code:
-	    //   v_src.as("x").out("on").out("link").in("on").dedup().loop("x"){it.object.dpid != v_dest.dpid}.path(){it.dpid}{it.number}{it.number}
-	    // The equivalent code used here is:
-	    //   results = []; v_src.as("x").out("on").out("link").in("on").dedup().loop("x"){it.object.dpid != v_dest.dpid}.path().fill(results)
-	    //
-
-	    // Get the source vertex
-	    Iterator<Vertex> iter = titanGraph.getVertices("dpid", dpid_src).iterator();
-	    if (! iter.hasNext())
-		return;			// Source vertex not found
-	    Vertex v_src = iter.next();
-
-	    // Get the destination vertex
-	    iter = titanGraph.getVertices("dpid", dpid_dest).iterator();
-	    if (! iter.hasNext())
-		return;			// Destination vertex not found
-	    Vertex v_dest = iter.next();
-
-	    //
-	    // Implement the Gremlin script and run it
-	    //
-	    // NOTE: This mechanism is slower. The code is kept here
-	    // for future reference.
-	    //
-	    /*
-	    String gremlin = "v_src.as(\"x\").out(\"on\").out(\"link\").in(\"on\").dedup().loop(\"x\"){it.object.dpid != v_dest.dpid}.path().fill(results)";
-
-	    String gremlin_nopath = "v_src.as(\"x\").out(\"on\").out(\"link\").in(\"on\").dedup().loop(\"x\"){it.object.dpid != \"NO-SUCH-DPID\"}.path().fill(results)";
-
-	    ScriptEngine engine = new GremlinGroovyScriptEngine();
-	    ArrayList<ArrayList<Vertex>> results = new ArrayList<ArrayList<Vertex>>();
-	    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("g", titanGraph);
-	    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("v_src", v_src);
-	    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("v_dest", v_dest);
-	    engine.getBindings(ScriptContext.ENGINE_SCOPE).put("results", results);
-
-	    try {
-		engine.eval(gremlin);
-	    } catch (ScriptException e) {
-		System.err.println("Caught ScriptException running Gremlin script: " + e.getMessage());
-		return;
-	    }
-
-	    for (ArrayList<Vertex> lv : results) {
-		...
-	    }
-	    */
-
-	    MyLoopFunction whileFunction = new MyLoopFunction(dpid_dest);
-	    GremlinPipeline<Vertex, Vertex> pipe = new GremlinPipeline<Vertex, Vertex>();
-	    Collection<List> results = new ArrayList<List>();
-	    GremlinPipeline<Vertex, List> path;
-	    path = pipe.start(v_src).as("x").out("on").out("link").in("on").dedup().loop("x", whileFunction).path();
-	    path.fill(results);
-
-	    //
-	    // Extract the result and compose it into a string
-	    //
-	    String results_str = "";
-	    // System.out.println("BEGIN " + results.size());
-	    for (List l : results) {
-		for (Object o: l) {
-		    Vertex v = (Vertex)(o);
-		    // System.out.println(v);
-		    String type = v.getProperty("type").toString();
-		    results_str += "[type: " + type;
-		    // System.out.println("type: " + type);
-		    if (type.equals("port")) {
-			String number = v.getProperty("number").toString();
-			// System.out.println("number: " + number);
-			results_str += " number: " + number + "]";
-		    }
-		    if (type.equals("switch")) {
-			String dpid = v.getProperty("dpid").toString();
-			// System.out.println("dpid: " + dpid);
-			results_str += " dpid: " + dpid + "]";
-		    }
-		}
-	    }
-	    // System.out.println("END\n");
-	    System.out.println(results_str);
-
-	    //
-	    // Check the result
-	    //
-	    String expected_result = "[type: switch dpid: 00:00:00:00:00:00:0a:01][type: port number: 2][type: port number: 1][type: switch dpid: 00:00:00:00:00:00:0a:03][type: port number: 2][type: port number: 2][type: switch dpid: 00:00:00:00:00:00:0a:04][type: port number: 3][type: port number: 1][type: switch dpid: 00:00:00:00:00:00:0a:06]";
-
-	    assertEquals(results_str, expected_result);
-
-	    //
-	    // Test Shortest-Path computation to non-existing destination
-	    //
-	    results.clear();
-	    MyLoopFunction noDestWhileFunction = new MyLoopFunction("NO-SUCH-DPID");
-	    path = pipe.start(v_src).as("x").out("on").out("link").in("on").dedup().loop("x", noDestWhileFunction).path();
-	    path.fill(results);
-	    assertTrue(results.size() == 0);
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
 	}
-}
+	
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  Port status is down.
+	 * Expect:
+	 * 	Should call removePort and commit.
+	 */
+	//@Ignore
+	@Test
+	public void testAddPortWithPortLinkDown() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_LINK_DOWN.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.removePort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);	
+		mockOpe.commit();	
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(mockIPort);
+		mockOpe.removePort(mockIPort);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  The switch is not existing.
+	 * Expect:
+	 * 	Nothing happens.
+	 */
+	//@Ignore
+	@Test
+	public void testAddPortAbnormalNoSwitch() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createStrictMock(IPortObject.class);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createStrictMock(ISwitchObject.class);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		mockOpe.close();
+		replay(mockOpe);
+
+		swSt.init(conf);
+		swSt.addPort(dpid, portToAdd);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  port is not existing.
+	 * Expect:
+	 * 	Should call addPort and commit.
+	 */
+	//@Ignore
+	@Test
+	public void testAddPortAbnormalNoPort() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.addPort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(null);
+		expect(mockOpe.newPort(portNumber)).andReturn(null);	
+		mockOpe.rollback();
+		mockOpe.close();
+		replay(mockOpe);
+
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  commit throw the exception.
+	 * Expect:
+	 * 	Should call rollback.
+	 */
+	//@Ignore
+	@Test
+	public void testAddPortWithException() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.addPort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(null);
+		expect(mockOpe.newPort(portNumber)).andReturn(mockIPort);	
+		mockOpe.commit();
+		expectLastCall().andThrow(new RuntimeException());
+		mockOpe.rollback();
+		mockOpe.close();
+		replay(mockOpe);
+
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
+	}
+
+	/**
+	 * Desc:
+	 *  Test method for deletePort method.
+	 * Condition:
+	 *  port is existing.
+	 * Expect:
+	 * 	Should call removePort and commit.
+	 */
+	//@Ignore
+	@Test
+	public void testDeletePort() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.addPort(mockIPort);
+		mockISw.removePort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(null);
+		expect(mockOpe.newPort(portNumber)).andReturn(mockIPort);	
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(mockIPort);
+		mockOpe.removePort(mockIPort);
+		mockOpe.commit();
+		mockOpe.close();
+		replay(mockOpe);
+
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
+		swSt.deletePort(dpid, portNumber);
+	}
+
+	/**
+	 * Desc:
+	 *  Test method for addPort method.
+	 * Condition:
+	 *  commit throws the exception.
+	 * Expect:
+	 * 	Should call rollback.
+	 */
+	//@Ignore
+	@Test
+	public void testDeletePortException() {
+		String dpid = "00:00:00:00:00:00:0a:01";
+		short portNumber = 5;
+		String state = "ACTIVE";
+		String name = "port 5 at SEA switch";
+		
+		OFPhysicalPort portToAdd = new OFPhysicalPort();
+		portToAdd.setName(name);
+		portToAdd.setCurrentFeatures(OFPhysicalPort.OFPortFeatures.OFPPF_100MB_FD.getValue());
+		portToAdd.setPortNumber(portNumber);
+		portToAdd.setState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		
+		//Expectation of  mock Port
+		IPortObject mockIPort = createMock(IPortObject.class);
+		mockIPort.setState(state);
+		mockIPort.setPortState(OFPortState.OFPPS_STP_FORWARD.getValue());
+		mockIPort.setDesc(name);
+		replay(mockIPort);
+		
+		//Expectation of mock Switch
+		ISwitchObject mockISw = createMock(ISwitchObject.class);
+		mockISw.setState(state);
+		mockISw.addPort(mockIPort);
+		mockISw.removePort(mockIPort);
+		replay(mockISw);
+		
+		//Expectation of mock operation.
+		expect(mockOpe.searchSwitch(dpid)).andReturn(null);
+		expect(mockOpe.newSwitch(dpid)).andReturn(mockISw);
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(null);
+		expect(mockOpe.newPort(portNumber)).andReturn(mockIPort);	
+		mockOpe.commit();
+		expect(mockOpe.searchSwitch(dpid)).andReturn(mockISw);
+		expect(mockOpe.searchPort(dpid, portNumber)).andReturn(mockIPort);
+		mockOpe.removePort(mockIPort);
+		expectLastCall().andThrow(new RuntimeException());
+		mockOpe.rollback();
+		mockOpe.close();
+		replay(mockOpe);
+	
+		swSt.init(conf);
+		swSt.addSwitch(dpid);
+		swSt.addPort(dpid, portToAdd);
+		swSt.deletePort(dpid, portNumber);
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTestBB.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTestBB.java
new file mode 100644
index 0000000..57aefd3
--- /dev/null
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/SwitchStorageImplTestBB.java
@@ -0,0 +1,334 @@
+package net.onrc.onos.ofcontroller.core.internal;
+
+import static org.junit.Assert.*;
+
+import net.floodlightcontroller.core.internal.TestDatabaseManager;
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.ofcontroller.core.ISwitchStorage;
+import net.onrc.onos.ofcontroller.core.ISwitchStorage.SwitchState;
+import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
+import net.onrc.onos.ofcontroller.core.INetMapStorage;
+import net.onrc.onos.ofcontroller.core.INetMapStorage.DM_OPERATION;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openflow.protocol.OFPhysicalPort;
+import org.openflow.protocol.OFPhysicalPort.OFPortState;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.powermock.modules.junit4.PowerMockRunner;
+import org.slf4j.LoggerFactory;
+
+import com.thinkaurelius.titan.core.TitanFactory;
+import com.thinkaurelius.titan.core.TitanGraph;
+
+//Add Powermock preparation
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({TitanFactory.class, GraphDBConnection.class, GraphDBOperation.class, SwitchStorageImpl.class})
+public class SwitchStorageImplTestBB {
+
+	protected static org.slf4j.Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
+
+	String conf;
+    private GraphDBConnection conn = null;
+    private GraphDBOperation ope = null;
+    private TitanGraph titanGraph = null;
+    ISwitchStorage swSt = null;
+    
+	@Before
+	public void setUp() throws Exception {
+		
+		swSt = new SwitchStorageImpl();
+		conf = "/dummy/path/to/db";
+		
+		// Make mock cassandra DB
+		// Replace TitanFactory.open() to return mock DB
+		titanGraph = TestDatabaseManager.getTestDatabase();
+		TestDatabaseManager.populateTestData(titanGraph);
+		PowerMock.mockStatic(TitanFactory.class);
+		EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
+		PowerMock.replay(TitanFactory.class);
+		
+		conn = GraphDBConnection.getInstance(conf);
+		ope = new GraphDBOperation(conn);
+		
+		swSt.init(conf);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		
+		titanGraph.shutdown();
+		TestDatabaseManager.deleteTestDatabase();
+
+		swSt.close();
+		swSt = null;
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  Normal
+	 * Expect:
+	 * 1. Switch should be generated.
+	 * 2. The status of switch should be ACTIVE
+	 */
+	//@Ignore 
+	@Test
+	public void testAddSwitch() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw == null);
+		swSt.addSwitch(dpid);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 != null);
+		assertEquals(sw2.getState(), "ACTIVE");
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for addSwitch method.
+	 * Condition:
+	 *  The existing switch status is INACTIVE.
+	 *  The switch is already existing.
+	 * Expect:
+	 * 1. After add the same switch, the status of switch should be ACTIVE
+	 */
+	//@Ignore 
+	@Test
+	public void testAddSwitchExisting() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		
+		swSt.update(dpid, SwitchState.INACTIVE, DM_OPERATION.UPDATE);
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		assertEquals(sw.getState(), SwitchState.INACTIVE.toString());
+		swSt.addSwitch(dpid);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 != null);
+		assertEquals(sw2.getState(), SwitchState.ACTIVE.toString());
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for testUpdate method.
+	 * Condition:
+	 *  The switch is not existing.
+	 *  The status of added switch is INACTIVE.
+	 *  DM_OPERATION is CREATE.
+	 * Expect:
+	 * 1. Switch should be created.
+	 * 2. The status of switch should be INACTIVE.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdate() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		SwitchState state = ISwitchStorage.SwitchState.INACTIVE;
+		DM_OPERATION dmope = INetMapStorage.DM_OPERATION.CREATE;
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw == null);
+		swSt.update(dpid, state, dmope);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 != null);
+		assertEquals(sw2.getState(), state.toString());
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for testUpdate method.
+	 * Condition:
+	 *  The switch is existing.
+	 *  The status of added switch is ACTIVE.
+	 *  DM_OPERATION is DELETE.
+	 * Expect:
+	 * 1. Switch should be deleted.
+	 */
+	//@Ignore 
+	@Test
+	public void testUpdateWithDELETE() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		SwitchState state = ISwitchStorage.SwitchState.ACTIVE;
+		DM_OPERATION dmope = INetMapStorage.DM_OPERATION.DELETE;
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		swSt.update(dpid, state, dmope);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 == null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for delete switch method.
+	 * Condition:
+	 *  The switch is existing.
+	 * Expect:
+	 * 1. Switch should be deleted.
+	 */
+	//@Ignore 
+	@Test
+	public void testDeleteSwitch() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		swSt.deleteSwitch(dpid);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 == null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for delete switch method.
+	 * Condition:
+	 *  The switch is not existing.
+	 * Expect:
+	 * Nothing happens.
+	 */
+	//@Ignore 
+	@Test
+	public void testDeleteNonExistingSwitch() {
+		String dpid = "00:00:00:00:00:00:0a:07";
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw == null);
+		swSt.deleteSwitch(dpid);
+		ISwitchObject sw2 = ope.searchSwitch(dpid);
+		assertTrue(sw2 == null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for delete port method.
+	 * Condition:
+	 *  The port is existing.
+	 * Expect:
+	 *  Deleted the port.
+	 */
+	//@Ignore 
+	@Test
+	public void testDeletePort() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		short portNumber = 3;
+		
+		IPortObject portObj1 = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj1 != null);
+		swSt.deletePort(dpid, portNumber);
+		IPortObject portObj2 = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj2 == null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for delete port method.
+	 * Condition:
+	 *  The port is not existing.
+	 * Expect:
+	 *  Nothing happens.
+	 */
+	//@Ignore 
+	@Test
+	public void testDeleteNonExistingPort() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		short portNumber = 4;
+		
+		IPortObject portObj1 = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj1 == null);
+		swSt.deletePort(dpid, portNumber);
+		IPortObject portObj2 = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj2 == null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for add port method.
+	 * Condition:
+	 *  The port is not existing.
+	 * Expect:
+	 *  The port should be added.
+	 *  The desc of IPortObject is the same as the name of OFPhysicalPort.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddPort() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		short portNumber = 4;
+		String name = "port 4 at ATL Switch";
+		int state = OFPortState.OFPPS_STP_FORWARD.getValue();
+		OFPhysicalPort port = new OFPhysicalPort(); 
+		port.setPortNumber(portNumber);
+		port.setName(name);
+		port.setState(state);
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		swSt.addPort(dpid, port);
+		IPortObject portObj = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj != null);
+		assertEquals(portObj.getDesc(), name);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for add method.
+	 * Condition:
+	 *  The port is existing.
+	 * Expect:
+	 *  Nothing happens.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddExistingPort() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		short portNumber = 3;
+		String name = "xxx";
+		int state = OFPortState.OFPPS_STP_FORWARD.getValue();
+		OFPhysicalPort port = new OFPhysicalPort(); 
+		port.setPortNumber(portNumber);
+		port.setName(name);
+		port.setState(state);
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		swSt.addPort(dpid, port);
+		IPortObject portObj = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj != null);
+	}
+	
+	/**
+	 * Desc:
+	 *  Test method for add method.
+	 * Condition:
+	 *  The port status is down.
+	 * Expect:
+	 *  Delete the port.
+	 */
+	//@Ignore 
+	@Test
+	public void testAddDownPort() {
+		String dpid = "00:00:00:00:00:00:0a:06";
+		short portNumber = 3;
+		String name = "port 3 at ATL Switch";
+		int state = OFPortState.OFPPS_LINK_DOWN.getValue();
+		OFPhysicalPort port = new OFPhysicalPort(); 
+		port.setPortNumber(portNumber);
+		port.setName(name);
+		port.setState(state);
+		
+		ISwitchObject sw = ope.searchSwitch(dpid);
+		assertTrue(sw != null);
+		swSt.addPort(dpid, port);
+		IPortObject portObj = ope.searchPort(dpid, portNumber);
+		assertTrue(portObj == null);
+	}
+}
diff --git a/src/test/java/net/onrc/onos/ofcontroller/core/internal/TestableGraphDBOperation.java b/src/test/java/net/onrc/onos/ofcontroller/core/internal/TestableGraphDBOperation.java
index 31a4bb0..aaca07d 100644
--- a/src/test/java/net/onrc/onos/ofcontroller/core/internal/TestableGraphDBOperation.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/core/internal/TestableGraphDBOperation.java
@@ -11,6 +11,9 @@
 import com.tinkerpop.blueprints.Vertex;
 import com.tinkerpop.frames.annotations.gremlin.GremlinParam;
 
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.graph.IDBConnection;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
@@ -18,9 +21,6 @@
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
 import net.onrc.onos.ofcontroller.util.FlowEntryId;
 import net.onrc.onos.ofcontroller.util.FlowId;
-import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBOperation;
-import net.onrc.onos.util.IDBConnection;
 
 /**
  * Mock class of GraphDBOperation which provides additional setter to construct a graph for test.
diff --git a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImplTest.java b/src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTest.java
similarity index 97%
rename from src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImplTest.java
rename to src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTest.java
index fc37016..de8be4e 100644
--- a/src/test/java/net/floodlightcontroller/devicemanager/internal/DeviceStorageImplTest.java
+++ b/src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTest.java
@@ -1,4 +1,4 @@
-package net.floodlightcontroller.devicemanager.internal;
+package net.onrc.onos.ofcontroller.devicemanager.internal;
 
 import static org.easymock.EasyMock.createMock;
 import static org.easymock.EasyMock.expect;
@@ -14,16 +14,17 @@
 import net.floodlightcontroller.devicemanager.IDevice;
 import net.floodlightcontroller.devicemanager.SwitchPort;
 import net.floodlightcontroller.packet.IPv4;
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
 import net.onrc.onos.ofcontroller.core.internal.DeviceStorageImpl;
 import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
-import net.onrc.onos.util.GraphDBConnection;
-import net.onrc.onos.util.GraphDBOperation;
-
+import net.floodlightcontroller.devicemanager.internal.Device;
 import org.easymock.EasyMock;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.openflow.util.HexString;
@@ -32,7 +33,6 @@
 import org.powermock.modules.junit4.PowerMockRunner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
 import com.thinkaurelius.titan.core.TitanFactory;
 
 //Add Powermock preparation
@@ -49,7 +49,9 @@
     
 	@Before
 	public void setUp() throws Exception {
-
+	    deviceImpl = new DeviceStorageImpl();	
+		conf = "/dummy/path/to/db";
+				
 		PowerMock.mockStatic(GraphDBConnection.class);
 		mockConn = createMock(GraphDBConnection.class);
 		PowerMock.suppress(PowerMock.constructor(GraphDBConnection.class));
@@ -58,19 +60,22 @@
 			
 		//PowerMock.mockStatic(GraphDBOperation.class);
 		mockOpe = PowerMock.createMock(GraphDBOperation.class);
-		PowerMock.expectNew(GraphDBOperation.class, mockConn).andReturn(mockOpe);
+		PowerMock.expectNew(GraphDBOperation.class, new Class<?>[]{String.class}, conf).andReturn(mockOpe);
+		mockOpe.close();
 		PowerMock.replay(GraphDBOperation.class);
         // Replace the conf to dummy conf
 		// String conf = "/tmp/cassandra.titan";
-		conf = "/dummy/path/to/db";
+
 		
-        deviceImpl = new DeviceStorageImpl();
+
 	}
 
 	@After
 	public void tearDown() throws Exception {	
 		deviceImpl.close();
 		deviceImpl = null;
+		
+		verify(mockOpe);
 	}
 	
 	private String makeIPStringFromArray(Integer[] ipaddresses){
@@ -148,7 +153,6 @@
 			expect(mockOpe.newDevice()).andReturn(mockIDev);
 			expect(mockOpe.searchPort(switchMacAddr, portNum)).andReturn(mockIPort);
 			mockOpe.commit();
-
 			replay(mockOpe);				
 			
 			deviceImpl.init(conf);
@@ -158,7 +162,6 @@
 			assertNotNull(obj);
 			
 			verify(mockIDev);
-			verify(mockOpe);
 			
 		} catch(Exception e) {
 			fail(e.getMessage());
@@ -239,10 +242,7 @@
 			//Add the same device
 	        IDeviceObject obj2 = deviceImpl.addDevice(mockDev);
 			assertNotNull(obj2);
-			
-			verify(mockIDev);
-			verify(mockOpe);
-			
+
 		} catch(Exception e) {
 			fail(e.getMessage());
 		}
@@ -335,7 +335,6 @@
 			assertNotNull(obj2);
 			
 			verify(mockIDev);
-			verify(mockOpe);
 			
 		} catch(Exception e) {
 			fail(e.getMessage());
@@ -429,7 +428,7 @@
 		    assertNull(dev2);
 		    
 			verify(mockIDev);
-			verify(mockOpe);
+
 		} catch(Exception e) {
 			fail(e.getMessage());
 		}
@@ -511,7 +510,7 @@
 		    assertNotNull(dev);
 		    
 			verify(mockIDev);
-			verify(mockOpe);   
+
 		} catch(Exception e) {
 			fail(e.getMessage());
 		}
@@ -600,7 +599,7 @@
 		    assertNotNull(dev);
 		    
 			verify(mockIDev);
-			verify(mockOpe);
+
 			
 		} catch(Exception e) {
 			fail(e.getMessage());
@@ -735,18 +734,17 @@
 		    deviceImpl.changeDeviceAttachments(mockDev3);
 		    
 			verify(mockIDev);
-			verify(mockOpe);
+
 			
 		} catch(Exception e) {
 			fail(e.getMessage());
 		}
 	}
 
-	//@Ignore
+	@Ignore
 	@Test
 	public void testChangeDeviceAttachmentsIDeviceIDeviceObject() {
 		//It is tested by the testChangeDeviceAttachmentsIDevice
-		deviceImpl.init(conf);
 	}
 
 	/**
@@ -828,7 +826,7 @@
 	        deviceImpl.changeDeviceIPv4Address(mockDev2);	
 	        
 			verify(mockIDev);
-			verify(mockOpe);
+
 					
 		} 
 		catch(Exception e) {
diff --git a/src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTestBB.java b/src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTestBB.java
new file mode 100644
index 0000000..e4053f4
--- /dev/null
+++ b/src/test/java/net/onrc/onos/ofcontroller/devicemanager/internal/DeviceStorageImplTestBB.java
@@ -0,0 +1,626 @@
+package net.onrc.onos.ofcontroller.devicemanager.internal;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import net.floodlightcontroller.core.internal.TestDatabaseManager;
+import net.floodlightcontroller.devicemanager.IDevice;
+import net.floodlightcontroller.devicemanager.SwitchPort;
+import net.floodlightcontroller.devicemanager.internal.Device;
+import net.floodlightcontroller.packet.IPv4;
+import net.onrc.onos.graph.GraphDBConnection;
+import net.onrc.onos.graph.GraphDBOperation;
+import net.onrc.onos.ofcontroller.core.IDeviceStorage;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IPortObject;
+import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.ISwitchObject;
+import net.onrc.onos.ofcontroller.core.internal.DeviceStorageImpl;
+import net.onrc.onos.ofcontroller.core.internal.SwitchStorageImpl;
+
+import org.easymock.EasyMock;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.openflow.util.HexString;
+import org.powermock.api.easymock.PowerMock;
+import org.powermock.core.classloader.annotations.PrepareForTest;
+import org.slf4j.LoggerFactory;
+import org.powermock.modules.junit4.PowerMockRunner;
+
+import com.thinkaurelius.titan.core.TitanFactory;
+import com.thinkaurelius.titan.core.TitanGraph;
+
+//Add Powermock preparation
+@RunWith(PowerMockRunner.class)
+@PrepareForTest({TitanFactory.class, GraphDBConnection.class, GraphDBOperation.class, SwitchStorageImpl.class})
+public class DeviceStorageImplTestBB {
+	protected static org.slf4j.Logger log = LoggerFactory.getLogger(SwitchStorageImpl.class);
+
+	String conf;
+    private GraphDBConnection conn = null;
+    private GraphDBOperation ope = null;
+    private TitanGraph titanGraph = null;
+    IDeviceStorage deviceImpl = null;
+    
+	@Before
+	public void setUp() throws Exception {
+		
+		deviceImpl = new DeviceStorageImpl();
+		conf = "/dummy/path/to/db";
+		
+		// Make mock cassandra DB
+		// Replace TitanFactory.open() to return mock DB
+		titanGraph = TestDatabaseManager.getTestDatabase();
+		TestDatabaseManager.populateTestData(titanGraph);
+		PowerMock.mockStatic(TitanFactory.class);
+		EasyMock.expect(TitanFactory.open((String)EasyMock.anyObject())).andReturn(titanGraph);
+		PowerMock.replay(TitanFactory.class);
+		
+		conn = GraphDBConnection.getInstance(conf);
+		ope = new GraphDBOperation(conn);
+		
+		deviceImpl.init(conf);
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		titanGraph.shutdown();
+		TestDatabaseManager.deleteTestDatabase();
+
+		deviceImpl.close();
+		deviceImpl = null;
+	}
+
+	/**
+	 * Desc:
+	 *  Test method for addDevice method.
+	 * Codition:
+	 *  N/A
+	 * Expect:
+	 * 	Get proper IDeviceObject
+	 *  Check the IDeviceObject properties set
+	 */
+	@Test
+	public void testAddDevice() {
+		try 
+		{	   
+			//Make mockDevice
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			// Mac addr for test device.
+			String macAddr = "99:99:99:99:99:99";
+			// IP addr for test device
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			// Mac addr for attached switch
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			// Port number for attached switch
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+
+			EasyMock.replay(mockDev);
+
+			//Add the device
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			//Test to take a Device from DB correctly
+			IDeviceObject devObj1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, devObj1.getMACAddress());
+
+			//Test to take a attached sw  from DB correctly
+			for(ISwitchObject sw1: devObj1.getSwitch())
+			{
+				String swMacFromDB = sw1.getDPID();
+				assertEquals(switchMacAddr, swMacFromDB);
+			}
+
+			//Test to take a IP addr from DB
+			//TodoForGettingIPaddr. There may be bug in the test class.
+			String ipFromDB = devObj1.getIPAddress();
+			String[] ipsFromDB = ipFromDB.replace("[", "").replace("]", "").split(",");
+			List<String> ipsList = Arrays.asList(ipsFromDB);
+			assertTrue(ipsList.contains(ip));
+
+			//Test to take a attached port from DB
+			for(IPortObject port : devObj1.getAttachedPorts())
+			{
+
+				//In this implementing, the object was not set the port. So it must be null.
+				if(port.getNumber() != null)
+				{
+					String portNumFromDB = port.getNumber().toString();
+					assertEquals(String.valueOf(portNum), portNumFromDB);				
+				}
+			}	
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+	
+	/**
+	 * Desc:
+	 * 	Test method for addDevice method.
+	 * Condition:
+	 * 	Already added device is existed.
+	 * Expect:
+	 * 	Get proper IDeviceObject still.
+	 *  Check the IDeviceObject properties set.
+	 */
+	@Test
+	public void testAddDeviceExisting() {
+		try 
+		{	   
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+			//Add the device
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			//Test to take a Device from DB correctly
+			IDeviceObject devObj1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, devObj1.getMACAddress());
+
+			//Add the same device
+	        IDeviceObject obj2 = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj2);
+
+			IDeviceObject devObj2 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, devObj2.getMACAddress());	
+
+			//Test to take a attached port from DB
+			for(IPortObject port : devObj2.getAttachedPorts())
+			{
+				//In this implementing, the object was not set the port. So it must be null.
+				if(port.getNumber() != null)
+				{
+
+					String portNumFromDB = port.getNumber().toString();
+					assertEquals(String.valueOf(portNum), portNumFromDB);						
+
+					ISwitchObject sw = port.getSwitch();
+					String str = sw.getDPID();
+					log.debug("");
+				}
+			}	
+
+			String ipFromDB = devObj2.getIPAddress();
+			String[] ipsFromDB = ipFromDB.replace("[", "").replace("]", "").split(",");
+			List<String> ipsList = Arrays.asList(ipsFromDB);
+			assertTrue(ipsList.contains(ip));
+
+			//Test to take a attached port from DB
+			for(IPortObject port : devObj2.getAttachedPorts())
+			{
+
+				//In this implementing, the object was not set the port. So it must be null.
+				if(port.getNumber() != null)
+				{
+					String portNumFromDB = port.getNumber().toString();
+					assertEquals(String.valueOf(portNum), portNumFromDB);				
+				}
+			}	
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+	/**
+	 * Desc:
+	 * 	Test method for updateDevice method.
+	 * Condition:
+	 * 	The mac address and attachment point are the same. 
+	 *  All of the other parameter are different.
+	 * Expect:
+	 * 	Changed parameters are set properly.
+	 */
+	//@Ignore
+	@Test
+	public void testUpdateDevice() {
+		try
+		{
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+			//Dev2 (attached port is the same)
+			IDevice mockDev2 = EasyMock.createMock(Device.class);
+			String macAddr2 = "99:aa:aa:aa:aa:aa";
+			Integer ip2 = IPv4.toIPv4Address("192.168.100.2");
+			Integer[] ipaddrs2 = {ip2};
+
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.expect(mockDev2.getIPv4Addresses()).andReturn(ipaddrs2);
+			EasyMock.expect(mockDev2.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr2);
+			EasyMock.replay(mockDev2);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			IDeviceObject dev1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev1.getMACAddress());
+
+			//update theDevice
+			deviceImpl.updateDevice(mockDev2);
+			IDeviceObject dev2 = ope.searchDevice(macAddr2);
+			assertEquals(macAddr2, dev2.getMACAddress());
+			IPortObject iport = ope.searchPort(switchMacAddr, portNum);
+
+			//Test to take a attached port from DB
+			for(IDeviceObject dev : iport.getDevices())
+			{
+				String macAddrFromDB = dev.getMACAddress();	
+				if(macAddr2.equals(macAddrFromDB)){
+					//Nothing to do
+				}
+				else{
+					fail("notFoundTheDeviceOnThePort");			
+				}
+			}
+
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * Desc:
+	 * 	Test method for testRemoveDevice method.
+	 * Condition:
+	 * 	1. Unregistered IDeviceObject argument is put. 
+	 * Expect:
+	 *  1. Nothing happen when unregistered IDeviceObject is put
+	 * 	2. IDeviceObject will be removed.
+	 */
+	//@Ignore
+	@Test
+	public void testRemoveDevice() {
+		try
+		{
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			IDeviceObject dev1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev1.getMACAddress());
+
+			deviceImpl.removeDevice(mockDev);		
+		    IDeviceObject dev = deviceImpl.getDeviceByMac(macAddr);
+		    assertNull(dev);
+
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * Desc:
+	 * 	Test method for getDeviceByMac
+	 * Condition:
+	 * 	1. Unregistered mac address argument is set
+	 * Expect:
+	 * 	1.Nothing happen when you put unregistered mac address
+	 *  2.Get the proper IDeviceObject.
+	 *  3.Check the IDeviceObject properties set.
+	 */
+	//@Ignore
+	@Test
+	public void testGetDeviceByMac() {
+		try
+		{
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			IDeviceObject dev1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev1.getMACAddress());
+
+		    IDeviceObject dev = deviceImpl.getDeviceByMac(macAddr);
+		    assertNotNull(dev);
+			assertEquals(macAddr, dev.getMACAddress());
+
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * Desc:
+	 * 	Test method for getDeviceByIP method.
+	 * Condition:
+	 * 	1. Unregistered ip address argument is set
+	 * Expect:
+	 * 	1. Nothing happen when you put unregistered mac address
+	 * 	2. Get the proper IDeviceObject.
+	 *  3. Check the IDeviceObject properties set.
+	 */
+	//@Ignore
+	@Test
+	public void testGetDeviceByIP() {
+		try
+		{
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			IDeviceObject dev1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev1.getMACAddress());
+
+		    IDeviceObject dev = deviceImpl.getDeviceByIP(ip);
+		    assertNotNull(dev);
+			String ipFromDB = dev.getIPAddress();
+			String[] ipsFromDB = ipFromDB.replace("[", "").replace("]", "").split(",");
+			List<String> ipsList = Arrays.asList(ipsFromDB);
+			assertTrue(ipsList.contains(ip));
+
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	/**
+	 * Desc:
+	 * 	Test method for testChangeDeviceAttachmentsIDevice
+	 * Condition:
+	 * 	1. Unexisting attachment point argument is set
+	 * Expect:
+	 * 	1. Unexisting attachment point is ignored, so nothing happen.
+	 * 	2. Change the attachment point.
+	 */
+	//@Ignore
+	@Test
+	public void testChangeDeviceAttachmentsIDevice() {
+		try
+		{
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+			//Dev2
+			IDevice mockDev2 = EasyMock.createMock(Device.class);
+			String switchMacAddr2 = "00:00:00:00:00:00:0a:02";
+			long lSwitchMacAddr2 = HexString.toLong(switchMacAddr2);
+			short portNum2 = 2; 
+			SwitchPort sp2 = new SwitchPort(lSwitchMacAddr2, portNum2);
+			SwitchPort sps2[] = {sp2};
+
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev2.getAttachmentPoints()).andReturn(sps2);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev2);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+		    deviceImpl.changeDeviceAttachments(mockDev2);
+
+		    IDeviceObject dev = deviceImpl.getDeviceByMac(macAddr);
+		    assertNotNull(dev);
+
+			for(ISwitchObject sw1: dev.getSwitch())
+			{
+				String swMacFromDB = sw1.getDPID();
+				assertEquals(switchMacAddr2, swMacFromDB);
+			}
+		} catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+	//@Ignore
+	@Test
+	public void testChangeDeviceAttachmentsIDeviceIDeviceObject() {
+		//It is tested by the testChangeDeviceAttachmentsIDevice
+	}
+
+	/**
+	 * Desc:
+	 * 	Test method for testChangeDeviceIPv4Address
+	 * Condition:
+	 * 	N/A
+	 * Expect:
+	 *  1. Check correctly changed the ipadress
+	 */
+	//@Ignore
+	@Test
+	public void testChangeDeviceIPv4Address() {
+		try
+		{
+			//Dev1
+			IDevice mockDev = EasyMock.createMock(Device.class);
+			String macAddr = "99:99:99:99:99:99";
+			String ip = "192.168.100.1";
+			Integer ipInt = IPv4.toIPv4Address(ip);
+			Integer[] ipaddrs = {ipInt};
+			String switchMacAddr = "00:00:00:00:00:00:0a:01";		
+			long switchMacAddrL = HexString.toLong(switchMacAddr);
+			short portNum = 2; 
+			SwitchPort sp1 = new SwitchPort(switchMacAddrL, portNum);
+			SwitchPort[] sps = {sp1};
+
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getIPv4Addresses()).andReturn(ipaddrs);
+			EasyMock.expect(mockDev.getAttachmentPoints()).andReturn(sps);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev.getMACAddressString()).andReturn(macAddr);
+			EasyMock.replay(mockDev);
+
+	        IDeviceObject obj = deviceImpl.addDevice(mockDev);	
+			assertNotNull(obj);
+
+			IDevice mockDev2 = EasyMock.createMock(Device.class);
+			String ip2 = "192.168.100.2";
+			Integer ipInt2 = IPv4.toIPv4Address(ip2);
+			Integer[] ipaddrs2 = {ipInt2};
+			EasyMock.expect(mockDev2.getMACAddressString()).andReturn(macAddr);
+			EasyMock.expect(mockDev2.getIPv4Addresses()).andReturn(ipaddrs2);
+			EasyMock.replay(mockDev2);
+
+			IDeviceObject dev1 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev1.getMACAddress());
+			String ipFromDB = dev1.getIPAddress();
+			String[] ipsFromDB = ipFromDB.replace("[", "").replace("]", "").split(",");
+			List<String> ipsList = Arrays.asList(ipsFromDB);
+			assertTrue(ipsList.contains(ip));
+
+	        deviceImpl.changeDeviceIPv4Address(mockDev2);	
+
+			IDeviceObject dev2 = ope.searchDevice(macAddr);
+			assertEquals(macAddr, dev2.getMACAddress());
+			String ipFromDB2 = dev2.getIPAddress();
+			String[] ipsFromDB2 = ipFromDB2.replace("[", "").replace("]", "").split(",");
+			List<String> ipsList2 = Arrays.asList(ipsFromDB2);
+			assertTrue(ipsList2.contains(ip2));
+		} 
+		catch(Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+}
diff --git a/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java b/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java
index 223ac67..f85cc4f 100644
--- a/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java
+++ b/src/test/java/net/onrc/onos/util/GraphDBOperationTest.java
@@ -9,6 +9,7 @@
 
 import junit.framework.TestCase;
 
+import net.onrc.onos.graph.GraphDBOperation;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IDeviceObject;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowEntry;
 import net.onrc.onos.ofcontroller.core.INetMapTopologyObjects.IFlowPath;
@@ -88,7 +89,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newSwitch(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#newSwitch(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testNewSwitch() {
@@ -103,7 +104,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchSwitch(net.onrc.onos.graph.GraphDBConnection, java.lang.String)}.
 	 */
 	@Test
 	public final void testSearchSwitch() {
@@ -120,7 +121,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchActiveSwitch(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchActiveSwitch(net.onrc.onos.graph.GraphDBConnection, java.lang.String)}.
 	 */
 	@Test
 	public final void testSearchActiveSwitch() {
@@ -137,7 +138,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getActiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getActiveSwitches(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetActiveSwitches() {
@@ -153,7 +154,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getAllSwitches(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetAllSwitches() {
@@ -171,7 +172,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getInactiveSwitches(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getInactiveSwitches(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetInactiveSwitches() {
@@ -187,7 +188,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllSwitchNotUpdatedFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getAllSwitchNotUpdatedFlowEntries(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetAllSwitchNotUpdatedFlowEntries() {
@@ -209,7 +210,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeSwitch(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#removeSwitch(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.ISwitchObject)}.
 	 */
 	@Test
 	public final void testRemoveSwitch() {
@@ -225,7 +226,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newPort(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#newPort(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testNewPort() {
@@ -241,7 +242,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchPort(net.onrc.onos.util.GraphDBConnection, java.lang.String, short)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchPort(net.onrc.onos.graph.GraphDBConnection, java.lang.String, short)}.
 	 */
 	@Test
 	public final void testSearchPort() {
@@ -291,7 +292,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removePort(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#removePort(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IPortObject)}.
 	 */
 	@Test
 	public final void testRemovePort() {
@@ -324,7 +325,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newDevice(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#newDevice(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testNewDevice() {
@@ -343,7 +344,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchDevice(net.onrc.onos.util.GraphDBConnection, java.lang.String)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchDevice(net.onrc.onos.graph.GraphDBConnection, java.lang.String)}.
 	 */
 	@Test
 	public final void testSearchDevice() {
@@ -361,7 +362,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getDevices(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getDevices(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetDevices() {
@@ -382,7 +383,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeDevice(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#removeDevice(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IDeviceObject)}.
 	 */
 	@Test
 	public final void testRemoveDevice() {
@@ -395,7 +396,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowPath(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#newFlowPath(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testNewFlowPath() {
@@ -410,7 +411,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowId)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchFlowPath(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.util.FlowId)}.
 	 */
 	@Test
 	public final void testSearchFlowPath() {
@@ -426,7 +427,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getFlowPathByFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getFlowPathByFlowEntry(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
 	 */
 	@Test
 	public final void testGetFlowPathByFlowEntry() {
@@ -465,7 +466,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowPaths(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getAllFlowPaths(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetAllFlowPaths() {
@@ -489,7 +490,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowPath(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowPath)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#removeFlowPath(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowPath)}.
 	 */
 	@Test
 	public final void testRemoveFlowPath() {
@@ -509,7 +510,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#newFlowEntry(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#newFlowEntry(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testNewFlowEntry() {
@@ -525,7 +526,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#searchFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.util.FlowEntryId)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#searchFlowEntry(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.util.FlowEntryId)}.
 	 */
 	@Test
 	public final void testSearchFlowEntry() {
@@ -548,7 +549,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#getAllFlowEntries(net.onrc.onos.util.GraphDBConnection)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#getAllFlowEntries(net.onrc.onos.graph.GraphDBConnection)}.
 	 */
 	@Test
 	public final void testGetAllFlowEntries() {
@@ -572,7 +573,7 @@
 	}
 
 	/**
-	 * Test method for {@link net.onrc.onos.util.GraphDBOperation#removeFlowEntry(net.onrc.onos.util.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
+	 * Test method for {@link net.onrc.onos.graph.GraphDBOperation#removeFlowEntry(net.onrc.onos.graph.GraphDBConnection, net.floodlightcontroller.core.INetMapTopologyObjects.IFlowEntry)}.
 	 */
 	@Test
 	public final void testRemoveFlowEntry() {
diff --git a/start-cassandra.sh b/start-cassandra.sh
index 95cb1db..3bc62e4 100755
--- a/start-cassandra.sh
+++ b/start-cassandra.sh
@@ -1,7 +1,7 @@
 #!/bin/bash
 
 # Set paths
-FL_HOME=`dirname $0`
+ONOS_HOME=`dirname $0`
 CASSANDRA_DIR=${HOME}/apache-cassandra-1.2.4
 LOGDIR=${HOME}/ONOS/onos-logs
 CASSANDRA_LOG=$LOGDIR/cassandara.`hostname`.log
@@ -30,6 +30,7 @@
 
   # Run cassandra 
   echo "Starting cassandra"
+  cp ${ONOS_HOME}/conf/cassandra.yaml $CASSANDRA_DIR/conf
   $CASSANDRA_DIR/bin/cassandra > $CASSANDRA_LOG 2>&1 
 }
 
@@ -56,7 +57,7 @@
 case "$1" in
   start)
     deldb
-    cp $FL_HOME/cassandra.titan /tmp
+    cp $ONOS_HOME/conf/cassandra.titan /tmp
     stop
     start 
     ;;
diff --git a/start-onos-embedded.sh b/start-onos-embedded.sh
index fa6bb3a..e75b696 100755
--- a/start-onos-embedded.sh
+++ b/start-onos-embedded.sh
@@ -1,7 +1,8 @@
 #!/bin/bash
 
 # Set paths
-ONOS_HOME=`dirname $0`
+#ONOS_HOME=`dirname $0`
+ONOS_HOME=${HOME}/ONOS
 ONOS_JAR="${ONOS_HOME}/target/floodlight.jar"
 ONOS_ONLY_JAR="${ONOS_HOME}/target/floodlight-only.jar"
 ONOS_LOGBACK="${ONOS_HOME}/logback.xml"
@@ -91,6 +92,8 @@
   #java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ${ONOS_HOME}/onos.properties > /dev/null 2>&1 &
   #java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${CLASSPATH} ${MAIN_CLASS} -cf ${ONOS_HOME}/onos.properties > /dev/n
 
+  # XXX MVN has to run at the project top dir..
+  cd ${ONOS_HOME}
   ${MVN} exec:exec -Dexec.executable="java" -Dexec.args="${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos-embedded.properties" > ${LOGDIR}/onos.stdout 2>${LOGDIR}/onos.stderr &
 
   echo "Waiting for ONOS to start..."
diff --git a/start-onos.sh b/start-onos.sh
index 56a8999..9e8d559 100755
--- a/start-onos.sh
+++ b/start-onos.sh
@@ -1,7 +1,8 @@
 #!/bin/bash
 
 # Set paths
-ONOS_HOME=`dirname $0`
+#ONOS_HOME=`dirname $0`
+ONOS_HOME=${HOME}/ONOS
 ONOS_JAR="${ONOS_HOME}/target/floodlight.jar"
 ONOS_ONLY_JAR="${ONOS_HOME}/target/floodlight-only.jar"
 ONOS_LOGBACK="${ONOS_HOME}/logback.xml"
@@ -91,7 +92,8 @@
   #java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -jar ${ONOS_JAR} -cf ${ONOS_HOME}/onos.properties > /dev/null 2>&1 &
   #java ${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp ${CLASSPATH} ${MAIN_CLASS} -cf ${ONOS_HOME}/onos.properties > /dev/n
 
-  echo "mvn exec:exec -Dexec.executable=\"java\" -Dexec.args=\"${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos.properties\""
+  # XXX : MVN has to run at the project top dir 
+  cd ${ONOS_HOME}
   ${MVN} exec:exec -Dexec.executable="java" -Dexec.args="${JVM_OPTS} -Dlogback.configurationFile=${ONOS_LOGBACK} -cp %classpath ${MAIN_CLASS} -cf ${ONOS_HOME}/conf/onos.properties" > ${LOGDIR}/onos.stdout 2>${LOGDIR}/onos.stderr &
 
   echo "Waiting for ONOS to start..."
diff --git a/start-zk.sh b/start-zk.sh
new file mode 100755
index 0000000..ddb2cb9
--- /dev/null
+++ b/start-zk.sh
@@ -0,0 +1,46 @@
+#!/bin/bash
+# Set paths
+
+ONOS_HOME=`dirname $0`
+ZK_DIR=${HOME}/zookeeper-3.4.5
+ZK_CONF=${ONOS_HOME}/conf/zoo.cfg
+
+function start {
+  # Run Zookeeper with our configuration
+  echo "Starting Zookeeper"
+  cp $ZK_CONF $ZKDIR/conf
+  $ZK_DIR/bin/zkServer.sh start
+}
+
+function stop {
+  # Kill the existing processes
+  pids=`jps -l | grep org.apache.zookeeper.server | awk '{print $1}'`
+  for p in ${pids}; do
+    if [ x$p != "x" ]; then
+      kill -KILL $p
+      echo "Killed existing prosess (pid: $p)"
+    fi
+  done
+}
+function status {
+  $ZK_DIR/bin/zkServer.sh status $ZK_CONF
+}
+
+case "$1" in
+  start)
+    start 
+    ;;
+  stop)
+    stop
+    ;;
+  status)
+    status
+    ;;
+  restart)
+    stop
+    start
+    ;;
+  *)
+    echo "Usage: $0 {start|stop|restart|status}"
+    exit 1
+esac
diff --git a/web/config.json.dev.1node b/web/config.json.dev.1node
new file mode 100644
index 0000000..580a136
--- /dev/null
+++ b/web/config.json.dev.1node
@@ -0,0 +1,26 @@
+{
+    "LB": false, 
+    "TESTBED": "sw",
+    "ONOS_DEFAULT_HOST": "localhost",
+    "ONOS_GUI3_CONTROL_HOST": "http://localhost:9000", 
+    "ONOS_GUI3_HOST": "http://localhost:9000", 
+    "cluster_basename": "onosdev", 
+    "controllers": [
+        "onosdev1", 
+        "onosdev1", 
+        "onosdev1",
+        "onosdev1", 
+        "onosdev1", 
+        "onosdev1", 
+        "onosdev1", 
+        "onosdev1"
+    ], 
+    "core_switches": [
+        "00:00:00:00:00:00:01:01", 
+        "00:00:00:00:00:00:01:02", 
+        "00:00:00:00:00:00:01:03", 
+        "00:00:00:00:00:00:01:04", 
+        "00:00:00:00:00:00:01:05", 
+        "00:00:00:00:00:00:01:06"
+    ]
+}
diff --git a/web/onos-topology.html b/web/onos-topology.html
index 72e9fc4..d72c0e1 100644
--- a/web/onos-topology.html
+++ b/web/onos-topology.html
@@ -52,8 +52,8 @@
 <div id="topology"></div>
 <script type="text/javascript" src="js/controller-status.js"></script>
 <script type="text/javascript">
-controller_status("http://gui3.onlab.us:8081/controller_status");
-gui("http://gui3.onlab.us:8081/topology");
+controller_status("controller_status");
+gui("topology"); 
 </script>
 </svg>
 </body>
diff --git a/web/ons-demo/data/controllers.json.dev b/web/ons-demo/data/controllers.json.dev
index 4abcf5a..b936d96 100644
--- a/web/ons-demo/data/controllers.json.dev
+++ b/web/ons-demo/data/controllers.json.dev
@@ -1,10 +1,10 @@
 [
-	"onosdevb1",
-	"onosdevb2",
-	"onosdevb3",
-	"onosdevb4",
-	"onosdevb5",
-	"onosdevb6",
-	"onosdevb7",
-	"onosdevb8"
-]
\ No newline at end of file
+	"onosdev1",
+	"onosdev2",
+	"onosdev3",
+	"onosdev4",
+	"onosdev5",
+	"onosdev6",
+	"onosdev7",
+	"onosdev8"
+]
diff --git a/web/ons-demo/js/constants.js b/web/ons-demo/js/constants.js
index 51b3aa6..236d79a 100644
--- a/web/ons-demo/js/constants.js
+++ b/web/ons-demo/js/constants.js
@@ -2,7 +2,8 @@
 timeout used by controller functions. after the timeout expires the "pending" action
 is removed and the topology view is whatever is reported by the API
 ***************************************************************************************************/
-var pendingTimeout = 30000;
+/* var pendingTimeout = 30000; */
+var pendingTimeout = 60000;
 
 /***************************************************************************************************
 CSS names for the pallette of colors used by the topology view
@@ -27,4 +28,4 @@
 	edge: 6,
 	aggregation: 16,
 	core: 20
-}
\ No newline at end of file
+}
diff --git a/web/topology_rest.py b/web/topology_rest.py
index 6c2ea15..53f46bc 100755
--- a/web/topology_rest.py
+++ b/web/topology_rest.py
@@ -13,9 +13,9 @@
 
 from flask import Flask, json, Response, render_template, make_response, request
 
-
 CONFIG_FILE=os.getenv("HOME") + "/ONOS/web/config.json"
 LINK_FILE=os.getenv("HOME") + "/ONOS/web/link.json"
+ONOSDIR=os.getenv("HOME") + "/ONOS"
 
 ## Global Var for ON.Lab local REST ##
 RestIP="localhost"
@@ -373,7 +373,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   topo = {}
   switches = []
@@ -439,7 +440,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   for v in parsedResult:
     link = {}
@@ -479,7 +481,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   topo = {}
   switches = []
@@ -526,7 +529,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   for v in parsedResult:
     link = {}
@@ -565,7 +569,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
 #  print command
 #  print result
@@ -594,7 +599,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   devices = []
   for v in parsedResult:
@@ -656,7 +662,8 @@
   except:
     log_error("REST IF has issue: %s" % command)
     log_error("%s" % result)
-    sys.exit(0)
+    return
+#    sys.exit(0)
 
   debug("query_links %s" % command)
 #  pp.pprint(parsedResult)
@@ -672,7 +679,8 @@
     except:
       log_error("REST IF has issue: %s" % command)
       log_error("%s" % result)
-      sys.exit(0)
+      return
+#      sys.exit(0)
 
     for p in linkResults:
       if p.has_key('type') and p['type'] == "port":
@@ -697,14 +705,14 @@
 @app.route("/controller_status")
 def controller_status():
 #  onos_check="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh status | awk '{print $1}'"
-  onos_check="cd; onos status %s | grep %s | awk '{print $2}'"
+  onos_check="cd; onos status | grep %s | awk '{print $2}'"
   #cassandra_check="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-cassandra.sh status"
 
   cont_status=[]
   for i in controllers:
     status={}
     onos=os.popen(onos_check % i).read()[:-1]
-    onos=os.popen(onos_check % (i, i.lower())).read()[:-1]
+#    onos=os.popen(onos_check % (i, i.lower())).read()[:-1]
     status["name"]=i
     status["onos"]=onos
     status["cassandra"]=0
@@ -724,8 +732,11 @@
 #    stop_onos="/home/admin/bin/onos stop %s > /tmp/debug " % (controller_name[-1:])
 #    print "Debug: Controller command %s called %s" % (cmd, controller_name)
   else:
-    start_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh start" % (controller_name)
-    stop_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh stop" % (controller_name)
+    # No longer use -i to specify keys (use .ssh/config to specify it)
+    start_onos="ssh %s ONOS/start-onos.sh start" % (controller_name)
+    stop_onos="ssh %s ONOS/start-onos.sh stop" % (controller_name)
+#    start_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh start" % (controller_name)
+#    stop_onos="ssh -i ~/.ssh/onlabkey.pem %s ONOS/start-onos.sh stop" % (controller_name)
 
   if cmd == "up":
     result=os.popen(start_onos).read()
@@ -743,8 +754,8 @@
     result=""
     if (TESTBED == "sw"):
       for i in range(1, len(controllers)):
-        cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./ctrl-local.sh'" % (controllers[i])
-        result += os.popen(cmd_string).read()
+          cmd_string="ssh %s 'cd ONOS/scripts; ./ctrl-local.sh'" % (controllers[i])
+          result += os.popen(cmd_string).read()
     else:
       cmd_string="cd; switch local > /tmp/watch"
       result += os.popen(cmd_string).read()
@@ -753,7 +764,8 @@
     result=""
     if (TESTBED == "sw"):
       for i in range(1, len(controllers)):
-        cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./ctrl-add-ext.sh'" % (controllers[i])
+        cmd_string="ssh %s 'cd ONOS/scripts; ./ctrl-add-ext.sh'" % (controllers[i])
+#        cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./ctrl-add-ext.sh'" % (controllers[i])
         print "cmd is: "+cmd_string
         result += os.popen(cmd_string).read()
     else:
@@ -789,7 +801,8 @@
   r = re.compile(':')
   dpid = re.sub(r, '', dpid)
   host=controllers[0]
-  cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./switch.sh %s %s'" % (host, dpid, cmd)
+  cmd_string="ssh %s 'cd ONOS/scripts; ./switch.sh %s %s'" % (host, dpid, cmd)
+#  cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./switch.sh %s %s'" % (host, dpid, cmd)
   get_status="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./switch.sh %s'" % (host, dpid)
   print "cmd_string"
 
@@ -829,7 +842,8 @@
     else:
       (port, dontcare) = get_link_ports(dpid, src_dpid)
 
-    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+#    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
+    cmd_string="ssh %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, dpid, port, cmd)
     print cmd_string
     res=os.popen(cmd_string).read()
     result = result + ' ' + res
@@ -936,7 +950,7 @@
     host = controllers[hostid-1]
 
   if (TESTBED == "sw"):
-    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, src_dpid, src_port, cmd)
+    cmd_string="ssh %s 'cd ONOS/scripts; ./link.sh %s %s %s'" % (host, src_dpid, src_port, cmd)
   else:
     if ( src_dpid == "00:00:00:08:a2:08:f9:01" ):
       cmd_string="~/ONOS/scripts/link-hw.sh %s %s %s " % ( dst_dpid, dst_port, cmd)
@@ -957,11 +971,17 @@
   url ="%s/wm/flow/getsummary/%s/%s/json" % (host, 0, 0)
   (code, result) = get_json(url)
   parsedResult = json.loads(result)
-  flow_nr = int(parsedResult[-1]['flowId'], 16)
+  if len(parsedResult) > 0:
+    if parsedResult[-1].has_key('flowId'):
+      flow_nr = int(parsedResult[-1]['flowId'], 16)
+  else:
+    flow_nr = -1  # first flow
+    print "first flow"
+
   flow_nr += 1
-  command =  "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
+  command =  "%s/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (ONOSDIR, flow_nr, "dummy", src_dpid, src_port, dst_dpid, dst_port, srcMAC, dstMAC)
   flow_nr += 1
-  command1 = "/home/ubuntu/ONOS/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (flow_nr, "dummy", dst_dpid, dst_port, src_dpid, src_port, dstMAC, srcMAC)
+  command1 = "%s/web/add_flow.py -m onos %d %s %s %s %s %s matchSrcMac %s matchDstMac %s" % (ONOSDIR, flow_nr, "dummy", dst_dpid, dst_port, src_dpid, src_port, dstMAC, srcMAC)
   print "add flow: %s, %s" % (command, command1)
   errcode = os.popen(command).read()
   errcode1 = os.popen(command1).read()
@@ -973,7 +993,7 @@
 #http://localhost:9000/gui/delflow/<flow_id>
 @app.route("/gui/delflow/<flow_id>")
 def del_flow(flow_id):
-  command = "/home/ubuntu/ONOS/web/delete_flow.py %s" % (flow_id)
+  command = "%/web/delete_flow.py %s" % (ONOSDIR, flow_id)
   print command
   errcode = os.popen(command).read()
   return errcode
@@ -1027,7 +1047,7 @@
   if TESTBED == "hw":
     cmd_string="dsh -w %s 'cd ONOS/scripts; " % dst_host
   else:
-    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts; " % dst_host
+    cmd_string="ssh %s 'cd ONOS/scripts; " % dst_host
   cmd_string += "./runiperf.sh %d %s %s %s:%s %s/%s/%s/%s'" % (flowId, src_dpid, dst_dpid, TESTBED, "svr", protocol, duration, interval, samples)
   print cmd_string
   os.popen(cmd_string)
@@ -1035,7 +1055,7 @@
   if TESTBED == "hw":
     cmd_string="dsh -w %s 'cd ONOS/scripts; " % src_host
   else:
-    cmd_string="ssh -i ~/.ssh/onlabkey.pem %s 'cd ONOS/scripts;" % src_host
+    cmd_string="ssh %s 'cd ONOS/scripts;" % src_host
   cmd_string+="./runiperf.sh %d %s %s %s:%s %s/%s/%s/%s'" % (flowId, src_dpid, dst_dpid, TESTBED, "client", protocol, duration, interval, samples)
   print cmd_string
   os.popen(cmd_string)